ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

ChatTTS 对话式 TTS 模型实战:从安装部署到细粒度韵律控制的完整指南

ChatTTS 对话式 TTS 模型实战:从安装部署到细粒度韵律控制的完整指南 ChatTTS 对话式 TTS 模型实战从安装部署到细粒度韵律控制的完整指南【免费下载链接】ChatTTSA generative speech model for daily dialogue.项目地址: https://gitcode.com/GitHub_Trending/ch/ChatTTS本文基于 ChatTTS 仓库的官方韩语文档docs/kr/README.md并结合仓库源码系统讲解这个面向日常对话场景的生成式语音模型的定位、能力边界、完整的安装部署流程以及最核心的多说话人采样、RefineTextParams/InferCodeParams参数控制、句级与词级韵律标记[laugh]、[uv_break]、[lbreak]等和流式音频生成的实战用法。读完本文你可以独立完成从克隆仓库到产出可控韵律音频的全链路操作并理解每个控制参数在源码中的实际作用。项目定位为对话任务设计的 TTS 模型ChatTTS 是一个为对话类任务例如 LLM 助手语音交互而设计的文本转语音TTS模型其设计目标是输出自然、富表现力的对话语音。根据官方文档该项目当前支持语言英语、中文持续扩展中英文仍处于实验阶段核心特点对话式 TTS针对对话场景优化支持多说话人可用于交互式对话细粒度控制可预测并控制笑声、停顿、插入语等韵律细节增强韵律在韵律表现上优于多数开源 TTS 模型并提供预训练权重支持二次研究。数据与模型规模方面官方说明如下适用前提当前仓库所公开的权重主模型使用100,000 小时的中英文音频数据训练公开下载的是40,000 小时预训练模型且未应用 SFT监督微调因此稳定性与最终效果存在差距公开模型仅限学术用途。路线图截至文档版本40,000 小时模型与 spk_stats 文件已开源、流式音频生成已实现、DVAE 编码器与零样本推理代码已开源多情感控制与 ChatTTS.cppC 推理后端仍待完成。许可证与反滥用机制使用前必须了解两个层面的限制这在源码与文档中均被强调对象许可证说明代码AGPLv3见 LICENSE模型权重CC BY-NC 4.0仅教育与研究用途禁止商业或非法使用面免责/反滥用设计为防止技术被恶意滥用官方在 40,000 小时模型训练末期加入了少量高频率噪声并将音频质量尽量压缩后以MP3 格式提供团队同时训练了内部检测模型计划后续开源。理解这一点有助于解释为何输出音质带有一定的压缩感。环境准备与依赖安装1. 克隆仓库git clone https://gitcode.com/GitHub_Trending/ch/ChatTTS cd ChatTTS2. 安装依赖方式一直接安装pip install --upgrade -r requirements.txt方式二Conda 环境推荐隔离conda create -n chattts conda activate chattts pip install -r requirements.txt对照 requirements.txt 可以看到核心依赖包括numpy3.0.0、numba规范化器中 JIT 加速、torch2.1.0、torchaudio、transformers4.41.1BertTokenizerFast、vocos声码器、gradioWebUI、pybase16384说话人编码、pydub/av音频处理等。其中pynini2.1.5、WeTextProcessing、nemo_text_processing仅在Linux 平台sys_platform linux引入它们对应命令行示例中的中英文文本规范化器见后文 examples/cmd/run.py 的load_normalizer。可选vLLM仅 Linuxpip install safetensors vllm0.2.7 torchaudiovLLM 路径对应源码中Chat._load(..., use_vllmTrue)分支当gpt.is_vllm为真时推理会走 ChatTTS/model/velocity 目录下的引擎llm_engine.py、model_runner.py、sampler.py等结构上仿照 vLLM 的调度器/块管理器实现而 ChatTTS/core.py 中_infer_code对 vLLM 与非 vLLM 有两条独立的生成路径。不推荐的两个选项官方文档明确给出警告原样保留结论TransformerEngineNVIDIA GPU仅 Linux不要安装适配工作尚处于开发中目前无法正常工作仅限开发目的。相关 issue 为 #672 与 #676。FlashAttention-2主要面向 NVIDIA GPU不要安装据上游 transformers 仓库 issue #26990FlashAttention-2 在当前场景下会降低生成速度。这两个警告与源码相互印证ChatTTS/core.py 的load()暴露了use_flash_attn参数而 ChatTTS/model/cuda/patch.py 与te_llama.py正是 TransformerEngine/FlashAttention 的适配层——从源码结构看这部分仍是实验性代码路径。三种安装方式# 1. 从 PyPI 安装稳定版 pip install ChatTTS # 2. 从 GitHub 源安装最新版 pip install githttps://gitcode.com/GitHub_Trending/ch/ChatTTS # 3. 本地目录开发模式安装 pip install -e .开发模式安装的打包逻辑见 setup.py。快速开始WebUI 与命令行以下命令必须在项目根目录执行。运行 WebUI基于 Gradiopython examples/web/webui.py命令行推理python examples/cmd/run.py Your text 1. Your text 2.生成的音频会保存为当前目录下的./output_audio_n.mp3n 为序号。结合 examples/cmd/run.py 的argparse定义该脚本支持完整参数如下参数类型/默认值作用texts位置参数argparse.REMAINDER待合成的文本列表--spkOptional[str]默认None指定说话人编码字符串缺省时调用chat.sample_random_speaker()随机采样--stream布尔开关启用流式模式逐块输出并分别保存再拼接总文件--sourcelocal/huggingface/custom默认local模型来源--custom_path默认空自定义模型资产目录配合--source custom从 examples/cmd/run.py 可以看到命令行推理本质上是chat.infer(texts, stream, params_infer_codeChatTTS.Chat.InferCodeParams(spk_embspk))的一层封装先加载模型采样/取用说话人再按InferCodeParams(spk_embspk)固定音色进行合成音频经pcm_arr_to_mp3_view转 MP3 落盘。Python API 基础用法与加载参数最小可用示例import ChatTTS import torch import torchaudio chat ChatTTS.Chat() chat.load(compileFalse) # 性能导向可设为 True texts [PUT YOUR 1st TEXT HERE, PUT YOUR 2nd TEXT HERE] wavs chat.infer(texts) for i in range(len(wavs)): 视 torchaudio 版本差异第一行或第二行可能生效。 try: torchaudio.save(fbasic_output{i}.wav, torch.from_numpy(wavs[i]).unsqueeze(0), 24000) except: torchaudio.save(fbasic_output{i}.wav, torch.from_numpy(wavs[i]), 24000)采样率24000 Hz不是随意写死的在 ChatTTS/config/config.py 的FeatureExtractorInitArgs中Vocos 特征提取器即配置为sample_rate24000, n_fft1024, hop_length256, n_mels100声码器输出即该采样率的波形。load()的完整参数源码级文档示例只展示了chat.load(compileFalse)而 ChatTTS/core.py 中load()的完整签名还包括多个实战有用选项chat.load( sourcelocal, # huggingface / local / custom force_redownloadFalse, # 强制重新下载模型资产 compileFalse, # torch.compile 加速仅对 cuda 设备生效 custom_pathNone, # sourcecustom 时的本地资产目录 deviceNone, # 指定设备默认自动选择 coefNone, # DVAE 的 codec 系数字符串一般不填 use_flash_attnFalse, # 官方警告目前不建议开启 use_vllmFalse, # 需要安装 vllm走 velocity 推理引擎 experimentalFalse, enable_cacheTrue, )几个值得注意的实现细节均以 ChatTTS/core.py 为准模型资产与校验download_models按source分为三条路径——local当前工作目录按 ChatTTS/res/sha256_map.json 逐个校验 sha256缺失才下载、huggingfacesnapshot_download拉取2Noise/ChatTTS允许*.yaml/*.json/*.safetensors、custom仅校验不下载。资产路径模板定义在 ChatTTS/config/config.py 的Pathasset/Vocos.safetensors、asset/DVAE.safetensors、asset/gpt、asset/Decoder.safetensors、asset/tokenizer、asset/Embed.safetensorscompile的实际生效条件gpt.prepare(compilecompile and cuda in str(device))即只有 CUDA 设备下compileTrue才真正编译设备回退device_gpt在 MPS 设备下强制回退 CPUVocos 在 mps/npu 下也回退 CPU 执行这是 Apple Silicon 用户能跑通的原因之一unload()提供显式卸载接口删除vocos/gpt/decoder/dvae/tokenizer/embed六个模块后重置内部状态。infer()的完整参数源码级ChatTTS/core.py 中infer()的签名比文档示例丰富得多各参数默认值如下chat.infer( text, streamFalse, # 流式生成返回 generator langNone, # zh / enNone 时自动检测 skip_refine_textFalse, # 跳过文本润色阶段词级控制必须开启 refine_text_onlyFalse, # 只输出润色后的文本 use_decoderTrue, # True 用独立 DecoderFalse 用 DVAE 解码 do_text_normalizationTrue,# 文本规范化数字、标点等 do_homophone_replacementTrue, # 同音字纠错替换 split_textTrue, # 按 。 或 .后跟空白切分长句 max_split_batch4, # 每批最多句数 params_refine_textRefineTextParams(), params_infer_codeInferCodeParams(), )其中split_text的切分逻辑在源码中是re.split(r(?。)|(?\.\s), text)见 ChatTTS/core.py即按中文句号或英文句点空格做 lookbehind 切分多句输入时系统会先合成第一句再用sample_audio_speaker从第一句波形中编码出spk_smp说话人提示供后续句子复用从而保证长文本内音色一致——这正是 ChatTTS/core.py 中spk_smp is None分支的作用。文本规范化为什么错字会被自动纠正do_homophone_replacement背后的实现是 ChatTTS/norm.py 的Normalizer类其处理流水线为语言检测统计中文字符与英文单词数量取多者_detect_language按语言规范化[标签]会被_split_tags单独抽出保护起来避免被规范化器破坏再拼回_combine_tags无效字符清理reject_pattern仅保留中日韩汉字、英文字母与。、,. 空格其余字符被替换/剔除半角转全角中文场景与标点统一→、→。等映射表同音字纠错基于 ChatTTS/res/homophones_map.json 的映射表用 numba JIT 的_fast_replace以 utf-16 编码快速逐字替换。该映射表据源码注释由 1200 万词条语料清洗后约 180 万条、结合约 18 万误读词统计构建。这意味着送入模型前的文本会先经过一轮发音安全处理特殊韵律标签[laugh]等在此过程中被显式保护这是后文词级控制能生效的前提。高级用法说话人采样与两级推理参数1. 采样说话人################################### # 从高斯分布采样一个说话人。 rand_spk chat.sample_random_speaker() print(rand_spk) # 保存该字符串用于日后恢复同一音色rand_spk是一个自包含的字符串编码可以随时打印、保存、复用以恢复音色。其实现链路在 ChatTTS/model/speaker.py配置类GPT中spk_emb_dim 192见 ChatTTS/config/config.py即说话人向量是 192 维_sample_random执行randn(dim) * std mean均值/标准差来自Config.spk_stat中用 base16384 编码的预训练统计量因此采样结果落在训练分布内_encode将 float16 向量经LZMA 极限压缩 base16384 编码变成字符串所以打印出来是一大串乱码字符——这不是哈希而是可逆的压缩表示合成时Speaker.applyChatTTS/model/speaker.py会反解字符串、做 L2 归一化然后把所有[spk_emb]位置的嵌入直接替换为该说话人向量torch.where条件替换从而在解码前就锁定音色。此外还有一个反向操作chat.sample_audio_speaker(wav)可从一段波形经 DVAE 编码反推说话人编码用于零样本复刻参考音频的音色。2. 句级控制RefineTextParams与InferCodeParamsChatTTS 的推理是两阶段的第一阶段_refine_text让 GPT 把输入文本润色成带韵律标记的文本对应RefineTextParams第二阶段_infer_code再生成音频 token对应InferCodeParams。文档示例如下################################### # 句级手动控制。 # 使用 oral_(0-9), laugh_(0-2), break_(0-7) # 在文本中生成特殊韵律 token。 params_refine_text ChatTTS.Chat.RefineTextParams( prompt[oral_2][laugh_0][break_6], ) wavs chat.infer( texts, params_refine_textparams_refine_text, params_infer_codeparams_infer_code, )prompt会被 ChatTTS/model/speaker.py 的decorate_text_prompts包装成[Sbreak]{文本}[Pbreak]{prompt}送入润色阶段引导模型在输出中插入对应强度0~9 / 0~2 / 0~7的口语化程度、笑声、停顿标记。润色后的 token 会先被过滤到break_0_ids以下再解码为文本ChatTTS/core.py这些标记随文本进入第二阶段。两个参数类的完整默认值摘自 ChatTTS/core.py 的数据类定义ChatTTS/core.pyRefineTextParams文本润色阶段字段默认值说明prompt韵律引导如[oral_2][laugh_0][break_6]top_P0.7top-p 采样top_K20top-k 采样temperature0.7温度repetition_penalty1.0重复惩罚max_new_token384最大新 token 数min_new_token0最小新 token 数show_tqdmTrue进度条ensure_non_emptyTrue保证输出非空空输出重采样manual_seedNone手动随机种子InferCodeParams音频 token 生成阶段继承自上表字段默认值说明prompt[speed_5]默认引导语速等级spk_embNone说话人编码字符串如sample_random_speaker()返回值spk_smpNone由参考音频编码的说话人 prompt多句自动填充txt_smpNone参考文本 prompttemperature0.3注意比润色阶段低音频解码更保守repetition_penalty1.05略高于 1抑制 token 循环max_new_token2048每句音频 token 上限stream_batch24流式模式下每批 token 数stream_speed12000流式切片步长采样点数pass_first_n_batches2流式模式丢弃前 N 个 batch预热temperature在代码层面还支持传列表按 4 个 VQ 层级分别设置见 ChatTTS/core.pynum_vq4来自配置中 4 层向量量化levels(5,5,5,5)音频词表 626 个 token、文本词表 21178 个见 ChatTTS/config/config.py 的GPT/Embed定义。3. 词级控制skip_refine_text与文本内嵌标签句级控制是引导模型去加标记而词级控制是把韵律标签直接写进文本并跳过润色阶段让模型严格照读################################### # 词级手动控制。 text What is [uv_break]your favorite english food?[laugh][lbreak] wavs chat.infer(text, skip_refine_textTrue, params_refine_textparams_refine_text, params_infer_codeparams_infer_code) try: torchaudio.save(word_level_output.wav, torch.from_numpy(wavs[0]).unsqueeze(0), 24000) except: torchaudio.save(word_level_output.wav, torch.from_numpy(wavs[0]), 24000)文档 FAQ 中明确当前公开模型可控制的 token 为[laugh]、[uv_break]、[lbreak]词级以及润色阶段的oral_(0-9)、laugh_(0-2)、break_(0-7)句级更多情感控制留待后续版本开源。skip_refine_textTrue的必要性可以从 ChatTTS/core.py 印证若不跳过_refine_text会重写文本你手工放置的标签位置就无法保证跳过之后文本经规范化标签被_split_tags保护直接进入_infer_code。另外ChatTTS/model/speaker.py 的decorate_code_prompts会在送入编码前把文本中的[Stts]、[spk_emb]、[empty_spk]占位符剥离避免与内部特殊 token 冲突对应上游 issue #459 的修复。4. 官方示例带韵律标记的自我介绍文档附带了一个英文示例英文输出仍为实验性完整保留inputs_en chat T T S is a text to speech model designed for dialogue applications. [uv_break]it supports mixed language input [uv_break]and offers multi speaker capabilities with precise control over prosodic elements like [uv_break]laughter[uv_break][laugh], [uv_break]pauses, [uv_break]and intonation. [uv_break]it delivers natural and expressive speech,[uv_break]so please [uv_break] use the project responsibly at your own risk.[uv_break] .replace(\n, ) params_refine_text ChatTTS.Chat.RefineTextParams( prompt[oral_2][laugh_0][break_4], ) audio_array_en chat.infer(inputs_en, params_refine_textparams_refine_text) torchaudio.save(self_introduction_output.wav, torch.from_numpy(audio_array_en[0]), 24000)流式音频生成文档将流式音频生成列为已完成路线项对应infer(streamTrue)。从源码看其机制ChatTTS/core.py生成按stream_batch24个 token 一批推进每个 batch 完成即解码出一段波形前pass_first_n_batches2个 batch 被直接丢弃continue用于跳过不稳定预热段之后按stream_speed12000个采样点的步长切片yield最后一段按能量阈值1e-5裁掉静音列。仓库提供了完整的流式消费者示例 examples/cmd/stream.py其ChatStreamer类负责把生成器输出缓冲、按 8000 点基础块累积转为PCM16 字节流float_to_int16i2小端并以 24000 Hz 单声道 16 位通过 PyAudio 播放play(streamchat, wait5)先预缓冲 5 秒再开播适配 CPU 等慢速设备。命令行版本则可用python examples/cmd/run.py --stream 第一段文本 第二段文本流式输出会分别保存每个块文件再拼接出完整output_audio_n.mp3。常见问题FAQQ1需要多少显存推理速度如何官方文档给出的数字生成约 30 秒音频片段最少需要4GB 显存在 4090 GPU 上约每秒生成 7 个语义 token 对应的音频RTF 约 0.3。这些是文档口径的参考值实际受use_vllm、compile、批次与序列长度影响。Q2模型偶发不稳定多说话人场景下音色/音质波动官方解释这是自回归模型bark、valle 等的固有难题当前最佳实践是多次采样、择优保留。这也解释了infer默认ensure_non_emptyTrue空输出自动重试与manual_seed参数的存在。Q3除了笑声还能控制其他情感吗当前公开模型可控制的 token 仅[laugh]、[uv_break]、[lbreak]以及句级的oral_/laugh_/break_强度档位更多情感控制计划在后续版本中开源见路线图中的多情感控制功能未勾选项。延伸阅读与仓库内相关路径韩语原文档docs/kr/README.md并排提供 英文、简体中文、日文、俄文、西班牙文、法文 版本官方提示韩语文档可能滞后于英文主文档以英文版为最新基准核心 API 与两阶段推理ChatTTS/core.py模型结构与词表配置ChatTTS/config/config.py说话人采样/编码ChatTTS/model/speaker.py文本规范化与同音字纠错ChatTTS/norm.py、ChatTTS/res/homophones_map.json分词器BertTokenizerFast、[spk_emb]/[break_0]/[Ebreak]特殊 tokenChatTTS/model/tokenizer.pyvLLM 推理引擎velocity 目录ChatTTS/model/velocity示例WebUI examples/web/webui.py、命令行 examples/cmd/run.py、流式 examples/cmd/stream.py、ONNX 导出 examples/onnx/exporter.py依赖清单requirements.txt、打包setup.py、协议LICENSE使用提醒公开权重仅限学术与研究方向音频输出自带训练期注入的高频噪声与 MP3 压缩特性属于官方反滥用设计的一部分集成到自己的 LLM 助手前请先在本地充分验证稳定性并遵守 CC BY-NC 4.0 对模型权重的使用限制。【免费下载链接】ChatTTSA generative speech model for daily dialogue.项目地址: https://gitcode.com/GitHub_Trending/ch/ChatTTS创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表