Mit der GenAI Speech Recognition API von ML Kit können Sie Audioinhalte in Text transkribieren. Diese API unterstützt die folgenden Modi:
- Erweitert: Die Speech Recognition API verwendet das GenAI-Modell, das eine breitere Sprachabdeckung und eine bessere Gesamtqualität bietet. Sie müssen nicht für jede Sprache ein separates Sprachpaket herunterladen, was Speicherplatz spart.
- Basic: Die Speech Recognition API verwendet das herkömmliche On-Device-Spracherkennungsmodell, ähnlich wie die SpeechRecognizer API.
Die Speech Recognition API transkribiert Audioinhalte in Text in derselben Sprache. Wenn Sie Audio in Text in einer anderen Sprache transkribieren möchten, verwenden Sie die Speech Translation API.
Hauptmerkmale
- Erfasst Streaming-Eingaben vom Mikrofon oder einer Audiodatei.
- Transkribiert eine gesamte vorab aufgezeichnete Datei mit den Methoden
AudioSource.fromFile()oderAudioSource.fromUri(). Weitere Informationen finden Sie unter Anforderungen an die Audioeingabe. - Bei Streaming-Eingaben wird die genaue Startzeit jedes erkannten Wortes angegeben, damit Sie UI-Animationen synchronisieren, Untertitel generieren oder Wörter hervorheben können, während sie gesprochen werden. Die Startzeit (in Millisekunden) jedes erkannten Wortes ist ein Versatz vom Beginn des Ereignisses, d. h. Zeitstempel 0.
- Der transkribierte Text wird als kontinuierlicher Stream bereitgestellt, der anfangs möglicherweise unvollständig ist (und sich ändern kann), bevor er zum endgültigen erkannten Text wird.
Beispielergebnisse
| Audio | Modus | Sprache | Transkription |
|---|---|---|---|
| audio_2 | Erweitert | es-ES | „Este es un mensaje corto.“ |
| audio_1 | Einfach | en-US | „Das ist eine kurze Nachricht“ |
Vergleich mit der Speech Recognition API der Plattform
Die ML Kit Speech Recognition API deckt die grundlegenden Funktionen der Plattform-API SpeechRecognizer im Basic-Modus ab. Ein wesentlicher Vorteil von ML Kit ist, dass es nicht an eine bestimmte Plattformversion gebunden ist.
Außerdem unterstützt die ML Kit Speech Recognition API die Spracherkennung mit dem Gemini-Modell auf dem Gerät, wenn der erweiterte Modus verwendet wird. Dadurch wird die Sprachabdeckung erweitert.
Jetzt starten
Fügen Sie die ML Kit Speech Recognition API als Abhängigkeit in Ihrer build.gradle-Konfiguration hinzu:
implementation("com.google.mlkit:genai-speech-recognition:1.0.0-alpha1")
Wenn Sie die Speech Recognition API in Ihre Anwendung einbinden möchten, erstellen Sie einen SpeechRecognizer-Client. Prüfen Sie den Status der erforderlichen On-Device-Modellfunktionen und laden Sie das Modell herunter, falls es noch nicht auf dem Gerät vorhanden ist. Nachdem Sie Ihre Audioeingabe in einem SpeechRecognizerRequest vorbereitet haben, führen Sie die Inferenz mit dem Client aus, um die Streamingausgabe vom Kotlin-Flow zu erhalten. Denken Sie daran, den Client zu schließen, um Ressourcen freizugeben.
// 1. Create a SpeechRecognizer with desired options.
val options: SpeechRecognizerOptions =
speechRecognizerOptions {
locale = Locale.US
preferredMode = SpeechRecognizerOptions.Mode.MODE_ADVANCED
}
val speechRecognizer: SpeechRecognizer = SpeechRecognition.getClient(options)
// 2. Check if the recognition model is available or needs downloading.
launch {
val status: Int = speechRecognizer.checkStatus()
if (status == FeatureStatus.DOWNLOADABLE) {
// 3. If needed, download the model and monitor progress.
speechRecognizer.download.collect { downloadStatus ->
when (downloadStatus) {
is DownloadStatus.DownloadCompleted -> {
// Model is ready, start recognition.
startMyRecognition(speechRecognizer)
}
is DownloadStatus.DownloadFailed -> {
// Handle download failure (e.g., inform the user).
}
is DownloadStatus.DownloadProgress -> {
// Handle download progress (e.g., update a progress bar).
}
}
}
} else if (status == FeatureStatus.AVAILABLE) {
// Model is already ready, start recognition immediately.
startMyRecognition(speechRecognizer)
} else {
// Handle other statuses (e.g., DOWNLOADING, UNAVAILABLE).
}
}
// 4. Define your recognition logic using a suspend function.
suspend fun startMyRecognition(recognizer: SpeechRecognizer) {
// Create a request (e.g., specifying audio source).
val request: SpeechRecognizerRequest
= speechRecognizerRequest { audioSource = AudioSource.fromMic() }
// Start recognition and process the continuous stream of responses.
recognizer.startRecognition(request).collect {
// Process the SpeechRecognitionResponse data here.
}
}
// 5. Stop recognition and clean up resources when the session is complete.
launch {
recognizer.stopRecognition()
recognizer.close()
}
Anforderungen an die Audioeingabe
Die GenAI Speech Recognition API unterstützt Eingaben über das Mikrofon oder eine benutzerdefinierte Quelle über einen Dateideskriptor.
Wenn Sie AudioSource.fromPfd(parcelFileDescriptor) verwenden, muss die Audioeingabe die folgenden strengen Anforderungen erfüllen:
- Format: Rohdaten, 16-Bit-PCM ohne Header.
- Kanäle: Mono (einzelner Kanal).
- Abtastrate: 16 kHz.
Für die meisten Anwendungsfälle wird AudioSource.fromMic() empfohlen, da diese Einschränkungen automatisch berücksichtigt werden.
Unterstützte Audioeingabeformate
Die Speech Recognition API unterstützt die folgenden Audioeingabeformate:
- MP3-, WAV-, FLAC-, M4A- und OGG-Dateien werden automatisch auf dem Gerät decodiert.
- Unkomprimierte Audiodaten ohne Header (
.rawoder.pcm) müssen im 16-Bit-PCM-Format mit 16 kHz und Mono vorliegen.
Wenn das Format ungültig ist oder nicht unterstützt wird, wird beim Start der Erkennung der Wert ErrorResponse zurückgegeben.
Speech Recognition API implementieren
Hier erfahren Sie, wie Sie die Speech Recognition API verwenden, um Audio zu transkribieren und das Wort-Timing zu nutzen.
Audio transkribieren
Die Speech Recognition API unterstützt Audioeingaben über das Gerätemikrofon, vorab aufgezeichnete Dateien oder benutzerdefinierte Pipelines mit einem ParcelFileDescriptor-Objekt.
Erstellen Sie zum Vorbereiten Ihrer Audiodaten ein AudioSource-Objekt mit einer der in der folgenden Tabelle aufgeführten Factory-Methoden:
| Methode | Audiomodus | Empfohlener Anwendungsfall |
|---|---|---|
AudioSource.fromMic() |
STREAMING |
Live-Spracheingabe des Nutzers erfassen. Erfordert die Berechtigung RECORD_AUDIO.
|
AudioSource.fromFile(file)AudioSource.fromUri(context, uri)
|
ONE_SHOT |
Vorab aufgenommene Audiodateien transkribieren Decodiert Standarddateiformate automatisch direkt auf dem Gerät. |
AudioSource.fromPfd(pfd, mode)AudioSource.fromPfd(pfd, mode, audioFormat)
|
STREAMING oder ONE_SHOT |
Benutzerdefinierte Audiopipelines (z. B. Audiodaten, die an anderer Stelle in Ihrer App verarbeitet werden) |
Die Konstante AudioSource.Mode steuert, wie die API die eingehenden Audiodaten verarbeitet:
- Die Konstante
AudioSource.Mode.STREAMINGkonfiguriert die Erkennung so, dass sie kontinuierlich Teil- und Endergebnisse der Transkription zurückgibt, sobald die Audiodaten eintreffen. Wenn Sie ein benutzerdefiniertesParcelFileDescriptor-Objekt bereitstellen, müssen Sie Daten in Echtzeit in den Stream schreiben (ca. 32.000 Byte pro Sekunde für Standard-PCM-Audio mit 16 kHz, 16 Bit, Mono). Wenn Daten zu schnell geschrieben werden, kann der Zwischenspeicher überlaufen. - Mit der Konstante
AudioSource.Mode.ONE_SHOTwird die Erkennung so konfiguriert, dass sie auf die Übertragung der gesamten Audioquelle wartet, bevor die Inferenz durchgeführt und die endgültige Transkription geliefert wird. Sie können die Audiodaten so schnell wie möglich schreiben, müssen aber das Schreibende des Dateideskriptors schließen, um das Dateiende zu signalisieren. Das endgültige Transkriptionsergebnis wird erst geliefert, wenn dieses Signal für das Dateiende empfangen wurde.
Im folgenden Beispiel wird eine vorab aufgenommene Audiodatei transkribiert:
suspend fun recognizeFromFile(recognizer: SpeechRecognizer, audioFile: File) {
val audioSource = AudioSource.fromFile(audioFile)
val request = speechRecognizerRequest { this.audioSource = audioSource }
try {
recognizer.startRecognition(request).collect { response ->
when (response) {
is SpeechRecognizerResponse.FinalTextResponse -> {
// Process the transcription of the whole file.
}
is SpeechRecognizerResponse.ErrorResponse -> {
// Handle the error, for example an unsupported audio format.
}
else -> {}
}
}
} finally {
audioSource.close()
}
}
Wort-Timing verwenden
Sie können die Startzeit jedes erkannten Wortes anfordern, indem Sie den Parameter enableWordTiming im Konfigurationsblock recognitionOptions Ihrer Anfrage auf true setzen.
Wenn das Wort-Timing aktiviert ist, enthält jedes SpeechRecognizerResponse.FinalTextResponse-Objekt ein wordTimings-Attribut mit einer Liste von SpeechRecognizerResponse.WordTiming-Objekten. Jedes Objekt enthält den erkannten Wortstring (text) und den Millisekunden-Offset (timestampMs) ab dem Beginn der Spracherkennungssitzung. Wenn das Wort-Timing deaktiviert ist (Standardeinstellung), wird die Liste wordTimings leer zurückgegeben.
Das folgende Codebeispiel zeigt, wie Sie das Wort-Timing konfigurieren und aktivieren:
suspend fun recognizeWithWordTiming(recognizer: SpeechRecognizer) {
val request = speechRecognizerRequest {
audioSource = AudioSource.fromMic()
recognitionOptions { enableWordTiming = true }
}
recognizer.startRecognition(request).collect { response ->
if (response is SpeechRecognizerResponse.FinalTextResponse) {
for (wordTiming in response.wordTimings) {
val word: String = wordTiming.text
val timestamp: Long = wordTiming.timestampMs
}
}
}
}
Unterstützte Sprachen
| Modus | Sprachen |
| Erweitert | ar-SA (Beta), cmn-Hans-CN, cmn-Hant-TW, da-DK (Beta), de-DE, en-US, es-ES, fr-FR, hi-IN (Beta), id-ID (Beta), it-IT, ja-JP, ko-KR, nl-NL (Beta), pl-PL (Beta), pt-PT, ru-RU, sv-SE (Beta), th-TH, tr-TR (Beta), vi-VN (Beta) |
| Einfach | cmn-Hans-CN (Beta), cmn-Hant-TW (Beta), de-DE (Beta), en-US, es-ES (Beta), fr-FR (Beta), hi-IN (Beta), it-IT (Beta), ja-JP (Beta), ko-KR (Beta), pl-PL (Beta), pt-BR (Beta), ru-RU (Beta), tr-TR (Beta), vi-VN (Beta) |
Unterstützte Geräte
| Modus | Unterstützte Geräte |
| Einfach | Android-Geräte mit API-Level 31 und höher. |
| Erweitert |
Pixel 10- und Pixel 11-Serie sowie Geräte mit Gemini Nano auf den folgenden Chipsätzen (unter anderem Samsung Galaxy S26-, Z Flip8- und Z Fold8-Serie):
|
Häufig auftretende Probleme bei der Einrichtung
Die GenAI APIs des ML Kit greifen über die Android AICore-App auf Gemini Nano zu. Wenn ein Gerät gerade erst eingerichtet (oder zurückgesetzt) wurde oder die AICore App gerade zurückgesetzt wurde (z.B. durch Löschen von Daten, Deinstallieren und Neuinstallieren), hat die AICore App möglicherweise nicht genügend Zeit, um die Initialisierung abzuschließen (einschließlich des Herunterladens der neuesten Konfigurationen vom Server). Daher funktionieren die ML Kit GenAI APIs möglicherweise nicht wie erwartet. Hier sind die häufigsten Fehlermeldungen bei der Einrichtung und wie du sie beheben kannst:
| Beispiel für Fehlermeldung | Vorgehensweise |
| AICore ist mit dem Fehlertyp 4-CONNECTION_ERROR und dem Fehlercode 601-BINDING_FAILURE fehlgeschlagen: Der AICore-Dienst konnte nicht gebunden werden. | Das kann passieren, wenn Sie die App mit ML Kit GenAI APIs direkt nach der Geräteeinrichtung installieren oder wenn AICore nach der Installation Ihrer App deinstalliert wird. Das Problem sollte behoben sein, wenn du die AICore App aktualisierst und deine App dann neu installierst. |
| AICore ist mit dem Fehlertyp 3-PREPARATION_ERROR und dem Fehlercode 606-FEATURE_NOT_FOUND fehlgeschlagen: Die Funktion ... ist nicht verfügbar. |
Das kann passieren, wenn AICore die neuesten Konfigurationen noch nicht heruntergeladen hat. Wenn das Gerät mit dem Internet verbunden ist, dauert die Aktualisierung in der Regel einige Minuten bis einige Stunden. Ein Neustart des Geräts kann das Update beschleunigen.
Wenn der Bootloader des Geräts entsperrt ist, wird dieser Fehler ebenfalls angezeigt. Diese API unterstützt keine Geräte mit entsperrten Bootloadern. |
| AICore ist mit dem Fehlertyp 1-DOWNLOAD_ERROR und dem Fehlercode 0-UNKNOWN fehlgeschlagen: Die Funktion ... ist mit dem Fehlerstatus 0 und dem Fehler esz: UNAVAILABLE: Unable to resolve host ... fehlgeschlagen. | Behalte die Netzwerkverbindung bei, warte einige Minuten und versuche es dann noch einmal. |
Beispielcode
- Codebeispiel für die ML Kit Speech Recognition API auf GitHub ansehen