GenAI Speech Recognition API

W interfejsie GenAI Speech Recognition API w ML Kit możesz transkrybować treści audio na tekst. Ten interfejs API obsługuje te tryby:

  • Zaawansowany: interfejs Speech Recognition API korzysta z modelu generatywnej AI, który zapewnia szerszą obsługę języków i lepszą ogólną jakość. Nie musisz pobierać osobnego pakietu językowego dla każdego języka, co pozwala zaoszczędzić miejsce na dane.
  • Podstawowy: interfejs Speech Recognition API używa tradycyjnego modelu rozpoznawania mowy na urządzeniu, podobnego do interfejsu SpeechRecognizer API.

Interfejs Speech Recognition API transkrybuje treści audio na tekst w tym samym języku. Aby transkrybować dźwięk na tekst w innym języku, użyj Speech Translation API.

Najważniejsze funkcje

  • Przechwytuje strumieniowe dane wejściowe z mikrofonu lub pliku audio.
  • Transkrybuje cały nagrany wcześniej plik za pomocą metod AudioSource.fromFile() lub AudioSource.fromUri(). Więcej informacji znajdziesz w artykule Wymagania dotyczące wejścia audio.
  • W przypadku danych wejściowych przesyłanych strumieniowo podaje dokładny czas rozpoczęcia każdego rozpoznanego słowa, aby ułatwić synchronizację animacji interfejsu, generowanie napisów lub wyróżnianie słów w trakcie ich wypowiadania. Czas rozpoczęcia (w milisekundach) każdego rozpoznanego słowa jest przesunięciem względem początku zdarzenia, czyli sygnatury czasowej 0.
  • Transkrybowany tekst jest dostarczany jako ciągły strumień, który początkowo może być częściowy (i może ulec zmianie), zanim stanie się ostatecznym rozpoznanym tekstem.

Przykładowe wyniki

Audio Tryb Język Transkrypcja
audio_2 Zaawansowane es-ES "Este es un mensaje corto."
audio_1 Podstawowe en-US „To jest krótka wiadomość”

Porównanie z interfejsem Speech Recognition API platformy

Interfejs ML Kit Speech Recognition API obejmuje podstawowe funkcje interfejsu API SpeechRecognizer platformy w trybie podstawowym. Główną zaletą ML Kit jest to, że nie jest on powiązany z konkretną wersją platformy.

Ponadto interfejs Speech Recognition API w ML Kit obsługuje rozpoznawanie mowy za pomocą modelu Gemini na urządzeniu w trybie zaawansowanym, co zapewnia obsługę większej liczby języków.

Rozpocznij

Dodaj interfejs ML Kit Speech Recognition API jako zależność w konfiguracji build.gradle:

implementation("com.google.mlkit:genai-speech-recognition:1.0.0-alpha1")

Aby zintegrować interfejs Speech Recognition API z aplikacją, utwórz klienta SpeechRecognizer. Sprawdź stan funkcji niezbędnego modelu na urządzeniu i pobierz model, jeśli nie ma go jeszcze na urządzeniu. Po przygotowaniu danych wejściowych audio w SpeechRecognizerRequest uruchom wnioskowanie za pomocą klienta, aby otrzymywać dane wyjściowe strumieniowania z przepływu Kotlin. Na koniec pamiętaj o zamknięciu klienta, aby zwolnić zasoby.

// 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()
}

Wymagania dotyczące wejścia audio

Interfejs GenAI Speech Recognition API obsługuje dane wejściowe z mikrofonu lub niestandardowego źródła za pomocą deskryptora pliku.

Jeśli używasz AudioSource.fromPfd(parcelFileDescriptor), wejściowy plik audio musi spełniać te rygorystyczne wymagania:

  • Format: nieprzetworzony, 16-bitowy PCM bez nagłówka.
  • Kanały: mono (1 kanał).
  • Częstotliwość próbkowania: 16 kHz.

W większości przypadków zalecamy używanie AudioSource.fromMic(), ponieważ automatycznie obsługuje te ograniczenia.

Obsługiwane formaty wejściowe audio

Interfejs Speech Recognition API obsługuje te formaty wejściowe audio:

  • Pliki MP3, WAV, FLAC, M4A i OGG są automatycznie dekodowane na urządzeniu.
  • Nieprzetworzony dźwięk bez nagłówka (.raw lub .pcm) musi być w formacie 16-bitowym PCM, 16 kHz, mono.

Jeśli format jest nieprawidłowy lub nieobsługiwany, po rozpoczęciu rozpoznawania zwracana jest wartość ErrorResponse.

Implementowanie interfejsu Speech Recognition API

Oto jak używać interfejsu Speech Recognition API do transkrypcji dźwięku i korzystania z sygnatur czasowych słów.

Transkrypcja dźwięku

Interfejs Speech Recognition API obsługuje dane wejściowe audio z mikrofonu urządzenia, nagranych wcześniej plików lub niestandardowych potoków za pomocą obiektu ParcelFileDescriptor.

Aby przygotować dane audio, utwórz obiekt AudioSource, korzystając z jednej z metod fabrycznych wymienionych w tej tabeli:

Metoda Tryb „tylko dźwięk” Zalecany przypadek użycia
AudioSource.fromMic() STREAMING Przechwytywanie danych głosowych od użytkownika na żywo.

Wymaga uprawnienia RECORD_AUDIO.
AudioSource.fromFile(file)

AudioSource.fromUri(context, uri)
ONE_SHOT transkrybować nagrane wcześniej pliki audio, Automatycznie dekoduje standardowe formaty plików bezpośrednio na urządzeniu.
AudioSource.fromPfd(pfd, mode)

AudioSource.fromPfd(pfd, mode, audioFormat)
STREAMING lub ONE_SHOT niestandardowe potoki audio (np. dane audio przetwarzane w innym miejscu w aplikacji).

Stała AudioSource.Mode określa, jak interfejs API przetwarza przychodzący dźwięk:

  • Stała AudioSource.Mode.STREAMING konfiguruje moduł rozpoznawania mowy tak, aby zwracał częściowe i końcowe wyniki transkrypcji w sposób ciągły w miarę napływania danych audio. Gdy podajesz niestandardowy obiekt ParcelFileDescriptor, musisz zapisywać dane w strumieniu w czasie rzeczywistym (około 32 000 bajtów na sekundę w przypadku standardowego 16-bitowego dźwięku PCM mono 16 kHz). Zbyt szybkie zapisywanie danych może spowodować przepełnienie bufora.
  • Stała AudioSource.Mode.ONE_SHOT konfiguruje moduł rozpoznawania tak, aby przed przeprowadzeniem wnioskowania i dostarczeniem ostatecznej transkrypcji czekał na przesłanie całego źródła dźwięku. Dane audio możesz zapisywać tak szybko, jak to możliwe, ale musisz zamknąć koniec zapisu deskryptora pliku, aby zasygnalizować koniec pliku. Ostateczny wynik transkrypcji nie zostanie dostarczony, dopóki nie zostanie odebrany sygnał końca pliku.

W tym przykładzie transkrybowany jest nagrany wcześniej plik audio:

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()
    }
}

Używanie synchronizacji słów

Możesz poprosić o czas rozpoczęcia każdego rozpoznanego słowa, ustawiając parametr enableWordTiming na true w bloku konfiguracji recognitionOptions żądania.

Gdy włączone jest określanie czasu słów, każdy obiekt SpeechRecognizerResponse.FinalTextResponse zawiera właściwość wordTimings z listą obiektów SpeechRecognizerResponse.WordTiming. Każdy obiekt zawiera rozpoznany ciąg słów (text) i jego przesunięcie w milisekundach (timestampMs) od początku sesji rozpoznawania mowy. Gdy synchronizacja słów jest wyłączona (ustawienie domyślne), lista wordTimings jest zwracana jako pusta.

Poniższy przykładowy kod pokazuje, jak skonfigurować i włączyć synchronizację słów:

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
            }
        }
    }
}

Obsługiwane języki

Tryb Ustawienia regionalne
Zaawansowane 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)
Podstawowe 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)

Obsługiwane urządzenia

Tryb Obsługiwane urządzenia
Podstawowe urządzenia z Androidem korzystające z interfejsu API na poziomie 31 lub wyższym;
Zaawansowane

Urządzenia z serii Pixel 10 i Pixel 11 oraz urządzenia z Gemini Nano z tymi chipsetami (m.in. Samsung Galaxy S26, Z Flip8 i Z Fold8):

  • Qualcomm Snapdragon: SM8750, SM8845, SM8850, SM8950, SM8975
  • MediaTek Dimensity: MT6991, MT6993, MT6995
  • Samsung Exynos: Exynos 2600

Typowe problemy z konfiguracją

Interfejsy ML Kit GenAI API korzystają z aplikacji Android AICore, aby uzyskać dostęp do Gemini Nano. Gdy urządzenie jest dopiero konfigurowane (w tym resetowane) lub aplikacja AICore jest dopiero resetowana (np. wyczyszczone dane, odinstalowana i ponownie zainstalowana), aplikacja AICore może nie mieć wystarczająco dużo czasu na zakończenie inicjowania (w tym pobranie najnowszych konfiguracji z serwera). W związku z tym interfejsy ML Kit GenAI API mogą nie działać zgodnie z oczekiwaniami. Oto typowe komunikaty o błędach konfiguracji, które mogą się pojawić, oraz sposoby ich rozwiązywania:

Przykładowy komunikat o błędzie Jak odpowiedzieć
Wystąpił błąd AICore typu 4-CONNECTION_ERROR z kodem błędu 601-BINDING_FAILURE: nie udało się powiązać usługi AICore. Może się tak zdarzyć, gdy zainstalujesz aplikację za pomocą interfejsów API ML Kit GenAI natychmiast po skonfigurowaniu urządzenia lub gdy AICore zostanie odinstalowany po zainstalowaniu aplikacji. Problem powinien zostać rozwiązany po zaktualizowaniu aplikacji AICore i ponownym zainstalowaniu aplikacji.
AICore: błąd typu 3-PREPARATION_ERROR i kod błędu 606-FEATURE_NOT_FOUND: funkcja … jest niedostępna. Może się tak zdarzyć, gdy AICore nie zakończy pobierania najnowszych konfiguracji. Gdy urządzenie jest połączone z internetem, aktualizacja trwa zwykle od kilku minut do kilku godzin. Ponowne uruchomienie urządzenia może przyspieszyć aktualizację.

Pamiętaj, że jeśli program rozruchowy urządzenia jest odblokowany, również zobaczysz ten błąd – ten interfejs API nie obsługuje urządzeń z odblokowanymi programami rozruchowymi.
Błąd AICore typu 1-DOWNLOAD_ERROR i kod błędu 0-UNKNOWN: funkcja … nie powiodła się ze stanem błędu 0 i błędem esz: UNAVAILABLE: nie można rozpoznać hosta … Utrzymaj połączenie sieciowe, poczekaj kilka minut i spróbuj ponownie.

Przykładowy kod

  • Przykładowy kod interfejsu ML Kit Speech Recognition API znajdziesz na GitHub.