ChatTTS 与大语言模型助手集成——让 AI 回复"说出来"
核心思路
整个集成链路很简单:
用户提问 → LLM 生成文字回复 → ChatTTS 转语音 → 播放 / 发送语音
LLM 部分可以是任何支持 API 的模型(GPT-4、Claude、豆包、通义千问…)。关键是处理好 LLM 输出的文字——可能包含代码块、Markdown、多段落——需要先过滤掉不适合语音的内容再送进 ChatTTS。
基本骨架代码
import ChatTTS
import torch
import torchaudio
# 1. 初始化 ChatTTS(进程启动时做一次)
chat = ChatTTS.Chat()
chat.load(compile=True) # 编译一次,后续推理快
spk = chat.sample_random_speaker()
# 2. 获取 LLM 回复(伪代码,替换成你的 LLM API 调用)
llm_reply = call_llm("帮我写一段关于天气预报的简短介绍")
# 3. 文本预处理
clean_text = preprocess_for_tts(llm_reply)
# 4. ChatTTS 推理
wavs = chat.infer(
clean_text,
params_infer_code=ChatTTS.Chat.InferCodeParams(
spk_emb=spk,
temperature=0.3,
top_P=0.7,
top_K=20,
)
)
# 5. 输出
audio_path = save_audio(wavs[0], "reply.wav")
send_to_user(audio_path)
文本预处理要点
LLM 的输出直接扔给 ChatTTS 可能效果不好,建议处理:
- 去掉代码块:``
python ...`` 这部分文字读出来毫无意义 - 去掉 Markdown 标记:
**加粗**、# 标题、[链接](url)等 - 分句:长段落按句号/换行拆分成短句再送批量推理
- 限制长度:单次 infer 不宜超过几百字,太长的文本分段处理
批量对话集成
多轮对话时可以:
dialogue_history = []
while True:
user_input = input("你:")
dialogue_history.append(user_input)
reply = call_llm(dialogue_history)
dialogue_history.append(reply)
# 语音化回复
wav = synthesize(reply)
play(wav)
典型应用
| 应用 | 做法 |
|---|---|
| 语音化的 ChatBot | 直接把 LLM 回复喂给 ChatTTS |
| 交互式剧情游戏 | LLM 生成分角色台词 + ChatTTS 每句话采样不同音色 |
| 播客自动生成 | LLM 生成分段脚本 + ChatTTS 朗读合成 |
| 语音翻译 | 翻译模型输出目标语言文本 + ChatTTS 朗读 |
注意事项
- LLM 回复可能很长——ChatTTS 单次推理建议控制在几百字内
- LLM 输出的代码、表格、Markdown 标记要过滤掉
- 如果追求流畅性,可以在预处理时手动添加
[uv_break]等控制标签 - 流式语音生成正在开发中,当前版本需要等 LLM 完整输出后才能开始合成