API GenAI Text-to-Speech

Com a API GenAI Text to Speech do Kit de ML, é possível sintetizar conteúdo de texto em áudio de fala. A API Text-to-Speech usa um modelo de IA generativa para fornecer síntese de voz de alta qualidade.

Recomendamos usar a API Text-to-Speech do Kit de ML sempre que possível, porque ela oferece vozes muito semelhantes às humanas. No entanto, se ela não estiver disponível, use a API TextToSpeech da plataforma Android.

Principais recursos

  • Opções unificadas de download e inferência em um único SDK.
  • API que prioriza o Kotlin e usa corrotinas e fluxo para transmitir o status de reprodução e o áudio.

Pré-requisitos

Para usar a API Text-to-Speech, você precisa atender aos seguintes requisitos:

  • Você tem um dos seguintes dispositivos compatíveis:
    • Google: Pixel 8, Pixel 9, Pixel 10, Pixel 11
    • Samsung: Galaxy S25, Galaxy S26, Galaxy Z Fold8, Galaxy Z Fold8 Ultra, Galaxy Z Flip8
  • Você tem a versão mais recente do app Reconhecimento/Síntese de voz (com.google.android.tts) do Google Play. Se o app estiver ausente ou desatualizado, ao implementar a conversão de texto em voz, o método checkStatus() vai retornar FeatureStatus.UNAVAILABLE.
  • Seu projeto usa uma versão mínima do SDK (minSdk) de 26 ou mais recente.

Primeiros passos

Para começar, adicione a dependência da Conversão de Texto em Voz do Kit de ML ao arquivo build.gradle.kts (ou build.gradle) no nível do 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'
}

Integrar a API Text-to-Speech

Para usar a API Text-to-Speech, siga estas etapas:

  1. Inicialize o cliente: crie uma instância de cliente SpeechSynthesizer transmitindo um objeto de configuração SpeechSynthesizerOptions. Você só precisa de uma única instância de cliente para oferecer suporte a todos os idiomas. A localidade especificada no objeto de opções determina apenas a lista de idiomas padrão retornada pelo método getSupportedVoices().
  2. Baixe o modelo: verifique a disponibilidade da voz de destino. Se o status for FeatureStatus.DOWNLOADABLE, chame o método download() para fazer o download do modelo de voz no dispositivo.
  3. Sintetize o conteúdo: crie um objeto SpeechSynthesizerRequest que contenha o texto de entrada e a voz de destino. Chame o método synthesize() para gerar o áudio e coletar as atualizações de status da reprodução e os blocos de áudio.
// 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()

Vozes compatíveis

A API Text-to-Speech do Kit de ML é compatível com as seguintes vozes. Selecione uma voz pelo nome usando a propriedade VoiceInfo.name.

  • star02: feminina, tom médio
  • star04: voz masculina, tom médio-alto
  • star05: masculino, tom grave
  • star08: feminina, tom grave
  • star11: voz masculina, tom médio, jovem
  • star12: feminina, tom médio-agudo
  • star13: masculina, tom médio
  • star16: feminina, tom médio-baixo

Idiomas compatíveis

A API Text-to-Speech do Kit de ML é compatível com as seguintes localidades:

  • Árabe (ar-XA)
  • Dinamarquês (da-DK)
  • Alemão (de-DE)
  • Inglês (en-GB)
  • Inglês americano (en-US)
  • Espanhol (es-ES)
  • Espanhol (es-US)
  • Francês (fr-CA)
  • Francês (fr-FR)
  • Hindi (hi-IN)
  • Indonésio (id-ID)
  • Italiano (it-IT)
  • Japonês (ja-JP)
  • Coreano (ko-KR)
  • Norueguês (nb-NO)
  • Holandês (nl-NL)
  • Polonês (pl-PL)
  • Português (pt-BR)
  • Russo (ru-RU)
  • Sueco (sv-SE)
  • Turco (tr-TR)

Problemas comuns de configuração

Confira alguns problemas comuns e dicas de solução de problemas:

Problema Possível motivo Correção recomendada
A lista de vozes (do método getSupportedVoices()) está vazia. O dispositivo não é compatível ou o app Reconhecimento e Síntese de Voz está ausente ou desatualizado. Verifique se o dispositivo é compatível e atualize o app Reconhecimento/Síntese de voz.
O método checkStatus() retorna FeatureStatus.UNAVAILABLE. O dispositivo não é compatível ou o app Reconhecimento e Síntese de Voz está ausente ou desatualizado. Verifique se o dispositivo é compatível e atualize o app Reconhecimento e Síntese de Voz.
O método checkStatus() retorna FeatureStatus.DOWNLOADABLE. A voz ainda não foi baixada no dispositivo. Chame o método download() e aguarde a conclusão dele antes de chamar o método synthesize().
O download falha ou não avança. Sem conexão de rede. Tente de novo quando o dispositivo estiver on-line.