谷歌给 TTS 加了个「音色修图」:拿现成声音说一句「再老十岁、换英国腔」,就能存成一个新音色
3分钟看懂:这次加的不是新模型,是一个「改音色」的接口
11 月 4 日,谷歌在 Gemini API 的更新日志里加了一条:给 Gemini 3.8 TTS 上线 Voice remixing(音色重混)。
一句话说清它做什么:你手里已经有一个声音——可以是谷歌预置的 30 个录音棚音色之一,可以是音色库里挑的,也可以是你自己之前用文字「设计」出来的角色音——现在你不用重做,只要用一句自然语言描述想改什么(「再老十岁,更沉稳一点,换成温和的英国腔,旁白节奏慢一些」),谷歌就会生成一个全新的、独立的音色 ID。原来的那个音色一点都不会变。
这听起来像个小功能,但它补的是一个很具体的坑:过去想让一个 AI 声音「再沙哑一点」,要么从零重新描述一遍(每次结果都不一样),要么拿真人录音去做克隆(涉及授权),没有中间档。现在有了中间档——在已有音色的基础上做相对修改,改完还能存下来反复用。
以前想改一个音色,只有三条笨路
做有声书、播客、短视频配音的人大概都碰过这个问题:声音大体对了,就差一点点。但 API 给的选择只有三种:
- 只用 30 个预置音色。 谷歌列了 30 个录音棚音色(Puck、Kore、Zephyr 这些名字),再加一个「扩展音色库」,几百个跨语言跨口音的声音。听着很多,但你要的那个「四十岁、有点疲惫、语速偏慢的男声」,大概率不在里面。
- 用文字从零设计(Voice design)。 描述年龄、音色、口音、基准语气,得到一个
voice_...ID。问题是每次生成都是重新掷一次骰子——你没法说「就要刚才那个,只是再低半度」。 - 录一段做克隆(Voice replication)。 这需要真人素材,涉及肖像/声音授权,不是所有项目都能用。
Voice remixing 就是卡在「设计」和「克隆」之间的那一档:以已有音色为锚点,只描述相对要改的方向。官方文档里的原话是,你不用再从零设计一个声音人格,只要提供一个 base_voice 加一段相对描述。
怎么用:一个 POST,两个必填字段
技术上非常朴素。调的还是 Voice design 用的那个端点 POST /v1beta/voices,区别是多了一个 base_voice 字段:
- 必填
voice.type = "prompted"、voice.prompted.base_voice、voice.prompted.input store: true(remix 出来的音色必须存进项目,才能拿到 ID 复用)voice.model可以不写,默认就是gemini-3.8-flash-tts
Python 里核心就这几行:
remixed = client.voices.create(
store=True,
voice={
"model": "gemini-3.8-flash-tts",
"type": "prompted",
"prompted": {
"base_voice": "Puck",
"input": "Make the voice sound slightly older and more grounded, "
"with a warm British accent and measured audiobook pacing.",
},
},
)
print(remixed.id) # voice_abc123...返回里有三样东西:新的 voice_... ID、prompted.base_voice(记录它从谁派生来的)、以及一段 sample_audio 试听——24kHz 的 WAV,base64 编码,可以直接落盘听。
拿到 ID 之后,合成跟平时一模一样,把它塞进 speech_config 就行:
interaction = client.interactions.create(
model="gemini-3.8-flash-tts",
input=[{"type": "user_input", "content": [{
"type": "text",
"text": "Chapter One. The fog rolled quietly across the harbor at dawn.",
"annotations": [{"type": "speech_metadata", "style": "calm and reflective"}],
}]}],
response_format={"type": "audio"},
generation_config={"speech_config": [{"voice": remixed.id}]},
)一个容易忽略的细节:这个 voice_... ID 同时能用在旗舰的 gemini-3.8-flash-tts 和便宜的 gemini-3.8-flash-lite-tts 上。也就是说,同一个音色,做有声书时用贵的那个求质量,做实时客服时切到便宜的那个求速度,音色是同一套。
三个设计上的「讲究」,决定了它好不好用
第一,原音色永不被改。 官方特别用了一个提示框说明:remix 永远生成一个全新的独立 voice_... 资源,不会修改或覆盖原来的 base_voice;而且你之后把原音色删了,派生出来的那些也不受影响。这条很重要——意味着你可以拿一个公共音色当模板,给十个角色各派生一个版本,互不干扰。
第二,可以一层层往下调。 因为 remix 出来的东西本身也是一个存储音色,它能当下一次 remix 的 base_voice。官方的例子是:先从一个已存音色出发,要求「保持同一个说话人和口音,但语气更平静、更轻、音高略低」,得到新的变体;不满意就再来一轮。这实际上给了你一条可追溯的调音链,每次都能查到「我是从哪个音色、用什么 prompt 改出来的」。
第三,input 是相对描述,不是从零描述。 这是最容易用错的地方。你在 input 里写「一个年轻女性」这种从零设定,效果不如写「比原音色年轻五岁、语速快一点、更有活力」。官方给的可改维度是年龄、音高、能量、音色(timbre)、口音这几类,外加节奏之类的表达方式。
价格:现在便宜,明年 1 月 1 日翻倍
这块必须说清楚,因为它有个明确的时间点。
按官方定价页(Standard 付费层,每 100 万 token):
- 输入文本:现在 $0.50;2027 年 1 月 1 日起 $1.00
- 输出音频:现在 $9.00;2027 年 1 月 1 日起 $18.00
- 官方换算:$0.00225 / 10 秒音频(现在),$0.0045 / 10 秒(明年起)
- 官方注明:音频 token 是每秒 25 个 token
换成大家好理解的单位:按现在的价,一分钟音频约 $0.0135,一小时约 $0.81;明年 1 月 1 日之后翻倍,一小时约 $1.62。批量(Batch)和 Flex 层是半价($0.25 输入 / $4.50 输出),优先级(Priority)层更贵($0.90 / $16.20)。
注意,这个价格没有区分「是不是 remix 出来的音色」——官方定价页没有为音色创建单独列价,按文档描述,它走的是同一套 token 计费。真正花钱的是合成音频那一步,remix 本身只是产生一个几秒的试听样本。
限制:四条硬边界,别踩
- 一次多人对话最多 2 个说话人,而且只能是预置音色。 想把两个自定义音色放进同一段对话?不行。官方要求逐人分别合成,再自己拼音频。拼的时候还有个坑:默认返回的 WAV 带 44 字节 RIFF 头,直接拼会插入杂音,要么请求
audio/l16原始 PCM,要么先剥头。 - 存储音色有上限和保质期。 每个项目最多 200 个 stateful 音色(设计出来的、remix 出来的、存储的克隆共享这 200 个名额),1 年不用就过期(
expire_time)。好消息是每次拿它合成、或每次把它当base_voice再 remix,都会把 1 年重新计时。 - 无状态音色只有 7 天。 如果你用
store=false的voicekey_...,7 天就失效。适合一次性试听,不适合上线。 - 要付费账户。 Voice remixing 要求 Gemini API 项目至少是 Tier 1(付费层),免费层用不了。
另外两个属于 TTS 本身的约束,顺手记一下:模型只吃文字、只出音频;上下文是 8,192 输入 token / 16,384 输出 token。语言方面,旗舰的 Flash TTS 支持 130 多种语言,Flash-Lite 支持 100 多种,输入语言自动识别。
适用场景:谁最该用
现在就该试的:
- 做有声书 / 长播客的:一本书里十个角色,用同一个基座音色派生十个变体,比从零设计十个稳定得多,也不用担心某个角色下次生成跑偏。
- 做系列化短视频配音的:固定一个「账号音色」,每期只微调情绪和节奏,品牌感能保住。
- 做多语言版本的:先在一个语言上调好音色,再看能不能靠口音描述派生到别的语种(注意:
input支持描述口音,但官方没有承诺跨语言音色一致性,这块要自己 A/B)。
不适用场景(先别急着上):
- 需要克隆真人声音的:remix 不是克隆。它只能在已有音色上做相对修改,不能拿一段录音变出新音色(那是 Voice replication 的事,且涉及授权)。
- 需要一次生成三人以上对话的:单请求最多 2 人,且只支持预置音色,多人自定义音色必须自己拼。
- 对成本极敏感的:明年 1 月 1 日价格翻倍这件事,做预算时要按新价算。
避坑清单
- 别把
input写成从零设定,写成「相对原音色改什么」。 - 别指望 remix 完立刻听到完整效果——返回的
sample_audio只是几秒试听,正式效果要自己合成一段长文本验证,尤其是长文本下的音色漂移。 - 别拿预置音色名硬编码到生产环境里不记录——派生关系存在
prompted.base_voice字段里,把它存进你自己的数据库,后面才好追溯。 - 别在多人对话里混用自定义音色和预置音色,会上不去。
- 别忽略 200 个音色的项目上限。批量生产角色音之前先算一下,不然中途会撞墙。
行动建议
第一步,今天就能做:拿 Puck 或 Kore 当 base_voice,写一句「更老、更慢、更沉」的描述,跑一次 voices.create,把返回的 sample_audio 存下来听。十分钟能验证这个功能到底适不适合你的场景。
第二步,如果听着对,做一次对照实验:同一段 300 字文本,用原音色和 remix 音色各合成一遍,比较长文本后半段的稳定性——这是 TTS 最容易翻车的地方。
第三步,把 voice_... ID 和它的 base_voice + input 一起写进配置管理,别散落在代码里。音色是资产,prompt 是它的来源说明。
参考来源
- https://ai.google.dev/gemini-api/docs/changelog
- https://ai.google.dev/gemini-api/docs/voice-remixing
- https://ai.google.dev/gemini-api/docs/speech-generation
- https://ai.google.dev/gemini-api/docs/models/gemini-3.8-flash-tts
- https://ai.google.dev/gemini-api/docs/pricing
- https://ai.google.dev/gemini-api/docs/voice-design