O Gemini-TTS é a mais recente evolução da nossa tecnologia Cloud TTS que vai além da voz com som natural e oferece um controlo detalhado sobre o áudio gerado através de comandos baseados em texto. Com o Gemini-TTS, pode sintetizar a fala de um ou vários oradores a partir de pequenos fragmentos até narrativas longas, ditando com precisão o estilo, o sotaque, o ritmo, o tom e até a expressão emocional, tudo controlável através de comandos de linguagem natural.
Modelos disponíveis
O Gemini-TTS inclui os seguintes modelos disponíveis:
Gemini 2.5 Flash TTS
| ID do modelo | gemini-2.5-flash-tts |
|---|---|
| Otimizado para | Geração de áudio de TTS na nuvem de baixa latência, controlável, com um ou vários altifalantes para aplicações diárias económicas |
| Modalidades de entrada e saída |
|
| Suporte de número de altifalante | Único, com vários oradores |
| Formatos de áudio de saída suportados |
|
| Apoio técnico da região | global |
| Opções de voz | Consulte as opções de voz. |
| Idiomas disponíveis | Consulte os idiomas disponíveis. |
| Exemplo |
model: "gemini-2.5-flash-tts"
prompt: "Say the following"
text: "[extremely fast] Availability and terms may vary.
Check our website or your local store for complete
details and restrictions."
speaker: "Kore"
|
Gemini 2.5 Flash Lite TTS (pré-visualização)
| ID do modelo | gemini-2.5-flash-lite-preview-tts |
|---|---|
| Otimizado para | Geração de áudio de TTS na nuvem de baixa latência, controlável e com um único orador para aplicações diárias rentáveis. Tenha em atenção que este modelo está em pré-visualização. |
| Modalidades de entrada e saída |
|
| Suporte de número de altifalante | Único |
| Formatos de áudio de saída suportados |
|
| Apoio técnico da região | global |
| Opções de voz | Consulte as opções de voz. |
| Idiomas disponíveis | Consulte os idiomas disponíveis. |
| Exemplo |
model: "gemini-2.5-flash-lite-preview-tts"
prompt: "Say the following in an elated way"
text: "Congratulations on the recent achievements!"
speaker: "Aoede"
|
Gemini 2.5 Pro TTS
| ID do modelo | gemini-2.5-pro-tts |
|---|---|
| Otimizado para | Controlo elevado para fluxos de trabalho estruturados, como geração de podcasts, livros áudio, apoio ao cliente e muito mais |
| Modalidades de entrada e saída |
|
| Suporte de número de altifalante | Único, com vários oradores |
| Formatos de áudio de saída suportados |
|
| Apoio técnico da região | global |
| Opções de voz | Consulte as opções de voz. |
| Idiomas disponíveis | Consulte os idiomas disponíveis. |
| Exemplo |
model: "gemini-2.5-pro-tts"
prompt: "You are having a casual conversation with a friend.
Say the following in a friendly and amused way."
text: "hahah I did NOT expect that. Can you believe it!."
speaker: "Callirrhoe"
|
Controlos adicionais
Os controlos e as capacidades adicionais incluem o seguinte:
Conversa natural: as interações de voz de qualidade notável, a expressividade mais adequada e os padrões de ritmo são fornecidos com uma latência muito baixa para que possa conversar de forma fluida.
Controlo de estilo: através de comandos de linguagem natural, pode adaptar a entrega na conversa, direcionando-a para adotar sotaques específicos e produzir uma variedade de tons e expressões, incluindo um sussurro.
Desempenho dinâmico: estes modelos podem dar vida ao texto para leituras expressivas de poesia, noticiários e histórias cativantes. Também pode atuar com emoções específicas e produzir sotaques quando solicitado.
Controlo melhorado do ritmo e da pronúncia: controlar a velocidade de entrega ajuda a garantir uma maior precisão na pronúncia, incluindo palavras específicas.
Para obter informações sobre como usar estas vozes na sua aplicação, consulte o artigo Use o Gemini-TTS.
Opções de voz
O Gemini-TTS oferece uma vasta gama de opções de voz semelhantes às nossas vozes HD do Chirp 3 existentes, cada uma com características distintas:
| Nome | Género | Demonstrações |
|---|---|---|
| Achernar | Feminino | |
| Achird | Masculino | |
| Algenib | Masculino | |
| Algieba | Masculino | |
| Alnilam | Masculino | |
| Aoede | Feminino | |
| Autonoe | Feminino | |
| Callirrhoe | Feminino | |
| Caronte | Masculino | |
| Despina | Feminino | |
| Encélado | Masculino | |
| Erinome | Feminino | |
| Fenrir | Masculino | |
| Gacrux | Feminino | |
| Jápeto | Masculino | |
| Kore | Feminino | |
| Laomedeia | Feminino | |
| Leda | Feminino | |
| Orus | Masculino | |
| Pulcherrima | Feminino | |
| Disco | Masculino | |
| Rasalgethi | Masculino | |
| Sadachbia | Masculino | |
| Sadaltager | Masculino | |
| Schedar | Masculino | |
| Sulafat | Feminino | |
| Umbriel | Masculino | |
| Vindemiatrix | Feminino | |
| Zephyr | Feminino | |
| Zubenelgenubi | Masculino |
Idiomas disponíveis
O Gemini-TTS é compatível com os seguintes idiomas:
| Idioma | Código BCP-47 | Prontidão para o lançamento |
|---|---|---|
| Árabe (Egito) | ar-EG | DG |
| Bengali (Bangladexe) | bn-BD | DG |
| Neerlandês (Países Baixos) | nl-NL | DG |
| Inglês (Índia) | en-IN | DG |
| Inglês (Estados Unidos) | en-US | DG |
| Francês (França) | fr-FR | DG |
| Alemão (Alemanha) | de-DE | DG |
| Hindi (Índia) | hi-IN | DG |
| Indonésio (Indonesia) | id-ID | DG |
| Italiano (Itália) | it-IT | DG |
| Japonês (Japão) | ja-JP | DG |
| Coreano (Coreia do Sul) | ko-KR | DG |
| Marati (Índia) | mr-IN | DG |
| Polaco (Polónia) | pl-PL | DG |
| Português (Brasil) | pt-BR | DG |
| Romeno (Roménia) | ro-RO | DG |
| Russo (Rússia) | ru-RU | DG |
| Espanhol (Espanha) | es-ES | DG |
| Tâmil (Índia) | ta-IN | DG |
| Telugu (Índia) | te-IN | DG |
| Tailandês (Tailândia) | th-TH | DG |
| Turco (Turquia) | tr-TR | DG |
| Ucraniano (Ucrânia) | uk-UA | DG |
| Vietnamita (Vietname) | vi-VN | DG |
| Africânder (África do Sul) | af-ZA | Pré-visualização |
| Albanês (Albânia) | sq-AL | Pré-visualização |
| Amárico (Etiópia) | am-ET | Pré-visualização |
| Árabe (mundial) | ar-001 | Pré-visualização |
| Arménio (Arménia) | hy-AM | Pré-visualização |
| Azerbaijano (Azerbaijão) | az-AZ | Pré-visualização |
| Basco (Espanha) | eu-ES | Pré-visualização |
| Bielorrusso (Bielorrússia) | be-BY | Pré-visualização |
| Búlgaro (Bulgária) | bg-BG | Pré-visualização |
| Birmanês (Mianmar) | my-MM | Pré-visualização |
| Catalão (Espanha) | ca-ES | Pré-visualização |
| Cebuano (Filipinas) | ceb-PH | Pré-visualização |
| Chinês, mandarim (China) | cmn-CN | Pré-visualização |
| Chinês, mandarim (Taiwan) | cmn-tw | Pré-visualização |
| Croata (Croácia) | hr-HR | Pré-visualização |
| Checo (Chéquia) | cs-CZ | Pré-visualização |
| Dinamarquês (Dinamarca) | da-DK | Pré-visualização |
| Inglês (Austrália) | en-AU | Pré-visualização |
| Inglês (Reino Unido) | en-GB | Pré-visualização |
| Estónio (Estónia) | et-EE | Pré-visualização |
| Filipino (Filipinas) | fil-PH | Pré-visualização |
| Finlandês (Finlândia) | fi-FI | Pré-visualização |
| Francês (Canadá) | fr-CA | Pré-visualização |
| Galego (Espanha) | gl-ES | Pré-visualização |
| Georgiano (Geórgia) | ka-GE | Pré-visualização |
| Grego (Grécia) | el-GR | Pré-visualização |
| Guzerate (Índia) | gu-IN | Pré-visualização |
| Crioulo haitiano (Haiti) | ht-HT | Pré-visualização |
| Hebraico (Israel) | he-IL | Pré-visualização |
| Húngaro (Hungria) | hu-HU | Pré-visualização |
| Islandês (Islândia) | is-IS | Pré-visualização |
| Javanês (Java) | jv-JV | Pré-visualização |
| Canarim (Índia) | kn-IN | Pré-visualização |
| Concani (Índia) | kok-IN | Pré-visualização |
| Laosiano (Laos) | lo-LA | Pré-visualização |
| Latim (Cidade do Vaticano) | la-VA | Pré-visualização |
| Letão (Letónia) | lv-LV | Pré-visualização |
| Lituano (Lituânia) | lt-LT | Pré-visualização |
| Luxemburguês (Luxemburgo) | lb-LU | Pré-visualização |
| Macedónio (Macedónia do Norte) | mk-MK | Pré-visualização |
| Maithili (Índia) | mai-IN | Pré-visualização |
| Malgaxe (Madagáscar) | mg-MG | Pré-visualização |
| Malaio (Malásia) | ms-MY | Pré-visualização |
| Malaiala (Índia) | ml-IN | Pré-visualização |
| Mongol (Mongólia) | mn-MN | Pré-visualização |
| Nepalês (Nepal) | ne-NP | Pré-visualização |
| Norueguês, bokmål (Noruega) | nb-NO | Pré-visualização |
| Norueguês (Nynorsk) (Noruega) | nn-NO | Pré-visualização |
| Oriá (Índia) | or-IN | Pré-visualização |
| Pastó (Afeganistão) | ps-AF | Pré-visualização |
| Persa (Irão) | fa-IR | Pré-visualização |
| Português (Portugal) | pt-PT | Pré-visualização |
| Punjabi (Índia) | pa-IN | Pré-visualização |
| Sérvio (Sérvia) | sr-RS | Pré-visualização |
| Sindi (Índia) | sd-IN | Pré-visualização |
| Cingalês (Sri Lanca) | si-LK | Pré-visualização |
| Eslovaco (Eslováquia) | sk-SK | Pré-visualização |
| Esloveno (Eslovénia) | sl-SI | Pré-visualização |
| Espanhol (América Latina) | es-419 | Pré-visualização |
| Espanhol (México) | es-MX | Pré-visualização |
| Suaíli (Quénia) | sw-KE | Pré-visualização |
| Sueco (Suécia) | sv-SE | Pré-visualização |
| Urdu (Paquistão) | ur-PK | Pré-visualização |
Use o Gemini-TTS
Descubra como usar os modelos Gemini-TTS para sintetizar a fala de um único orador e de vários oradores.
Opcionalmente, especifique os formatos de áudio e as taxas de amostragem no campo "audioConfig" se forem necessárias opções não predefinidas.
| Descrição | Limite | Tipo |
|---|---|---|
| Campo de texto | Inferior ou igual a 4000 bytes. | Entrada |
| Campo de comando | Inferior ou igual a 4000 bytes. | Entrada |
| Campos de texto e de comando | Inferior ou igual a 8000 bytes. | Entrada |
| Duração do áudio de saída | Aproximadamente 655 segundos. Se o texto de entrada fizer com que o áudio exceda os 655 segundos, o áudio é truncado. | Resultado |
Antes de começar
Antes de poder começar a usar o Cloud Text-to-Speech, tem de ativar a API na Google Cloud consola seguindo os passos:
- Ative o Cloud Text-to-Speech num projeto.
- Certifique-se de que a faturação está ativada para o Cloud Text-to-Speech.
- Configure a autenticação para o seu ambiente de desenvolvimento.
Configure o seu Google Cloud projeto
Aceda à página do seletor de projetos
Pode escolher um projeto existente ou criar um novo. Para mais detalhes sobre como criar um projeto, consulte a Google Cloud documentação.
Se criar um novo projeto, é apresentada uma mensagem a informar que tem de associar uma conta de faturação. Se estiver a usar um projeto pré-existente, certifique-se de que ativa a faturação
Saiba como confirmar que a faturação está ativada para o seu projeto
Depois de selecionar um projeto e associá-lo a uma conta de faturação, pode ativar a API Cloud Text-to-Speech. Aceda à barra Pesquisar produtos e recursos na parte superior da página e escreva "voz". Selecione a Cloud Text-to-Speech API na lista de resultados.
Para experimentar o Cloud Text-to-Speech sem o associar ao seu projeto, escolha a opção Experimentar esta API. Para ativar a API Cloud Text-to-Speech para utilização com o seu projeto, clique em Ativar.
Configure a autenticação para o seu ambiente de desenvolvimento. Para ver instruções, consulte o artigo Configure a autenticação para o Cloud Text-to-Speech.
Realize a síntese síncrona de uma única pessoa
Python
# google-cloud-texttospeech minimum version 2.29.0 is required.
import os
from google.cloud import texttospeech
PROJECT_ID = os.getenv("GOOGLE_CLOUD_PROJECT")
def synthesize(prompt: str, text: str, output_filepath: str = "output.mp3"):
"""Synthesizes speech from the input text and saves it to an MP3 file.
Args:
prompt: Styling instructions on how to synthesize the content in
the text field.
text: The text to synthesize.
output_filepath: The path to save the generated audio file.
Defaults to "output.mp3".
"""
client = texttospeech.TextToSpeechClient()
synthesis_input = texttospeech.SynthesisInput(text=text, prompt=prompt)
# Select the voice you want to use.
voice = texttospeech.VoiceSelectionParams(
language_code="en-US",
name="Charon", # Example voice, adjust as needed
model_name="gemini-2.5-pro-tts"
)
audio_config = texttospeech.AudioConfig(
audio_encoding=texttospeech.AudioEncoding.MP3
)
# Perform the text-to-speech request on the text input with the selected
# voice parameters and audio file type.
response = client.synthesize_speech(
input=synthesis_input, voice=voice, audio_config=audio_config
)
# The response's audio_content is binary.
with open(output_filepath, "wb") as out:
out.write(response.audio_content)
print(f"Audio content written to file: {output_filepath}")
CURL
# Make sure to install gcloud cli, and sign in to your project.
# Make sure to use your PROJECT_ID value.
# The available models are gemini-2.5-flash-tts, gemini-2.5-flash-lite-preview-tts, and gemini-2.5-pro-tts.
# To parse the JSON output and use it directly see the last line of the command.
# Requires JQ and ffplay library to be installed.
PROJECT_ID=YOUR_PROJECT_ID
curl -X POST \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "x-goog-user-project: $PROJECT_ID" \
-H "Content-Type: application/json" \
-d '{
"input": {
"prompt": "Say the following in a curious way",
"text": "OK, so... tell me about this [uhm] AI thing."
},
"voice": {
"languageCode": "en-us",
"name": "Kore",
"model_name": "gemini-2.5-flash-tts"
},
"audioConfig": {
"audioEncoding": "LINEAR16"
}
}' \
"https://texttospeech.googleapis.com/v1/text:synthesize" \
| jq -r '.audioContent' | base64 -d | ffplay - -autoexit
Realize a síntese de um único orador em streaming
A síntese de streaming é adequada para aplicações em tempo real em que a resposta rápida é fundamental para a experiência do utilizador. Na ligação de streaming, a API devolve áudio à medida que fica disponível em pequenos blocos.
Como autor da chamada da API, certifique-se de que consome os fragmentos de áudio, transmitindo-os aos seus clientes à medida que chegam (por exemplo, usando socketio para apps Web).
Embora seja possível enviar os fragmentos de entrada para a API de forma assíncrona, conforme mostrado no request_generator, a API só começa a fazer a síntese quando o cliente envia Half-Close como um sinal de que não vai enviar mais dados para a API.
O campo prompt tem de ser definido no primeiro bloco de entrada, porque é ignorado nos blocos consecutivos.
Python
# google-cloud-texttospeech minimum version 2.29.0 is required.
import datetime
import os
import numpy as np
from google.cloud import texttospeech
PROJECT_ID = os.getenv("GOOGLE_CLOUD_PROJECT")
def synthesize(prompt: str, text_chunks: list[str], model: str, voice: str, locale: str):
"""Synthesizes speech from the input text.
Args:
prompt: Styling instructions on how to synthesize the content in
the text field.
text_chunks: Text chunks to synthesize. Note that The synthesis will
start when the client initiates half-close.
model: gemini tts model name. gemini-2.5-flash-tts, gemini-2.5-flash-lite-preview-tts, and gemini-2.5-pro-tts
voice: voice name. Example: leda, kore. Refer to available voices
locale: locale name. Example: en-us. Refer to available locales.
"""
client = texttospeech.TextToSpeechClient()
config_request = texttospeech.StreamingSynthesizeRequest(
streaming_config=texttospeech.StreamingSynthesizeConfig(
voice=texttospeech.VoiceSelectionParams(
name=voice,
language_code=locale,
model_name=model
)
)
)
# Example request generator. A function like this can be linked to an LLM
# text generator and the text can be passed to the TTS API asynchronously.
def request_generator():
yield config_request
for i, text in enumerate(text_chunks):
yield texttospeech.StreamingSynthesizeRequest(
input=texttospeech.StreamingSynthesisInput(
text=text,
# Prompt is only supported in the first input chunk.
prompt=prompt if i == 0 else None,
)
)
request_start_time = datetime.datetime.now()
streaming_responses = client.streaming_synthesize(request_generator())
is_first_chunk_received = False
final_audio_data = np.array([])
num_chunks_received = 0
for response in streaming_responses:
# just a simple progress indicator
num_chunks_received += 1
print(".", end="")
if num_chunks_received % 40 == 0:
print("")
# measuring time to first audio
if not is_first_chunk_received:
is_first_chunk_received = True
first_chunk_received_time = datetime.datetime.now()
# accumulating audio. In a web-server scenario, you would want to
# "emit" audio to the frontend as soon as it arrives.
#
# For example using flask socketio, you could do the following
# from flask_socketio import SocketIO, emit
# emit("audio", response.audio_content)
# socketio.sleep(0)
audio_data = np.frombuffer(response.audio_content, dtype=np.int16)
final_audio_data = np.concatenate((final_audio_data, audio_data))
time_to_first_audio = first_chunk_received_time - request_start_time
time_to_completion = datetime.datetime.now() - request_start_time
audio_duration = len(final_audio_data) / 24_000 # default sampling rate.
print("\n")
print(f"Time to first audio: {time_to_first_audio.total_seconds()} seconds")
print(f"Time to completion: {time_to_completion.total_seconds()} seconds")
print(f"Audio duration: {audio_duration} seconds")
return final_audio_data
Realize a síntese síncrona de vários oradores com entrada de texto de forma livre
| Descrição | Restrições e limites | Tipo |
|---|---|---|
| Campo de texto | Inferior ou igual a 4000 bytes | Entrada |
| Campo de comando | Inferior ou igual a 4000 bytes | Entrada |
| Campos de texto e de comando | Inferior ou igual a 8000 bytes | Entrada |
| Aliases de altifalantes | Carateres alfanuméricos e sem espaços em branco | Entrada |
| Duração do áudio de saída | Aproximadamente 655 segundos. Se o texto de entrada fizer com que o áudio exceda os 655 segundos, o áudio é truncado. | Resultado |
Python
# google-cloud-texttospeech minimum version 2.31.0 is required.
import os
from google.cloud import texttospeech
PROJECT_ID = os.getenv("GOOGLE_CLOUD_PROJECT")
def synthesize_multispeaker_freeform(
prompt: str,
text: str,
output_filepath: str = "output_non_turn_based.wav",
):
"""Synthesizes speech from non-turn-based input and saves it to a WAV file.
Args:
prompt: Styling instructions on how to synthesize the content in the
text field.
text: The text to synthesize, containing speaker aliases to indicate
different speakers. Example: "Sam: Hi Bob!\nBob: Hi Sam!"
output_filepath: The path to save the generated audio file. Defaults to
"output_non_turn_based.wav".
"""
client = texttospeech.TextToSpeechClient()
synthesis_input = texttospeech.SynthesisInput(text=text, prompt=prompt)
multi_speaker_voice_config = texttospeech.MultiSpeakerVoiceConfig(
speaker_voice_configs=[
texttospeech.MultispeakerPrebuiltVoice(
speaker_alias="Speaker1",
speaker_id="Kore",
),
texttospeech.MultispeakerPrebuiltVoice(
speaker_alias="Speaker2",
speaker_id="Charon",
),
]
)
voice = texttospeech.VoiceSelectionParams(
language_code="en-US",
model_name="gemini-2.5-pro-tts",
multi_speaker_voice_config=multi_speaker_voice_config,
)
audio_config = texttospeech.AudioConfig(
audio_encoding=texttospeech.AudioEncoding.LINEAR16,
sample_rate_hertz=24000,
)
response = client.synthesize_speech(
input=synthesis_input, voice=voice, audio_config=audio_config
)
with open(output_filepath, "wb") as out:
out.write(response.audio_content)
print(f"Audio content written to file: {output_filepath}")
CURL
# Make sure to install gcloud cli, and sign in to your project.
# Make sure to use your PROJECT_ID value.
# The available models are gemini-2.5-flash-tts and gemini-2.5-pro-tts
# To parse the JSON output and use it directly see the last line of the command.
# Requires JQ and ffplay library to be installed.
# google-cloud-texttospeech minimum version 2.31.0 is required.
PROJECT_ID=YOUR_PROJECT_ID
curl -X POST \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "x-goog-user-project: $PROJECT_ID" \
-H "Content-Type: application/json" \
-d '{
"input": {
"prompt": "Say the following as a conversation between friends.",
"text": "Sam: Hi Bob, how are you?\\nBob: I am doing well, and you?"
},
"voice": {
"languageCode": "en-us",
"modelName": "gemini-2.5-flash-tts",
"multiSpeakerVoiceConfig": {
"speakerVoiceConfigs": [
{
"speakerAlias": "Sam",
"speakerId": "Kore"
},
{
"speakerAlias": "Bob",
"speakerId": "Charon"
}
]
}
},
"audioConfig": {
"audioEncoding": "LINEAR16",
"sampleRateHertz": 24000
}
}' \
"https://texttospeech.googleapis.com/v1/text:synthesize" \
| jq -r '.audioContent' | base64 -d | ffplay - -autoexit
Realize a síntese síncrona de vários oradores com entrada de texto estruturado
A funcionalidade de vários oradores com entrada de texto estruturado permite a verbalização inteligente de texto de uma forma semelhante à humana. Por exemplo, este tipo de entrada é útil para moradas e datas. A entrada de texto de forma livre pronuncia o texto exatamente como foi escrito.
cada campo de comando e caixa de diálogo tem de ter um máximo de 4000 bytes.| Descrição | Restrições e limites | Tipo |
|---|---|---|
| Campo MultiSpeakerMarkUp | Inferior ou igual a 4000 bytes | Entrada |
| Campo de comando | Inferior ou igual a 4000 bytes | Entrada |
| MultiSpeakerMarkUp e campos de comando | Inferior ou igual a 8000 bytes | Entrada |
| Aliases de altifalantes | Carateres alfanuméricos e sem espaços em branco | Entrada |
| Duração do áudio de saída | Aproximadamente 655 segundos. Se o texto de entrada fizer com que o áudio exceda os 655 segundos, o áudio é truncado. | Resultado |
Python
# google-cloud-texttospeech minimum version 2.31.0 is required.
import os
from google.cloud import texttospeech
PROJECT_ID = os.getenv("GOOGLE_CLOUD_PROJECT")
def synthesize_multispeaker_structured(
prompt: str,
turns: list[texttospeech.MultiSpeakerMarkup.Turn],
output_filepath: str = "output_turn_based.wav",
):
"""Synthesizes speech from turn-based input and saves it to a WAV file.
Args:
prompt: Styling instructions on how to synthesize the content in the
text field.
turns: A list of texttospeech.MultiSpeakerMarkup.Turn objects representing
the dialogue turns.
output_filepath: The path to save the generated audio file. Defaults to
"output_turn_based.wav".
"""
client = texttospeech.TextToSpeechClient()
synthesis_input = texttospeech.SynthesisInput(
multi_speaker_markup=texttospeech.MultiSpeakerMarkup(turns=turns),
prompt=prompt,
)
multi_speaker_voice_config = texttospeech.MultiSpeakerVoiceConfig(
speaker_voice_configs=[
texttospeech.MultispeakerPrebuiltVoice(
speaker_alias="Speaker1",
speaker_id="Kore",
),
texttospeech.MultispeakerPrebuiltVoice(
speaker_alias="Speaker2",
speaker_id="Charon",
),
]
)
voice = texttospeech.VoiceSelectionParams(
language_code="en-US",
model_name="gemini-2.5-pro-tts",
multi_speaker_voice_config=multi_speaker_voice_config,
)
audio_config = texttospeech.AudioConfig(
audio_encoding=texttospeech.AudioEncoding.LINEAR16,
sample_rate_hertz=24000,
)
response = client.synthesize_speech(
input=synthesis_input, voice=voice, audio_config=audio_config
)
with open(output_filepath, "wb") as out:
out.write(response.audio_content)
print(f"Audio content written to file: {output_filepath}")
CURL
# Make sure to install gcloud cli, and sign in to your project.
# Make sure to use your PROJECT_ID value.
# The available models are gemini-2.5-flash-tts and gemini-2.5-pro-tts.
# To parse the JSON output and use it directly see the last line of the command.
# Requires JQ and ffplay library to be installed.
# google-cloud-texttospeech minimum version 2.31.0 is required.
PROJECT_ID=YOUR_PROJECT_ID
curl -X POST \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "x-goog-user-project: $PROJECT_ID" \
-H "Content-Type: application/json" \
-d '{
"input": {
"prompt": "Say the following as a conversation between friends.",
"multiSpeakerMarkup": {
"turns": [
{
"speaker": "Sam",
"text": "Hi Bob, how are you?"
},
{
"speaker": "Bob",
"text": "I am doing well, and you?"
}
]
}
},
"voice": {
"languageCode": "en-us",
"modelName": "gemini-2.5-flash-tts",
"multiSpeakerVoiceConfig": {
"speakerVoiceConfigs": [
{
"speakerAlias": "Sam",
"speakerId": "Kore"
},
{
"speakerAlias": "Bob",
"speakerId": "Charon"
}
]
}
},
"audioConfig": {
"audioEncoding": "LINEAR16",
"sampleRateHertz": 24000
}
}' \
"https://texttospeech.googleapis.com/v1/text:synthesize" \
| jq -r '.audioContent' | base64 -d | ffplay - -autoexit
Use o Gemini-TTS na Google API de IA generativa
Descubra como usar os modelos Gemini-TTS para sintetizar a fala de um único orador e de vários oradores através da Google API de IA generativa.
Na Cloud Text-to-Speech API, o utilizador pode fornecer campos de texto e comandos separadamente. Na API de IA generativa, este é um único campo contents, onde especifica a entrada sob a forma de "{comando}: {texto}", por exemplo: Google "Diz o seguinte de forma curiosa: OK, então… fala-me desta coisa da IA."
Na API de IA Google generativa, a saída são dados de áudio PCM de 16 bits a 24 k, e não tem cabeçalhos WAV. Se quiserem fazer a conversão para outro formato de áudio, os clientes têm de realizar passos adicionais.
| Descrição | Limite | Tipo |
|---|---|---|
| Campo de conteúdos | Inferior ou igual a 8000 bytes. | Entrada |
| Duração do áudio de saída | Aproximadamente 655 segundos. Se o texto de entrada fizer com que o áudio exceda os 655 segundos, o áudio é truncado. | Resultado |
Antes de começar
Antes de começar, siga os passos de instalação da Google API de IA generativa.
Realize a síntese síncrona de uma única pessoa
Estes exemplos de código demonstram como realizar a síntese síncrona de um único orador.
Python
from google import genai
from google.genai import types
import wave
import os
PROJECT_ID = "[your-project-id]" # @param {type: "string", placeholder: "[your-project-id]", isTemplate: true}
if not PROJECT_ID or PROJECT_ID == "[your-project-id]":
PROJECT_ID = str(os.environ.get("GOOGLE_CLOUD_PROJECT"))
LOCATION = os.environ.get("GOOGLE_CLOUD_REGION", "global")
# Set up the wave file to save the output:
def wave_file(filename, pcm, channels=1, rate=24000, sample_width=2):
with wave.open(filename, "wb") as wf:
wf.setnchannels(channels)
wf.setsampwidth(sample_width)
wf.setframerate(rate)
wf.writeframes(pcm)
client = genai.Client(vertexai=True, project=PROJECT_ID, location=LOCATION)
response = client.models.generate_content(
model="gemini-2.5-flash-tts",
contents="Say the following in a curious way: OK, so... tell me about this [uhm] AI thing.",
config=types.GenerateContentConfig(
speech_config=types.SpeechConfig(
language_code="en-in",
voice_config=types.VoiceConfig(
prebuilt_voice_config=types.PrebuiltVoiceConfig(
voice_name='Kore',
)
)
),
)
)
data = response.candidates[0].content.parts[0].inline_data.data
file_name='output_speech.wav'
wave_file(file_name, data) # Saves the file to current directory
CURL
# Make sure to install gcloud cli, and sign in to your project.
# Make sure to use your PROJECT_ID value.
# The available models are gemini-2.5-flash-tts, gemini-2.5-flash-lite-preview-tts, and gemini-2.5-pro-tts.
# To parse the JSON output and use it directly see the last line of the command.
# Requires JQ and ffplay library to be installed.
PROJECT_ID=YOUR_PROJECT_ID
curl -X POST \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "x-goog-user-project: $PROJECT_ID" \
-H "Content-Type: application/json" \
-d '{
"contents": {
"role": "user",
"parts": { "text": "Say the following in a curious way: OK, so... tell me about this [uhm] AI thing." }
},
"generation_config": {
"speech_config": {
"language_code": "en-in",
"voice_config": {
"prebuilt_voice_config": {
"voice_name": "kore"
}
}
}
}
}' \
https://aiplatform.googleapis.com/v1beta1/projects/$PROJECT_ID/locations/us-central1/publishers/google/models/gemini-2.5-flash-tts:generateContent \
| jq -r '.candidates[0].content.parts[0].inlineData.data' \
| base64 -d | ffmpeg -f s16le -ar 24k -ac 1 -i - output_speech.wav
Realizar síntese síncrona de vários altifalantes
Este exemplo de código demonstra como realizar a síntese síncrona de vários oradores.
CURL
# Make sure to install gcloud cli, and sign in to your project.
# Make sure to use your PROJECT_ID value.
# The available models are gemini-2.5-flash-tts, gemini-2.5-flash-lite-preview-tts, and gemini-2.5-pro-tts.
# To parse the JSON output and use it directly see the last line of the command.
# Requires JQ and ffplay library to be installed.
PROJECT_ID=YOUR_PROJECT_ID
curl -X POST \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "x-goog-user-project: $PROJECT_ID" \
-H "Content-Type: application/json" \
-d '{
"contents": {
"role": "user",
"parts": { "text": "Say the following as a conversation between friends: Sam: Hi Bob, how are you?\\nBob: I am doing well, and you?" }
},
"generation_config": {
"speech_config": {
"language_code": "en-in",
"multi_speaker_voice_config": {
"speaker_voice_configs": [{
"speaker": "Sam",
"voice_config": {
"prebuilt_voice_config": {
"voice_name": "Aoede"
}
}
},{
"speaker": "Bob",
"voice_config": {
"prebuilt_voice_config": {
"voice_name": "Algieba"
}
}
}]
}
}
}
}' \
https://aiplatform.googleapis.com/v1beta1/projects/$PROJECT_ID/locations/us-central1/publishers/google/models/gemini-2.5-flash-tts:generateContent \
| jq -r '.candidates[0].content.parts[0].inlineData.data' \
| base64 -d | ffmpeg -f s16le -ar 24k -ac 1 -i - output_speech.wav
Realize a síntese de voz no Media Studio
Pode usar o Media Studio na consola Google Cloud Google para experimentar modelos de conversão de texto em voz. Isto fornece uma interface do utilizador para gerar rapidamente, ouvir áudio sintetizado e fazer experiências com diferentes instruções de estilo e parâmetros.
Na consola Google Google Cloud , aceda à página Vertex AI Studio > Media Studio.
Selecione Voz no menu pendente de multimédia.
No campo de texto, introduza o texto que quer sintetizar em voz.
No painel Definições, configure as seguintes definições:
- Modelo: selecione o modelo de TTS (conversão de texto em voz) do Google Cloud que quer usar, como
Gemini 2.5 Pro TTS. Para mais informações acerca dos modelos disponíveis, consulte o artigo Modelos de TTS do Google Cloud. - Instruções de estilo: opcional: introduza um comando de texto que descreva o estilo de fala, o tom e a expressão emocional selecionados. Isto permite-lhe orientar o desempenho do modelo além da narração predefinida. Por exemplo: "Narração com um tom calmo e profissional para um documentário.".
- Idioma: selecione o idioma e a região do texto introduzido. O modelo gera voz no idioma e sotaque selecionados. Por exemplo, inglês (Estados Unidos).
- Voz: escolha uma voz predefinida para a narração. A lista contém as vozes disponíveis para o modelo e o idioma selecionados, como Acherner (feminino).
- Modelo: selecione o modelo de TTS (conversão de texto em voz) do Google Cloud que quer usar, como
Opcional: expanda a secção Opções avançadas para configurar as definições técnicas de áudio:
- Codificação de áudio: selecione a codificação para o ficheiro de áudio de saída. O formato
LINEAR16é um formato sem perda de dados e não comprimido adequado para o processamento de áudio de alta qualidade. OMULAWtambém está disponível para a saída de áudio comprimido. - Taxa de amostragem de áudio: selecione a taxa de amostragem em hertz (Hz). Isto determina a qualidade do áudio. Os valores mais elevados, como 44 100 Hz, representam áudio de maior fidelidade, equivalente à qualidade de CD.
- Velocidade: ajuste a velocidade de voz movendo o controlo de deslize ou introduzindo um valor. Os valores inferiores a 1 diminuem a velocidade da fala e os valores superiores a 1 aumentam a velocidade da fala. A predefinição é 1.
- Ganho de volume (db): ajuste o volume do áudio de saída em decibéis (dB). Os valores positivos aumentam o volume e os valores negativos diminuem-no. O valor predefinido é 0.
- Codificação de áudio: selecione a codificação para o ficheiro de áudio de saída. O formato
Clique no ícone enviar à direita da caixa de texto para gerar o áudio.
O áudio gerado aparece no leitor de multimédia. Clique no botão de reprodução para ouvir o resultado. Pode continuar a ajustar as definições e gerar novas versões conforme necessário.
Sugestões de comandos
A criação de áudio apelativo e com um som natural a partir de texto requer a compreensão das nuances da linguagem falada e a sua tradução para um formato de guião. As seguintes dicas ajudam a criar guiões com um som autêntico e que captam o tom escolhido.
Os três elementos de controlo de voz
Para obter os resultados mais previsíveis e detalhados, certifique-se de que os três componentes seguintes são consistentes com o resultado pretendido.
Comando de estilo O principal fator da tonalidade emocional geral e da apresentação. O comando define o contexto para todo o segmento de voz.
Exemplo:
You are an AI assistant speaking in a friendly and helpful tone.Exemplo:
Narrate this in the calm, authoritative tone of a nature documentary narrator.
Conteúdo de texto O significado semântico das palavras que está a sintetizar. Uma expressão evocativa que seja emocionalmente consistente com o comando de estilo produz resultados muito mais fiáveis do que texto neutro.
Bom: um comando para um tom assustado funciona melhor com texto como
I think someone is in the house.Menos eficaz: um comando para um tom assustado com texto como
The meeting is at 4 PM.produz resultados ambíguos.
Etiquetas de marcação (pré-visualização)
As etiquetas entre parênteses, como [sigh], são mais adequadas para injetar uma ação específica e localizada ou uma modificação de estilo, e não para definir o tom geral. Funcionam em conjunto com o comando de estilo e o conteúdo de texto.
Guia de etiquetas de marcação
A nossa pesquisa mostra que as etiquetas de marcação entre parênteses funcionam num de três modos distintos. Compreender o modo de uma etiqueta é fundamental para a usar eficazmente.
Modo 1: sons que não são discurso
A marcação é substituída por uma vocalização audível que não é discurso (por exemplo, um suspiro ou uma gargalhada). A etiqueta em si não é falada. São excelentes para adicionar hesitações e reações realistas, semelhantes às humanas.
| Etiqueta | Comportamento | Fiabilidade | Orientação |
|---|---|---|---|
[sigh] |
Insere um som de suspiro. | Alto | A qualidade emocional do suspiro é influenciada pelo comando. |
[laughing] |
Insere um riso. | Alto | Para ter os melhores resultados, use um comando específico. Por exemplo, um comando genérico pode gerar uma gargalhada de choque, enquanto "reage com uma gargalhada divertida" cria uma gargalhada de diversão. |
[uhm] |
Insere um som de hesitação. | Alto | Útil para criar um ambiente mais natural e conversacional. |
Modo 2: modificadores de estilo
A marcação não é falada, mas modifica a transmissão da fala subsequente. O âmbito e a duração da modificação podem variar.
| Etiqueta | Comportamento | Fiabilidade | Orientação |
|---|---|---|---|
[sarcasm] |
Transmite um tom sarcástico à expressão seguinte. | Alto | Esta etiqueta é um modificador poderoso. Demonstra que os conceitos abstratos podem orientar com êxito a publicação do modelo. |
[robotic] |
Faz com que a voz seguinte soe robótica. | Alto | O efeito pode abranger toda uma expressão. Um comando de estilo de apoio (por exemplo, "Diz isto de forma robótica") continua a ser recomendado para obter os melhores resultados. |
[shouting] |
Aumenta o volume da fala seguinte. | Alto | Mais eficaz quando usado com um comando de estilo correspondente (por exemplo, "Shout this next part") e texto que implica gritar. |
[whispering] |
Diminui o volume da voz seguinte. | Alto | Os melhores resultados são alcançados quando o comando de estilo também é explícito (por exemplo, "agora, sussurra esta parte o mais silenciosamente possível"). |
[extremely fast] |
Aumenta a velocidade da fala subsequente. | Alto | Ideal para exclusões de responsabilidade ou diálogos rápidos. Apoio técnico mínimo de comandos necessário. |
Modo 3: marcação vocalizada (adjetivos)
A etiqueta de marcação em si é falada como uma palavra, ao mesmo tempo que influencia o tom de toda a frase. Este comportamento aplica-se normalmente a adjetivos emocionais.
Aviso: uma vez que a etiqueta em si é falada, é provável que este modo seja um efeito secundário indesejável para a maioria dos exemplos de utilização. Em alternativa, prefira usar o comando de estilo para definir estes tons emocionais.
| Etiqueta | Comportamento | Fiabilidade | Orientação |
|---|---|---|---|
[scared] |
A palavra "assustado" é dita e a frase adota um tom assustado. | Alto | O desempenho depende muito do conteúdo de texto. A expressão "Acabei de ouvir um vidro a partir-se" produz um resultado genuinamente assustado. Uma expressão neutra produz um resultado "assustador", mas menos autêntico. |
[curious] |
A palavra "curioso" é falada e a frase adota um tom curioso. | Alto | Use uma expressão inquisitiva para apoiar a intenção da etiqueta. |
[bored] |
A palavra "entediado" é dita e a frase adota uma entoação monótona e aborrecida. | Alto | Use com texto banal ou repetitivo para obter o melhor efeito. |
Modo 4: ritmo e pausas
Estas etiquetas inserem silêncio no áudio gerado, o que lhe dá um controlo detalhado sobre o ritmo, o tempo e o andamento. A pontuação padrão (vírgulas, pontos, pontos e vírgulas) também cria pausas naturais, mas estas etiquetas oferecem um controlo mais explícito.
| Etiqueta | Comportamento | Fiabilidade | Orientação |
|---|---|---|---|
[short pause] |
Insere uma breve pausa, semelhante a uma vírgula (~250 ms). | Alto | Use para separar cláusulas ou itens de listas para maior clareza. |
[medium pause] |
Insere uma pausa padrão, semelhante a uma pausa entre frases (~500 ms). | Alto | Eficaz para separar frases ou pensamentos distintos. |
[long pause] |
Insere uma pausa significativa para efeito dramático (~1000 ms ou mais). | Alto | Use para criar efeitos dramáticos. Por exemplo: "A resposta é… [long pause] …não." Evite a utilização excessiva, uma vez que pode soar artificial. |
Estratégias importantes para resultados fiáveis
Alinhe os três elementos: Para uma previsibilidade máxima, certifique-se de que o comando de estilo, o conteúdo de texto e todas as etiquetas de marcação são semanticamente consistentes e estão a trabalhar em função do mesmo objetivo.
Use texto emocionalmente rico: não confie apenas em comandos e etiquetas. Forneça ao modelo texto rico e descritivo para trabalhar. Isto é especialmente importante para emoções complexas, como sarcasmo, medo ou entusiasmo.
Escreva comandos específicos e detalhados: quanto mais específico for o comando de estilo, mais fiável é o resultado. "Reage com uma risada divertida" é melhor do que apenas
[laughing]. "Fala como um locutor de notícias de rádio dos anos 40" é melhor do que "Fala à moda antiga".Teste e valide novas etiquetas: o comportamento de uma etiqueta nova ou não testada nem sempre é previsível. Uma etiqueta que considera um modificador de estilo pode ser vocalizada. Teste sempre uma nova combinação de etiqueta ou comando para confirmar o respetivo comportamento antes da implementação em produção.
Desativar os filtros de segurança
As contas com
faturação mensal
podem configurar pedidos para relaxar os filtros de segurança através do campo relax_safety_filters em AdvancedVoiceOptions. O campo relax_safety_filters só está ativado para contas com faturação mensal.
A diminuição dos filtros de segurança reduz o limite de bloqueio de conteúdo prejudicial de ser sintetizado.
Python
# google-cloud-texttospeech minimum version 2.32.0 is required.
request = texttospeech.SynthesizeSpeechRequest(
input=synthesis_input,
voice=voice,
audio_config=audio_config,
advanced_voice_options=texttospeech.AdvancedVoiceOptions(
relax_safety_filters=True,
),
)
# Perform the text-to-speech request on the text input with the selected
# voice parameters and audio file type.
response = client.synthesize_speech(request=request)
CURL
PROJECT_ID=YOUR_PROJECT_ID
curl -X POST \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "x-goog-user-project: $PROJECT_ID" \
-H "Content-Type: application/json" \
-d '{
"input": {
"prompt": "Say the following in a curious way",
"text": "I am saying something that would otherwise be blocked by Gemini TTS."
},
"voice": {
"languageCode": "en-us",
"name": "Kore",
"modelName": "gemini-2.5-flash-tts"
},
"audioConfig": {
"audioEncoding": "LINEAR16"
},
"advancedVoiceOptions": {
"relaxSafetyFilters": true
}
}' \
"https://texttospeech.googleapis.com/v1/text:synthesize" \
| jq -r '.audioContent' | base64 -d | ffplay - -autoexit