ChatTTS 控制标签体系——oral、laugh、break、uv_break、lbreak 全解读
两种控制方式
ChatTTS 提供两套互补的韵律控制手段:
- 全局 prompt——通过
params_refine_text.prompt给模型一个韵律偏好提示(例如"口语化 + 笑 + 停顿") - 局部内联标签——直接在文本里插入标签,精确控制某句话、某个词的韵律
两套可以同时使用,但如果用了内联标签,通常配合 skip_refine_text=True 效果更可控。
全部标签列表
| 标签 | 取值范围 | 含义 |
|---|---|---|
[oral_0] ~ [oral_9] | 0 ~ 9 | 口语化程度。0 = 完全书面,9 = 非常口语化(带语气词、停顿多) |
[laugh_0] ~ [laugh_2] | 0 ~ 2 | 笑声强度。0 = 不笑,2 = 明显笑 |
[break_0] ~ [break_7] | 0 ~ 7 | 停顿等级。数字越大停顿越长 |
[uv_break] | 固定 | 短停顿(约等于 break_3~4),常用于句中语气转换 |
[lbreak] | 固定 | 长停顿(约等于 break_6~7),常用于句末或段落间 |
使用示例
内联标签(skip_refine_text=True)
text = '你好[uv_break]朋友们,听说今天是个好日子[laugh][lbreak]'
wavs = chat.infer(text, skip_refine_text=True)
全局 prompt
params_refine_text = ChatTTS.Chat.RefineTextParams(
prompt='[oral_2][laugh_0][break_4]',
)
wavs = chat.infer(text, params_refine_text=params_refine_text)
标签是怎么被处理的
ChatTTS 内部有一个"文本精炼"(Refine Text)模块,它会先对原始输入文本做一轮处理:
- 把控制标签替换成模型能理解的特殊 token
- 根据 prompt 中指定的风格,自动在合适的位置补充停顿、语气词
- 把精炼后的 token 序列送入解码器生成音频
如果 skip_refine_text=True,就跳过自动补充步骤,只保留你写的内联标签——适合完全手动控制的场景。
设计哲学
ChatTTS 的标签体系是故意做得"模糊"的:
[oral_5]不是一个精确的口语化值,而是告诉模型"请用中等口语化的风格"- 同一个标签在不同上下文中的效果可能不一样
- 模型在韵律上有一定随机性,即使参数相同,每次生成的语音也会有细微差异
这种设计让语音听起来更像真人说话,而不是机械复读。