With ML Kit's GenAI Text to Speech API, you can synthesize text content to speech audio. The Text to Speech API uses a generative AI model to provide high-quality speech synthesis.
We recommend using the ML Kit Text to Speech API when possible since it
provides very human-like voices, but if it's not available you can use the
Android platform
TextToSpeech API
instead.
Key capabilities
- Unified downloading and inference options within a single SDK.
- Kotlin-first API that uses coroutines and Flow to stream playback status and audio.
Prerequisites
To use the Text to Speech API, you must meet the following requirements:
- You have one of the following supported devices:
- Google: Pixel 8, Pixel 9, Pixel 10, Pixel 11
- Samsung: Galaxy S25, Galaxy S26, Galaxy Z Fold8, Galaxy Z Fold8 Ultra, Galaxy Z Flip8
- You have the latest version of the
Speech Recognition & Synthesis app
(
com.google.android.tts) from Google Play. If the app is missing or out of date, when implementing text to speech thecheckStatus()method returnsFeatureStatus.UNAVAILABLE. - Your project uses a minimum SDK (
minSdk) version of 26 or higher.
Get started
To get started, add the ML Kit Text to Speech dependency to your module-level
build.gradle.kts (or build.gradle) file:
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'
}
Integrate the Text to Speech API
To use the Text to Speech API, go through these steps:
- Initialize the client: Create a
SpeechSynthesizerclient instance by passing aSpeechSynthesizerOptionsconfiguration object. You only need a single client instance to support all languages. The locale specified in your options object just determines the default language list returned by thegetSupportedVoices()method. - Download the model: Check the availability of your target voice. If the
status is
FeatureStatus.DOWNLOADABLE, call thedownload()method to download the voice model to the device. - Synthesize the content: Construct a
SpeechSynthesizerRequestobject containing your input text and the target voice. Call thesynthesize()method to generate the audio, and collect the playback status updates and audio chunks.
// 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()
Supported voices
The ML Kit Text to Speech API supports the following voices. Select a voice by
name using the VoiceInfo.name property.
- star02: female, medium pitch
- star04: male, medium-high pitch
- star05: male, low pitch
- star08: female, low pitch
- star11: male, medium pitch, younger-sounding
- star12: female, medium-high pitch
- star13: male, medium pitch
- star16: female, medium-low pitch
Supported languages
The ML Kit Text to Speech API supports the following locales:
- Arabic (ar-XA)
- Danish (da-DK)
- German (de-DE)
- English (en-GB)
- English (en-US)
- Spanish (es-ES)
- Spanish (es-US)
- French (fr-CA)
- French (fr-FR)
- Hindi (hi-IN)
- Indonesian (id-ID)
- Italian (it-IT)
- Japanese (ja-JP)
- Korean (ko-KR)
- Norwegian (nb-NO)
- Dutch (nl-NL)
- Polish (pl-PL)
- Portuguese (pt-BR)
- Russian (ru-RU)
- Swedish (sv-SE)
- Turkish (tr-TR)
Common setup issues
Here are some common issues and troubleshooting tips:
| Issue | Possible reason | Recommended fix |
|---|---|---|
The voice list (from the getSupportedVoices() method) is empty. |
The device isn't supported, or the Speech Recognition & Synthesis app is missing or out of date. | Check that your device is supported and update the Speech Recognition & Synthesis app. |
The checkStatus() method returns FeatureStatus.UNAVAILABLE. |
The device isn't supported, or the Speech Recognition & Synthesis app is missing or out of date. | Check that your device is supported and update the Speech Recognition & Synthesis app. |
The checkStatus() method returns FeatureStatus.DOWNLOADABLE. |
The voice isn't downloaded to the device yet. | Call the download() method and wait for it to finish before calling the synthesize() method. |
| The download fails or doesn't progress. | No network connection. | Retry when the device is online. |