批量文本推理——一次 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 中进行。实测:
- 单条推理:每次都需要模型"热身"
- 批量 10 条:总耗时大约是单条的 3~5 倍,远低于 10 倍
如果你的场景需要生成大量语音,务必用批量输入。
批量 + 不同说话人
批量推理时不能给每条文本指定不同说话人——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 VRAM | 5~10 条 |
| 8 GB VRAM | 10~20 条 |
| 16 GB+ VRAM | 20~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)} 条语音")