skip_refine_text=True——完全手动控制韵律的开关
什么时候需要 skip_refine_text
默认情况下,ChatTTS 会对输入文本做自动精炼——在合适的位置补充停顿、插入语气词、根据 oral 级别调整口语化程度。
这个默认行为在大多数场景下够用,但如果你:
- 已经手动在文本里写好了所有停顿和语气词位置
- 不希望模型"自作主张"再加额外的语气词
- 需要精确复现某段语音的韵律结构
那就应该开 skip_refine_text=True。
对比示例
默认行为(自动精炼)
text = '我今天去了超市买了牛奶面包水果。'
wavs = chat.infer(text)
模型会自动在"超市""牛奶"等关键词后面补充 [uv_break],在句尾加 [break_4],并且根据默认 oral 设置插入语气词。实际生成的语音可能比原文本长。
skip_refine_text=True(只听你写的)
text = '我今天去了超市[uv_break]买了牛奶[uv_break]面包[laugh_0]水果。'
wavs = chat.infer(text, skip_refine_text=True)
模型只处理你写的那两个 uv_break 和 laugh_0,不额外添加任何停顿或语气词。
典型用法
text = '[oral_6]你好[uv_break]朋友们[laugh_1][lbreak]今天聊个话题'
wavs = chat.infer(text, skip_refine_text=True)
这段代码的效果完全由文本里的标签决定:整体 oral_6 风格、"你好"后面短停顿、轻微笑意、话题切换处长停顿。模型不做任何额外改动。
注意事项
- 开 skip_refine_text 时,一定记得在文本里自己加停顿标签——不然整段话会读得非常机械
- 如果你只在 prompt 里设了
params_refine_text但没开 skip_refine_text,prompt 里的设置仍然生效(prompt 走的是精炼步骤) - 对于需要精确复刻的场景(例如模仿某段现成语音的节奏),skip_refine_text 是必需的
与 InferCodeParams 的关系
skip_refine_text 只控制文本精炼步骤,不影响推理代码阶段。温度采样、top-P、speaker embedding 等参数仍然生效。
rand_spk = chat.sample_random_speaker()
wavs = chat.infer(
text,
skip_refine_text=True,
params_infer_code=ChatTTS.Chat.InferCodeParams(
spk_emb=rand_spk,
temperature=0.3,
)
)