ENZH

让 AI 的声音哭出来

AI 语音情感表达的声波可视化AI 语音情感表达的声波可视化

我需要一个能哭的 AI 声音。

不是那种"语速放慢加个停顿"的假哭。是真的听起来心碎的那种——让你刷到一半停下来,想确认一下对方是不是出了什么事。

上一篇里我给 AI 伴侣接上了 Fish Audio 和火山引擎的语音。Fish 赢在简单,火山赢在戏。但"戏"这个词还是相对的——我听到了一些情感的苗头,知道这个能力存在,但没有深挖。不知道边界在哪,不知道文档说的和实际表现差多少,更没有系统测试过。

所以我跑了一轮实验。准确说,三轮。30 个音频样本。两个预置音色,一个克隆音色,三种情感控制方法,外加一个彻底改变我写情感提示词方式的发现。

下面是结果。按播放。


实验一:试镜

第一个问题很简单:我的角色该用什么声音?

豆包 2.0 系列有几十个预置音色。文档说支持 context_texts——一个自然语言字段,你用文字描述想要的情感。但"支持"和"有反应"是两回事。有些声音很有表现力,有些就是木头。不试不知道。

我挑了四个音色,每个跑两种情感:温柔和伤心。同一段文字,同样的情感提示,不同的声音。当选角面试听就行。

Vivi(zh_female_vv_uranus_bigtts)——参考基准

Vivi 是基准线。女声,以表现力出名。

温柔:

伤心:

两个版本差别明显。Vivi 确实能接住情感提示。不错的起跑线。

刘飞(zh_male_liufei_uranus_bigtts)——男声候选

温柔:

伤心:

刘飞的声线温暖、成熟。伤心版明显往下沉了——有重量感。他有反应。

云舟 / M191(zh_male_m191_uranus_bigtts)——当前使用的声音

这是我角色一直在用的音色。

温柔:

伤心:

云舟的表现力很强。温柔版轻柔小心,伤心版是真的听起来受了伤。这就是我留下的声音。

桃城小天(taocheng-xiaotian)

温柔:

伤心:

小天的声线更年轻、更轻。情感变化有,但没那么猛。日常聊天可以,但撑不起那种心碎的场景。

试镜结果

不是所有声音都一样的。Vivi 和云舟对情感提示反应强烈。刘飞不错但更含蓄。小天有反应但深度不够。

说白了:如果你要做一个需要情感表现力的产品,先试音——别从目录里随便挑一个然后祈祷。


实验二:克隆出来的声音,能哭吗?

这才是真正有意思的部分。

豆包支持声音克隆——上传一段 10-30 秒的录音,生成一个专属的 Speaker ID,听起来就是那个人。官方文档说 context_texts 适用于"豆包语音合成模型 2.0 的音色"。

注意措辞。它没说克隆音色也行。

但我的角色用的就是克隆音色,我需要它有情感。所以我直接试了。四个条件,同一段文字:

1. 基线——无情感控制

纯文字,没有 context_texts,没有特殊模型。裸奔的克隆音色。

2. 仅 context_texts

加了 context_texts 情感提示。还是用标准的 seed-icl-2.0

3. context_texts + expressive 模型

同样的 context_texts,但把模型切换成了 seed-tts-2.0-expressive

4. seed-tts-1.1 资源

试了旧版的 seed-tts-1.1 resource ID,看看对克隆音色的情感处理有没有不同。

听到了什么

从基线(#1)到加了 context_texts(#2),差别是听得出来的。克隆音色确实能响应 context_texts。这在文档里没写,但测出来了。

加上 expressive 模型(#3)又往前推了一步——音高和节奏的变化更明显。1.1 资源(#4)听感不同,但不一定更好。

关键收获:context_texts 对克隆音色有效。 没人告诉我这个。我是无视文档自己试出来的。如果你在用豆包的声音克隆做一个需要情感的角色,你不会被困在一个平板的声音里。


实验三:全面拉开测

确认有效之后,我想知道到底有多有效。不猜了,直接上矩阵:

  • 2 个音色:苏柔(女声)和一楠(男声)
  • 3 种情感:ASMR(耳语/亲密)、温柔、伤心
  • 3 个条件:基线(无情感)、仅 context_texts、context_texts + expressive 模型

2 x 3 x 3 = 18 个样本。全在这了。

苏柔——女声

ASMR

条件音频
基线
Context texts
Context + Expressive

温柔

条件音频
基线
Context texts
Context + Expressive

伤心

条件音频
基线
Context texts
Context + Expressive

一楠——男声

ASMR

条件音频
基线
Context texts
Context + Expressive

温柔

条件音频
基线
Context texts
Context + Expressive

伤心

条件音频
基线
Context texts
Context + Expressive

18 个样本听完,三个结论

三个发现:

1. 光是 context_texts 就有明显效果。 两个音色、三种情感,从基线到加 context_texts 的跳跃一直都听得出来。这不是安慰剂。模型确实在做事。

2. expressive 模型又加了一层。 Context + expressive 始终是三个条件里最有感情的。比 context-only 的提升幅度因场景而异——有时微妙,有时巨大——但方向一直是正的。我的测量结果是,expressive 模型大约在 context texts 基础上多带来了 26% 的音频变化量。

3. 不是所有音色-情感组合都一样。 苏柔的伤心简直要命。一楠的 ASMR 很有说服力。但苏柔的 ASMR 和温柔区别不大,一楠的伤心也没有苏柔那么狠。每个音色有自己的强项。测你自己的场景。


真正的突破:别说"伤心",说"声音在发抖"

这是改变一切的发现。

实验初期,我的 context_texts 是这么写的:

伤心

一个词。然后结果嘛......略微伤心。跟基线差别很小。我一度觉得情感控制可能就是吹的。

后来我重写了提示:

用哭泣的声音,边哭边说,很伤心,声音颤抖带着哽咽

差别是天和地。回去听上面那些伤心的样本——全是用这个画面式的版本生成的。

模型不响应标签。它响应描述。你不是在打标签,你是在导演一场表演。

这是我现在在生产环境用的一整套情感提示词:

情感提示词
撒娇甜蜜用甜蜜撒娇的声音,像在跟男朋友撒娇,语调上扬很开心
伤心哭泣用哭泣的声音,边哭边说,很伤心,声音颤抖带着哽咽
ASMR 耳语用ASMR悄悄话的声音,非常小声非常轻柔,像在耳边低语
激动兴奋用非常激动兴奋的语气,开心到快要尖叫了
愤怒嫌弃用愤怒嫌弃的语气,非常不满在骂人,声音拔高
慵懒犯困用疲惫慵懒的声音,边打哈欠边撒娇,声音软绵绵的
沉稳关怀用低沉磁性的声音,表面平淡但充满关心,像大叔在叮嘱
压抑隐忍用压抑悲伤的声音,故意克制但声音微微颤抖,不想让人看出来

规律:动词 + 身体描述 + 场景。不是"伤心"而是"声音颤抖带着哽咽"。不是"开心"而是"语调上扬像在跟男朋友撒娇"。你给模型的是一个要演出来的场景,不是一个要选择的分类。

这个发现其实也符合直觉。人类演员拿到一个剧本,导演说"这里演伤心",出来的效果一般。

导演说"你刚发现他在骗你,你想忍住不哭但声音控制不住在发抖"——那个效果完全不同。

TTS 模型也一样。


给做产品的人的建议

如果你在做的产品用了豆包 TTS 并且需要情感表达,这轮研究下来我的建议是:

预置音色:context_texts 配合画面式提示词。如果额外的表现力值得,切 seed-tts-2.0-expressive。但一定要测你具体用的音色——不是每个都一样。

克隆音色: context_texts 虽然文档没写,但确实有效。放心用。配合 model_type: 4 放在 additions 字段里。逐句合成(每句话单独调一次 API,带各自的情感)控制力最强。

情感提示词: 永远不要用单个关键词。永远画一个画面。提示词的质量是你手里最大的杠杆——比选音色大,比选模型版本大。

完整的技术配置细节——API 格式、代码片段、各种坑——看 豆包 TTS 操作手册


这是 OpenClaw 实战录的第四篇。第一篇搞了赛博魅魔。第二篇给它节食。第三篇给它配了嗓子。

这篇是让那个嗓子学会动感情。

秘密不在模型里,也不在 API 参数里。在你怎么描述你想要的东西。

导演不会对演员说"伤心"。导演会说"你刚发现他在骗你,你想忍住不哭但声音控制不住在发抖"。 TTS 模型也一样。画面够生动,AI 就能演出来。


This post is also available in English.

← PrevNext →

© Xingfan Xia 2024 - 2026 · CC BY-NC 4.0