API GenAI Text to Speech

Con l'API GenAI Text to Speech di ML Kit, puoi sintetizzare i contenuti di testo in audio vocale. L'API Text-to-Speech utilizza un modello di AI generativa per fornire una sintesi vocale di alta qualità.

Ti consigliamo di utilizzare l'API Text-to-Speech di ML Kit, se possibile, poiché fornisce voci molto simili a quelle umane, ma se non è disponibile puoi utilizzare l'API TextToSpeech della piattaforma Android.

Funzionalità chiave

  • Opzioni di download e inferenza unificate all'interno di un unico SDK.
  • API Kotlin-first che utilizza coroutine e Flow per riprodurre in streaming lo stato di riproduzione e l'audio.

Prerequisiti

Per utilizzare l'API Text-to-Speech, devi soddisfare i seguenti requisiti:

  • Possiedi uno dei seguenti dispositivi supportati:
    • Google: Pixel 8, Pixel 9, Pixel 10, Pixel 11
    • Samsung: Galaxy S25, Galaxy S26, Galaxy Z Fold8, Galaxy Z Fold8 Ultra, Galaxy Z Flip8
  • Disponi dell'ultima versione dell'app Riconoscimento/Sintesi vocale (com.google.android.tts) di Google Play. Se l'app non è presente o non è aggiornata, quando implementi la funzionalità da testo a voce, il metodo checkStatus() restituisce FeatureStatus.UNAVAILABLE.
  • Il tuo progetto utilizza una versione dell'SDK minimo (minSdk) pari o superiore a 26.

Inizia

Per iniziare, aggiungi la dipendenza di ML Kit Text to Speech al file build.gradle.kts (o build.gradle) a livello di modulo:

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 l'API Text-to-Speech

Per utilizzare l'API Text-to-Speech, segui questi passaggi:

  1. Inizializza il client: crea un'istanza client SpeechSynthesizer passando un oggetto di configurazione SpeechSynthesizerOptions. Per supportare tutte le lingue, è sufficiente una singola istanza client. Le impostazioni internazionali specificate nell'oggetto options determinano solo l'elenco delle lingue predefinito restituito dal metodo getSupportedVoices().
  2. Scarica il modello: verifica la disponibilità della voce target. Se lo stato è FeatureStatus.DOWNLOADABLE, chiama il metodo download() per scaricare il modello vocale sul dispositivo.
  3. Sintetizza i contenuti: crea un oggetto SpeechSynthesizerRequest contenente il testo di input e la voce di destinazione. Chiama il metodo synthesize() per generare l'audio e raccogli gli aggiornamenti dello stato della riproduzione e i blocchi 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()

Voci supportate

L'API ML Kit Text to Speech supporta le seguenti voci. Seleziona una voce per nome utilizzando la proprietà VoiceInfo.name.

  • star02: voce femminile, tonalità media
  • star04: voce maschile, tono medio-alto
  • star05: voce maschile, tono basso
  • star08: voce femminile, tono basso
  • star11: voce maschile, tonalità media, suono più giovane
  • star12: donna, tono medio-alto
  • star13: voce maschile, tonalità media
  • star16: voce femminile, tono medio-basso

Lingue supportate

L'API Text to Speech di ML Kit supporta le seguenti impostazioni internazionali:

  • Arabo (ar-XA)
  • Danese (da-DK)
  • Tedesco (de-DE)
  • Inglese (en-GB)
  • Inglese (en-US)
  • Spagnolo (es-ES)
  • Spagnolo (es-US)
  • Francese (fr-CA)
  • Francese (fr-FR)
  • Hindi (hi-IN)
  • Indonesiano (id-ID)
  • Italiano (it-IT)
  • Giapponese (ja-JP)
  • Coreano (ko-KR)
  • Norvegese (nb-NO)
  • Olandese (nl-NL)
  • Polacco (pl-PL)
  • Portoghese (pt-BR)
  • Russo (ru-RU)
  • Svedese (sv-SE)
  • Turco (tr-TR)

Problemi di configurazione comuni

Di seguito sono riportati alcuni problemi comuni e suggerimenti per la risoluzione:

Problema Possibile motivo Correzione consigliata
L'elenco delle voci (dal metodo getSupportedVoices()) è vuoto. Il dispositivo non è supportato oppure l'app Riconoscimento e sintesi vocali non è presente o non è aggiornata. Verifica che il tuo dispositivo sia supportato e aggiorna l'app Riconoscimento/Sintesi vocale.
Il metodo checkStatus() restituisce FeatureStatus.UNAVAILABLE. Il dispositivo non è supportato oppure l'app Riconoscimento e sintesi vocali non è presente o non è aggiornata. Verifica che il tuo dispositivo sia supportato e aggiorna l'app Riconoscimento/Sintesi vocale.
Il metodo checkStatus() restituisce FeatureStatus.DOWNLOADABLE. La voce non è ancora stata scaricata sul dispositivo. Chiama il metodo download() e attendi che venga completato prima di chiamare il metodo synthesize().
Il download non riesce o non procede. Nessuna connessione di rete. Riprova quando il dispositivo è online.