ChatTTS 中文文档 下载 App

批量文本推理——一次 infer() 合成多条语音

基本用法

texts = [
    "第一条语音内容",
    "第二条语音内容",
    "第三条语音内容",
]

wavs = chat.infer(texts)

# wavs 是 list[np.ndarray],长度 = 输入条数
for i, wav in enumerate(wavs):
    print(f"第 {i+1} 条:{len(wav)/24000:.1f} 秒")

批量比逐条快多少

批量推理的优势在于共享模型加载开销——模型只加载一次,后续推理在同一个 session 中进行。实测:

如果你的场景需要生成大量语音,务必用批量输入。

批量 + 不同说话人

批量推理时不能给每条文本指定不同说话人——InferCodeParams 里的 spk_emb 是整个 infer 调用共用一个。如果需要不同说话人:

# 方案一:每次换说话人嵌入
for text in texts:
    spk = chat.sample_random_speaker()
    wav = chat.infer(
        text,
        params_infer_code=ChatTTS.Chat.InferCodeParams(spk_emb=spk)
    )

# 方案二:批量但用同一个说话人
wavs = chat.infer(texts, params_infer_code=ChatTTS.Chat.InferCodeParams(spk_emb=same_spk))

批量 + 不同韵律

批量推理同样无法给每条文本单独设置不同的 params_refine_text。如果需要不同韵律风格,只能分多次 infer 调用。

批量大小建议

硬件推荐批量大小
4 GB VRAM5~10 条
8 GB VRAM10~20 条
16 GB+ VRAM20~50 条

批量太大会导致显存不足——如果遇到 CUDA OOM,降低批量大小即可。

完整示例

import ChatTTS
import torch
import torchaudio

chat = ChatTTS.Chat()
chat.load(compile=True)  # 开启 compile,批量推理受益更大

rand_spk = chat.sample_random_speaker()

texts = [
    "欢迎收听今天的节目。",
    "首先是第一条新闻。",
    "接下来是天气预报。",
    "最后是一个小贴士。",
    "感谢大家的收听,下期再见。",
]

params_refine_text = ChatTTS.Chat.RefineTextParams(prompt='[oral_5]')
params_infer_code = ChatTTS.Chat.InferCodeParams(spk_emb=rand_spk)

wavs = chat.infer(
    texts,
    params_refine_text=params_refine_text,
    params_infer_code=params_infer_code
)

# 批量保存
for i, wav in enumerate(wavs):
    tensor = torch.from_numpy(wav).unsqueeze(0)
    torchaudio.save(f"episode_01_{i}.wav", tensor, 24000)

print(f"完成 {len(wavs)} 条语音")