API de Text-to-Speech de IA generativa

Con la API de Text-to-Speech de IA generativa de ML Kit, puedes sintetizar contenido de texto en audio de voz. La API de Text-to-Speech usa un modelo de IA generativa para proporcionar una síntesis de voz de alta calidad.

Te recomendamos que uses la API de Text to Speech del ML Kit cuando sea posible, ya que proporciona voces muy similares a las humanas, pero, si no está disponible, puedes usar la API de TextToSpeech de la plataforma de Android.

Funciones clave

  • Opciones unificadas de descarga y de inferencia en un solo SDK
  • Es una API que prioriza Kotlin y usa corrutinas y Flow para transmitir el estado de reproducción y el audio.

Requisitos previos

Para usar la API de Text-to-Speech, debes cumplir con los siguientes requisitos:

  • Tienes uno de los siguientes dispositivos compatibles:
    • Google: Pixel 8, Pixel 9, Pixel 10 y Pixel 11
    • Samsung: Galaxy S25, Galaxy S26, Galaxy Z Fold8, Galaxy Z Fold8 Ultra, Galaxy Z Flip8
  • Tienes la versión más reciente de la app de Reconocimiento y síntesis de voz (com.google.android.tts) de Google Play. Si falta la app o está desactualizada, cuando se implementa la función de texto a voz, el método checkStatus() devuelve FeatureStatus.UNAVAILABLE.
  • Tu proyecto usa una versión mínima del SDK (minSdk) de 26 o posterior.

Comenzar

Para comenzar, agrega la dependencia de texto a voz del ML Kit al archivo build.gradle.kts (o build.gradle) a nivel del módulo:

Kotlin

dependencies {
    // ML Kit GenAI TTS SDK
    implementation("com.google.mlkit:genai-text-to-speech:1.0.0-alpha1")
}

Groovy

dependencies {
    // ML Kit GenAI TTS SDK
    implementation 'com.google.mlkit:genai-text-to-speech:1.0.0-alpha1'
}

Integra la API de Text-to-Speech

Para usar la API de Text-to-Speech, sigue estos pasos:

  1. Inicializa el cliente: Crea una instancia de cliente SpeechSynthesizer pasando un objeto de configuración SpeechSynthesizerOptions. Solo necesitas una instancia de cliente para admitir todos los idiomas. La configuración regional especificada en tu objeto de opciones solo determina la lista de idiomas predeterminada que devuelve el método getSupportedVoices().
  2. Descarga el modelo: Verifica la disponibilidad de tu voz de destino. Si el estado es FeatureStatus.DOWNLOADABLE, llama al método download() para descargar el modelo de voz en el dispositivo.
  3. Sintetiza el contenido: Construye un objeto SpeechSynthesizerRequest que contenga el texto de entrada y la voz de destino. Llama al método synthesize() para generar el audio y recopilar las actualizaciones del estado de reproducción y los fragmentos de audio.
// Initialize the `SpeechSynthesizer` client.
// One client serves every language. `Locale.US` is only the default list locale.
val options = speechSynthesizerOptions(Locale.US)
val client = SpeechSynthesis.getClient(options)

// Query voices for multiple languages using the same client instance.
val englishVoice = client.getSupportedVoices().first() // Uses the default `Locale.US`
val frenchVoice = client.getSupportedVoices(Locale.FRANCE).first()

// Check and download a voice model (for example, the French voice model).
if (client.checkStatus(frenchVoice) == FeatureStatus.DOWNLOADABLE) {
    client.download(frenchVoice).collect { status -> println("Download status: $status") }
}

// Construct the request.
// The `VoiceInfo` instance, `frenchVoice` here, determines the spoken language.
val request = SpeechSynthesizerRequest(
    input = SpeechSynthesizerRequest.Input.Text("Bonjour tout le monde", frenchVoice),
    audioAttributes = AudioAttributes.Builder()
        .setUsage(AudioAttributes.USAGE_MEDIA)
        .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
        .build()
)

// Speak and collect streaming audio or status.
client.synthesize(request).collect { response ->
    when (response) {
        is SpeechSynthesizerResponse.StatusUpdate -> println("Playback status: ${response.status}")
        is SpeechSynthesizerResponse.AudioAvailable -> println("Audio chunk: ${response.audio.size} bytes")
        is SpeechSynthesizerResponse.Error -> println("Error: ${response.errorCode}")
    }
}

// Release resources when done.
client.close()

Voces admitidas

La API de texto a voz del ML Kit admite las siguientes voces. Selecciona una voz por nombre con la propiedad VoiceInfo.name.

  • star02: femenina, tono medio
  • star04: masculino, tono medio-alto
  • star05: masculino, tono grave
  • star08: mujer, tono grave
  • star11: masculino, tono medio, voz más joven
  • star12: mujer, tono medio-alto
  • star13: masculino, tono medio
  • star16: mujer, tono medio bajo

Idiomas admitidos

La API de texto a voz del ML Kit admite las siguientes configuraciones regionales:

  • Árabe (ar-XA)
  • Danés (da-DK)
  • Alemán (de-DE)
  • Inglés (en-GB)
  • Inglés (en-US)
  • Español (es-ES)
  • Español (es-US)
  • Francés (fr-CA)
  • Francés (fr-FR)
  • Hindi (hi-IN)
  • Indonesio (id-ID)
  • Italiano (it-IT)
  • Japonés (ja-JP)
  • Coreano (ko-KR)
  • Noruego (nb-NO)
  • Neerlandés (nl-NL)
  • (pl-PL)
  • Portugués (pt-BR)
  • Ruso (ru-RU)
  • Sueco (sv-SE)
  • Turco (tr-TR)

Problemas comunes de configuración

Estos son algunos problemas comunes y sugerencias para solucionarlos:

Problema Posible motivo Solución recomendada
La lista de voces (del método getSupportedVoices()) está vacía. El dispositivo no es compatible, o bien la app de Análisis y síntesis de voz no está disponible o está desactualizada. Verifica que tu dispositivo sea compatible y actualiza la app de Análisis y síntesis de voz.
El método checkStatus() devuelve FeatureStatus.UNAVAILABLE. El dispositivo no es compatible, o bien la app de Análisis y síntesis de voz no está disponible o está desactualizada. Verifica que tu dispositivo sea compatible y actualiza la app de Análisis y síntesis de voz.
El método checkStatus() devuelve FeatureStatus.DOWNLOADABLE. La voz aún no se descargó en el dispositivo. Llama al método download() y espera a que finalice antes de llamar al método synthesize().
La descarga falla o no avanza. No hay conexión de red Vuelve a intentarlo cuando el dispositivo esté en línea.