API de GenAI Speech Recognition

En la API de reconocimiento de voz de IA generativa de ML Kit, puedes transcribir contenido de audio a texto. Esta API admite los siguientes modos:

  • Avanzado: La API de Speech Recognition usa el modelo de IA generativa, que produce una cobertura de idiomas más amplia y una mejor calidad general. No es necesario que descargues un paquete de idioma independiente para cada idioma, lo que ahorra espacio de almacenamiento.
  • Básico: La API de reconocimiento de voz usa el modelo tradicional de reconocimiento de voz integrado en el dispositivo, similar a la API de SpeechRecognizer.

La API de Speech Recognition transcribe contenido de audio a texto en el mismo idioma. Para transcribir audio a texto en un idioma diferente, usa la API de Speech Translation.

Funciones clave

  • Captura la entrada de transmisión del micrófono o de un archivo de audio.
  • Transcribe un archivo pregrabado completo con los métodos AudioSource.fromFile() o AudioSource.fromUri(). Para obtener más información, consulta los requisitos de entrada de audio.
  • En el caso de las entradas de transmisión, proporciona la hora de inicio exacta de cada palabra reconocida para ayudarte a sincronizar las animaciones de la IU, generar subtítulos o destacar las palabras a medida que se pronuncian. La hora de inicio (en milisegundos) de cada palabra reconocida es una compensación desde el inicio del evento, que es la marca de tiempo 0.
  • El texto transcrito se proporciona como un flujo continuo, que puede ser parcial al principio (y estar sujeto a cambios) antes de convertirse en el texto reconocido final.

Resultados de ejemplo

Audio Modo Configuración regional Transcripción
audio_2 Avanzado es-ES "Este es un mensaje corto".
audio_1 Básico en-US "Este es un mensaje corto"

Comparación con la API de Speech Recognition de la plataforma

La API de reconocimiento de voz de ML Kit abarca la funcionalidad básica de la API de SpeechRecognizer de la plataforma cuando se usa el modo básico. Una ventaja clave de ML Kit es que no está vinculado a una versión específica de la plataforma.

Además, la API de reconocimiento de voz de ML Kit admite el reconocimiento de voz con el modelo de Gemini integrado en el dispositivo cuando se usa el modo avanzado, lo que proporciona una cobertura de idiomas extendida.

Comenzar

Agrega la API de reconocimiento de voz del ML Kit como una dependencia en tu configuración de build.gradle:

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

Para integrar la API de Speech Recognition en tu app, crea un cliente de SpeechRecognizer. Verifica el estado de las funciones necesarias del modelo integrado en el dispositivo y descárgalo si aún no está en el dispositivo. Después de preparar la entrada de audio en un SpeechRecognizerRequest, ejecuta la inferencia con el cliente para recibir el resultado de la transmisión del flujo de Kotlin. Por último, recuerda cerrar el cliente para liberar recursos.

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

Requisitos de entrada de audio

La API de GenAI Speech Recognition admite la entrada desde el micrófono o una fuente personalizada a través de un descriptor de archivo.

Si usas AudioSource.fromPfd(parcelFileDescriptor), el audio de entrada debe cumplir con los siguientes requisitos estrictos:

  • Formato: PCM de 16 bits sin procesar y sin encabezado.
  • Canales: Mono (canal único)
  • Tasa de muestreo: 16 kHz

En la mayoría de los casos de uso, se recomienda AudioSource.fromMic(), ya que controla estas restricciones automáticamente.

Formatos de entrada de audio compatibles

La API de reconocimiento de voz admite los siguientes formatos de entrada de audio:

  • Los archivos MP3, WAV, FLAC, M4A y OGG se decodifican automáticamente en el dispositivo.
  • El audio sin procesar y sin encabezado (.raw o .pcm) debe estar en formato PCM de 16 bits, 16 kHz y mono.

Si el formato no es válido o no es compatible, se devuelve un valor ErrorResponse cuando se inicia el reconocimiento.

Implementa la API de Speech Recognition

Aquí se explica cómo usar la API de Speech Recognition para transcribir audio y usar la sincronización de palabras.

Transcribe audio

La API de Speech Recognition admite la entrada de audio desde el micrófono del dispositivo, los archivos pregrabados o las canalizaciones personalizadas con un objeto ParcelFileDescriptor.

Para preparar tus datos de audio, construye un objeto AudioSource con uno de los métodos de fábrica que se indican en la siguiente tabla:

Método Modo de audio Caso de uso recomendado
AudioSource.fromMic() STREAMING Capturar la entrada de voz en vivo del usuario

Requiere el permiso RECORD_AUDIO.
AudioSource.fromFile(file)

AudioSource.fromUri(context, uri)
ONE_SHOT Transcribir archivos de audio pregrabados Decodifica automáticamente los formatos de archivo estándar directamente en el dispositivo.
AudioSource.fromPfd(pfd, mode)

AudioSource.fromPfd(pfd, mode, audioFormat)
STREAMING o ONE_SHOT Canalizaciones de audio personalizadas (como datos de audio procesados en otra parte de tu app)

La constante AudioSource.Mode controla cómo la API procesa el audio entrante:

  • La constante AudioSource.Mode.STREAMING configura el reconocedor para que devuelva resultados de transcripción parciales y finales de forma continua a medida que llegan los datos de audio. Cuando proporcionas un objeto ParcelFileDescriptor personalizado, debes escribir datos en la transmisión a un ritmo en tiempo real (aproximadamente 32,000 bytes por segundo para audio PCM mono estándar de 16 kHz y 16 bits). Escribir datos demasiado rápido puede desbordar el búfer.
  • La constante AudioSource.Mode.ONE_SHOT configura el reconocedor para que espere a que se transfiera toda la fuente de audio antes de realizar la inferencia y entregar la transcripción final. Puedes escribir los datos de audio lo más rápido posible, pero debes cerrar el extremo de escritura del descriptor de archivo para indicar el final del archivo. El resultado final de la transcripción no se entrega hasta que se recibe este indicador de fin de archivo.

En el siguiente ejemplo, se transcribe un archivo de audio pregrabado:

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

Usa la sincronización de palabras

Puedes solicitar la hora de inicio de cada palabra reconocida configurando el parámetro enableWordTiming como true en el bloque de configuración recognitionOptions de tu solicitud.

Cuando se habilita la sincronización de palabras, cada objeto SpeechRecognizerResponse.FinalTextResponse incluye una propiedad wordTimings que contiene una lista de objetos SpeechRecognizerResponse.WordTiming. Cada objeto proporciona la cadena de palabras reconocida (text) y su compensación en milisegundos (timestampMs) desde el comienzo de la sesión de reconocimiento de voz. Cuando se inhabilita la sincronización de palabras (la configuración predeterminada), la lista wordTimings se devuelve vacía.

En el siguiente ejemplo de código, se muestra cómo configurar y habilitar la sincronización de palabras:

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

Idiomas admitidos

Modo Configuración regional
Avanzado 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)
Básico 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)

Dispositivos compatibles

Modo Dispositivos compatibles
Básico Dispositivos Android que usan el nivel de API 31 y versiones posteriores
Avanzado

Series Pixel 10 y Pixel 11, además de dispositivos con Gemini Nano en los siguientes chipsets (incluidas las series Samsung Galaxy S26, Z Flip8 y Z Fold8, entre otras):

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

Problemas comunes de configuración

Las APIs de IA generativa de ML Kit dependen de la app de AICore de Android para acceder a Gemini Nano. Cuando un dispositivo se acaba de configurar (incluido el restablecimiento) o la app de AICore se acaba de restablecer (p.ej., se borraron los datos, se desinstaló y se reinstaló), es posible que la app de AICore no tenga suficiente tiempo para finalizar la inicialización (incluida la descarga de las configuraciones más recientes del servidor). Como resultado, es posible que las APIs de IA generativa de ML Kit no funcionen como se espera. Estos son los mensajes de error de configuración comunes que podrías ver y cómo solucionarlos:

Ejemplo de mensaje de error Cómo manejar esta situación
AICore falló con el tipo de error 4-CONNECTION_ERROR y el código de error 601-BINDING_FAILURE: No se pudo vincular el servicio de AICore. Esto puede suceder cuando instalas la app con las APIs de IA generativa de ML Kit inmediatamente después de configurar el dispositivo o cuando se desinstala AICore después de instalar la app. Actualizar la app de AICore y, luego, reinstalar tu app debería solucionar el problema.
AICore falló con el tipo de error 3-PREPARATION_ERROR y el código de error 606-FEATURE_NOT_FOUND: La función ... no está disponible. Esto puede suceder cuando AICore no terminó de descargar los parámetros de configuración más recientes. Cuando el dispositivo está conectado a Internet, suele tardar entre unos minutos y unas horas en actualizarse. Reiniciar el dispositivo puede acelerar la actualización.

Ten en cuenta que, si el bootloader del dispositivo está desbloqueado, también verás este error, ya que esta API no admite dispositivos con bootloaders desbloqueados.
AICore falló con el tipo de error 1-DOWNLOAD_ERROR y el código de error 0-UNKNOWN: La función ... falló con el estado de error 0 y el error esz: UNAVAILABLE: No se puede resolver el host ... Mantén la conexión de red, espera unos minutos y vuelve a intentarlo.

Código de muestra

  • Explora la muestra de código de la API de reconocimiento de voz del ML Kit en GitHub