雨巷里的一点暖光 — 用自然的普通话、轻重音和舒缓停顿,引导视线走进摄影作品。
Gemini 3.1 Flash TTS Text to Speech API
google/gemini-3.1-flash/text-to-speechGemini 3.1 Flash TTS Text to Speech 将文稿转为多语言配音,支持双人对话与风格指令。用语音标签引导局部停顿和情感,为角色分配不同音色。
示例
REST API
快速开始
以下流程提交一个合法的 Gemini 3.1 Flash TTS Text to Speech API 请求,取得 task_id,并在异步任务结束后读取音频 URL。
连接 Vidgo API
创建 API Key,仅保存在服务端,并通过 Authorization: Bearer VIDGO_API_KEY 发送。
- 端点
- POST
https://api.vidgo.ai/api/generate/submit - 认证
- Authorization: Bearer VIDGO_API_KEY
提交一个音频任务
向统一提交端点发送当前模型 ID、朗读文本,示例包含双人台词、角色音色与表达指令。
curl --request POST \
--url "https://api.vidgo.ai/api/generate/submit" \
--header "Authorization: Bearer $VIDGO_API_KEY" \
--header "Content-Type: application/json" \
--data '{
"model": "google/gemini-3.1-flash/text-to-speech",
"input": {
"text": "Actor: [whispers] You're early. The curtain isn't up yet.\nDirector: Same words again. This time, you've been waiting years to see them.\nActor: [excitement] You're early! The curtain isn't up yet!\nDirector: [laughs] There it is. Keep that smile. We're ready.",
"style_instructions": "An intimate theatre rehearsal. Actor shifts from a secretive whisper to delighted recognition. Director is calm, warm and lightly amused. Keep both voices distinct; do not read speaker labels or tags aloud.",
"speakers": [
{
"speaker_id": "Actor",
"voice": "Puck"
},
{
"speaker_id": "Director",
"voice": "Kore"
}
],
"language_code": "English (US)",
"temperature": 1,
"output_format": "mp3"
}
}'等待音频结果
读取 data.task_id,仅在 not_started 或 running 时继续轮询;finished 与 failed 都必须停止。
查询状态
GET https://api.vidgo.ai/api/generate/status/{task_id}建议每 2–5 秒查询一次,并对 429/5xx 退避。也可在顶层提供 callback_url,在任务进入终态时接收回调。
not_startedrunningfinishedfailed{
"code": 200,
"data": {
"task_id": "task-example",
"status": "running",
"created_time": "2026-09-25T11:31:42"
}
}{
"code": 200,
"data": {
"task_id": "L4VDZ98GS8E3H9RN",
"status": "finished",
"files": [
{
"file_url": "https://cdn.vidgo.ai/apis/models/google/gemini-3.1-flash/text-to-speech/v1/01/output.mp3",
"file_type": "audio"
}
],
"created_time": "2026-09-27T16:24:23",
"error_message": null,
"progress": 100
}
}完整可运行轮询示例
展开查看 JavaScript 和 Python 示例,提交相同文本请求,并轮询至 finished 或 failed。
set -euo pipefail
: "${VIDGO_API_KEY:?Set VIDGO_API_KEY in your environment}"
REQUEST_BODY=$(cat <<'JSON'
{
"model": "google/gemini-3.1-flash/text-to-speech",
"input": {
"text": "Actor: [whispers] You're early. The curtain isn't up yet.\nDirector: Same words again. This time, you've been waiting years to see them.\nActor: [excitement] You're early! The curtain isn't up yet!\nDirector: [laughs] There it is. Keep that smile. We're ready.",
"style_instructions": "An intimate theatre rehearsal. Actor shifts from a secretive whisper to delighted recognition. Director is calm, warm and lightly amused. Keep both voices distinct; do not read speaker labels or tags aloud.",
"speakers": [
{
"speaker_id": "Actor",
"voice": "Puck"
},
{
"speaker_id": "Director",
"voice": "Kore"
}
],
"language_code": "English (US)",
"temperature": 1,
"output_format": "mp3"
}
}
JSON
)
SUBMIT_RESPONSE=$(curl --silent --show-error --fail-with-body \
--request POST \
--url "https://api.vidgo.ai/api/generate/submit" \
--header "Authorization: Bearer $VIDGO_API_KEY" \
--header "Content-Type: application/json" \
--data "$REQUEST_BODY")
TASK_ID=$(printf '%s' "$SUBMIT_RESPONSE" | jq -r '.data.task_id // .task_id // empty')
if [ -z "$TASK_ID" ]; then
printf 'Submit response did not include task_id:
%s
' "$SUBMIT_RESPONSE" >&2
exit 1
fi
while true; do
STATUS_RESPONSE=$(curl --silent --show-error --fail-with-body \
--url "https://api.vidgo.ai/api/generate/status/$TASK_ID" \
--header "Authorization: Bearer $VIDGO_API_KEY")
STATUS=$(printf '%s' "$STATUS_RESPONSE" | jq -r '.data.status // .status // empty')
case "$STATUS" in
finished)
printf '%s' "$STATUS_RESPONSE" | jq -r '(.data.files // .files // [])[]?.file_url'
break
;;
failed)
printf '%s' "$STATUS_RESPONSE" | jq -r '.data.error_message // .error_message // "Generation failed"' >&2
exit 1
;;
not_started|running)
sleep 2
;;
*)
printf 'Unexpected task status: %s
' "$STATUS" >&2
exit 1
;;
esac
done请求参数
下表仅列出 input 对象内的公开字段。顶层 model 与可选 callback_url 请参考快速开始示例。
| 字段 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
| input.text | string | 是 | - | 输入 1–50,000 个 Unicode 字符,包含空格、换行和语音标签。双人台词以对应 Speaker Id 加冒号开头。 |
| input.style_instructions | string | 可选 | - | 描述整段语音的语气、节奏、口音和情感。 |
| input.voice | string | 可选 | Kore | 单人语音从 30 种预设音色中选择,默认 Kore。 Achernar, Achird, Algenib, Algieba, Alnilam, Aoede, Autonoe, Callirrhoe, Charon, Despina, Enceladus, Erinome, Fenrir, Gacrux, Iapetus, Kore, Laomedeia, Leda, Orus, Pulcherrima, Puck, Rasalgethi, Sadachbia, Sadaltager, Schedar, Sulafat, Umbriel, Vindemiatrix, Zephyr, Zubenelgenubi. |
| input.speakers | array | 可选 | - | 为两位说话人分别填写唯一 Speaker Id 并选择 Voice,台词前缀与对应别名保持一致。 |
| input.language_code | string | 可选 | - | 选择语言值,或根据 Text 自动识别语言。 Arabic (Egypt), Bangla (Bangladesh), Dutch (Netherlands), English (India), English (US), French (France), German (Germany), Hindi (India), Indonesian (Indonesia), Italian (Italy), Japanese (Japan), Korean (South Korea), Marathi (India), Polish (Poland), Portuguese (Brazil), Romanian (Romania), Russian (Russia), Spanish (Spain), Tamil (India), Telugu (India), Thai (Thailand), Turkish (Turkey), Ukrainian (Ukraine), Vietnamese (Vietnam), Afrikaans (South Africa), Albanian (Albania), Amharic (Ethiopia), Arabic (World), Armenian (Armenia), Azerbaijani (Azerbaijan), Basque (Spain), Belarusian (Belarus), Bulgarian (Bulgaria), Burmese (Myanmar), Catalan (Spain), Cebuano (Philippines), Chinese Mandarin (China), Chinese Mandarin (Taiwan), Croatian (Croatia), Czech (Czech Republic), Danish (Denmark), English (Australia), English (UK), Estonian (Estonia), Filipino (Philippines), Finnish (Finland), French (Canada), Galician (Spain), Georgian (Georgia), Greek (Greece), Gujarati (India), Haitian Creole (Haiti), Hebrew (Israel), Hungarian (Hungary), Icelandic (Iceland), Javanese (Java), Kannada (India), Konkani (India), Lao (Laos), Latin (Vatican City), Latvian (Latvia), Lithuanian (Lithuania), Luxembourgish (Luxembourg), Macedonian (North Macedonia), Maithili (India), Malagasy (Madagascar), Malay (Malaysia), Malayalam (India), Mongolian (Mongolia), Nepali (Nepal), Norwegian Bokmal (Norway), Norwegian Nynorsk (Norway), Odia (India), Pashto (Afghanistan), Persian (Iran), Portuguese (Portugal), Punjabi (India), Serbian (Serbia), Sindhi (India), Sinhala (Sri Lanka), Slovak (Slovakia), Slovenian (Slovenia), Spanish (Latin America), Spanish (Mexico), Swahili (Kenya), Swedish (Sweden), Urdu (Pakistan). |
| input.temperature | number | 可选 | 1 | 设置 0–2 的语音变化程度,较高值增加表达变化,默认 1。 |
| input.output_format | string | 可选 | mp3 | 选择 mp3 用于播放、wav 用于无压缩后期制作,或 ogg_opus 用于紧凑音频,默认 mp3。 mp3, wav, ogg_opus. |
| input.speakers[].speaker_id | string | 每项必填 | - | 使用字母、数字和下划线组成唯一别名,并在 Text 中为对应台词添加该别名前缀。 |
| input.speakers[].voice | string | 每项必填 | - | 从 30 种预设音色中选择该说话人的 voice。 Achernar, Achird, Algenib, Algieba, Alnilam, Aoede, Autonoe, Callirrhoe, Charon, Despina, Enceladus, Erinome, Fenrir, Gacrux, Iapetus, Kore, Laomedeia, Leda, Orus, Pulcherrima, Puck, Rasalgethi, Sadachbia, Sadaltager, Schedar, Sulafat, Umbriel, Vindemiatrix, Zephyr, Zubenelgenubi. |
响应字段
提交响应返回任务标识;状态响应在任务结束时提供音频文件或失败信息。
| 字段 | 类型 | 说明 |
|---|---|---|
| code | integer | 业务返回码,0 或 200 表示成功。 |
| message | string | 可选的人类可读响应信息。 |
| data.task_id | string | 提交成功后用于查询状态的唯一任务 ID。 |
| data.status | string | not_started、running、finished 或 failed。 |
| data.created_time | string | 任务创建时间。 |
| data.progress | integer | 状态响应中的 0–100 进度值。 |
| data.files[] | array | finished 时按返回顺序排列的生成文件。 |
| data.files[].file_url | string | 生成音频的直接 URL。 |
| data.files[].file_type | string | 音频结果使用 audio 标识。 |
| data.files[].metadata | object | 生成文件的可选附加信息,以任务响应中的实际内容为准。 |
| data.error_message | string | null | failed 状态的可读失败原因。 |
任务生命周期
只有前两个状态可继续轮询;finished 与 failed 均为终态。
not_started已接收并排队,等待执行。
running正在生成音频,可以继续轮询。
finished成功终态,验证 files 并读取音频 URL。
failed失败终态,读取 error_message 并停止。
轮询与错误处理
- 认证401 表示认证失败。使用有效的 API Key,并在服务端发送请求。
- 参数校验按请求参数表填写模型 ID、字段类型、枚举、长度和数值范围。
- 轮询间隔从 2–5 秒开始;对 429 和 5xx 使用指数退避,并设置总超时。
- 终态finished 和 failed 后都停止轮询;finished 但没有有效音频也应作为独立错误处理。
- 回调在顶层提供公开 callback_url;服务会在 finished 或 failed 后 POST 扁平任务对象。
- 网络错误区分请求超时、网络失败和任务失败;仅在安全时重试同一查询。
模型规格
| 规格 | 取值 | 说明 |
|---|---|---|
| 模型 | google/gemini-3.1-flash/text-to-speech | 文本转语音。 |
| text | 1–50,000 | Unicode 字符数,保留空格与换行。 |
Gemini 3.1 Flash TTS Text to Speech API 常见问题
Gemini 3.1 Flash TTS Text to Speech API 是什么?
Gemini 3.1 Flash TTS Text to Speech 是 Google 用于将文稿转为旁白与对话的语音生成模型。它支持 30 种预设音色、双人对话和多语言表达,适合播客、课程与产品配音。整段风格指令与局部语音标签分别指导整体语气和具体台词,双人配置为每位角色指定声音。你可以通过 API 进行程序化调用,也可以在体验标签页直接在线试用。
Gemini 3.1 Flash TTS 如何生成双人对话?
为两位说话人分别设置音色和唯一别名,并在每轮台词前填写对应别名与冒号。双人对话使用 Speakers 中的音色配置;别名由字母、数字和下划线组成。
Gemini 3.1 Flash TTS 有哪些预设音色?
可从 30 种预设音色中选择,包括 Kore、Puck 和 Zephyr,单人语音默认使用 Kore。用同一段台词试听不同声音,再为旁白或对话角色选择音色。
Gemini 3.1 Flash TTS 如何控制整段风格?
在 Style Instructions 中描述整段语音的语气、节奏、口音和情感,例如温暖的讲解或平稳的叙述。将需要朗读的台词放在 Text 中,便于分别调整内容和表达方式。
Gemini 3.1 Flash TTS 如何使用局部语音标签?
在台词需要变化的位置加入 [short pause]、[whispering] 或 [laughing],分别引导短暂停顿、低语或笑声。先试听带标签的短句,再将选定的表达方式用于完整文稿。
Gemini 3.1 Flash TTS 如何生成中文配音?
输入中文文稿,在 Language Code 中选择 Chinese Mandarin (China) 或 Chinese Mandarin (Taiwan)。也可使用自动识别,让模型根据文稿选择语言,再通过风格指令描述朗读节奏。
Gemini 3.1 Flash TTS 接受多长的文稿?
Text 接受 1–50,000 个 Unicode 字符,空格、换行和语音标签均计入长度。较长内容可按章节准备,先确认短段落的音色和节奏,再生成完整章节。
Gemini 3.1 Flash TTS 提供哪些音频格式?
Output Format 可选择 mp3、wav 或 ogg_opus,默认 mp3。MP3 适合日常播放,WAV 适合后期剪辑,Ogg Opus 适合需要紧凑文件的音频流程。

