ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

ChatTTS 西班牙语官方文档精讲:面向日常对话的 TTS 模型安装、推理与韵律控制实战

ChatTTS 西班牙语官方文档精讲:面向日常对话的 TTS 模型安装、推理与韵律控制实战 ChatTTS 西班牙语官方文档精讲面向日常对话的 TTS 模型安装、推理与韵律控制实战【免费下载链接】ChatTTSA generative speech model for daily dialogue.项目地址: https://gitcode.com/GitHub_Trending/ch/ChatTTS本文以 ChatTTS 仓库的西班牙语官方文档 docs/es/README.md 为主体结合仓库中 ChatTTS/core.py、examples/cmd/run.py 等源码完整讲解这个面向 LLM 对话场景的语音生成模型的定位、安装流程、WebUI/命令行/Python API 三种使用方式以及spk_emb、temperature、[oral_*]、[laugh_*]、[break_*]等参数和韵律控制标记的底层实现读完后可独立完成部署、推理与细粒度语音控制。一、项目定位为对话场景优化的 TTSChatTTS 是一个专为 LLM assistant 等对话场景设计的文本转语音text-to-speech模型。西班牙语文档对其三大特性的概括如下TTS Conversacional对话式 TTS针对对话任务优化能够合成自然、富表现力的语音并支持多说话人multi-speaker便于生成交互式对话。Control Fina细粒度控制模型可以预测并控制韵律上的细节特征包括笑声risas、停顿pausas和语气词interjecciones。Mejor Prosodia更优韵律在韵律表现上超过多数开源 TTS 模型项目提供预训练模型以支持后续研究与开发。支持语言方面官方清单为英语English中文Chino其他语言持续跟进中数据集与模型规模文档原样声明仅用于学术用途主模型使用超过100,000 小时中英文音频数据训练开源版本托管于 HuggingFace 的2Noise/ChatTTS是40,000 小时预训练模型未经 SFT微调。**路线图Hoja de Ruta**中已完成项为公开 40k 小时基础模型与spk_stats文件未完成项包括开源 VQ 编码器与 LoRA 训练代码、不经过文本精化的流式音频生成、多情绪控制版本以及ChatTTS.cpp社区 PR 欢迎。免责声明Descargo de Responsabilidad值得特别注意文档明确说明仓库仅用于学术目的并解释了两项限制措施——在 40,000 小时模型的训练过程中加入了少量高频噪声并将音频以 MP3 格式尽可能压缩音质以防止恶意用途同时官方表示内部已训练一个检测模型并计划未来开源。代码协议为 AGPLv3模型权重为 CC BY-NC 4.0不可商用。二、安装与环境准备西班牙语文档给出的安装方式为从源码安装文档标注该包“即将上架 PyPI”pip install githttps://github.com/2noise/ChatTTS从仓库当前 requirements.txt 可以看到核心依赖约束torch2.1.0、torchaudio、transformers4.41.1、vocos、vector_quantize_pytorch、numba、gradio、pybase16384、av、pydub等其中pynini2.1.5、WeTextProcessing、nemo_text_processing这三个文本归一化依赖仅限 Linux 平台安装。这对应了 examples/cmd/run.py 中load_normalizer()的行为——命令行示例会尝试注册英文NeMo与中文WeTextProcessing归一化器失败时降级为警告而不中断。两种推荐安装方式方式 1直接安装pip install --upgrade -r requirements.txt方式 2使用 conda 独立环境conda create -n chattts conda activate chattts pip install -r requirements.txt从源码结构看chat.load()还支持sourcehuggingface/local/custom、device、use_flash_attn、use_vllm、experimental、enable_cache等更多参数模型校验依赖 ChatTTS/res/sha256_map.json 逐文件比对哈希详见 ChatTTS/core.py。三、快速上手WebUI 与命令行推理文档的Inicio Rápido快速开始给出两条路径执行前请确保处于项目根目录1. 启动 WebUIpython examples/web/webui.py对应实现位于 examples/web/webui.py 与 examples/web/funcs.py。从 funcs.py 的源码可以看到WebUI 预置了 “Timbre1~Timbre9” 共 9 种音色其本质是固定随机种子1111、2222、…、9999下调用sample_random_speaker()得到的说话人嵌入——也就是说预置音色与 API 的随机音色出自同一套高斯采样机制。2. 命令行推理python examples/cmd/run.py Please input your text.文档说明音频将保存到./output_audio_xxx.wav按当前仓库 run.py 的实现实际产物为output_audio_{index}.mp3通过tools.audio.pcm_arr_to_mp3_view编码。该脚本的完整参数为[--spk xxx] [--stream] [--source ***] [--custom_path XXX] Your text 1. Your text 2.--spk指定音色传入sample_random_speaker()生成的字符串缺省时随机采样--stream启用流式模式--source模型来源huggingface/local/custom三选一--custom_path自定义模型目录其余位置参数为待合成文本可一次传多条。--stream模式下的完整流式播放链路可参考 examples/cmd/stream.py其中ChatStreamer类按 24000 Hz、16 位单声道 PCM 组织字节流并优先缓冲一段再播放适合 CPU 等生成较慢的环境。四、Python API基础用法文档Básico一节的最小可用示例代码原样继承输出采样率 24000 Hzimport ChatTTS from IPython.display import Audio import torchaudio import torch chat ChatTTS.Chat() chat.load(compileFalse) # Set to True for better performance texts [PUT YOUR TEXT HERE,] wavs chat.infer(texts) torchaudio.save(output1.wav, torch.from_numpy(wavs[0]), 24000)结合 ChatTTS/core.py 的infer()实现可以明确几个行为细节infer()默认split_textTrue若输入是单个字符串会先按换行符或。/.断句切分再逐段推理最后把各段音频拼接并裁掉首尾静音阈值1e-5返回每个合成句会经历两阶段流水线_refine_text文本精化可插入韵律标记→_infer_code自回归生成语义/声学 token再经 DVAE 解码 Vocos 声码器还原波形见_decode_to_wavs多句输入且未指定spk_smp时源码会先推理第一句再用sample_audio_speaker()从该句音频反推说话人提示从而保证整批文本音色一致core.py L440-L458。五、进阶用法说话人控制与韵律标记文档Avanzado一节完整给出三级控制示例这里原样保留并结合源码逐段解析################################### # Sample a speaker from Gaussian. rand_spk chat.sample_random_speaker() print(rand_spk) # save it for later timbre recovery params_infer_code ChatTTS.Chat.InferCodeParams( spk_emb rand_spk, # add sampled speaker temperature .3, # using custom temperature top_P 0.7, # top P decode top_K 20, # top K decode ) ################################### # For sentence level manual control. # use oral_(0-9), laugh_(0-2), break_(0-7) # to generate special token in text to synthesize. 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, ) ################################### # For word level manual control. 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) torchaudio.save(output2.wav, torch.from_numpy(wavs[0]), 24000)5.1 说话人嵌入spk_emb的生成与复用chat.sample_random_speaker()的实现在 ChatTTS/model/speaker.py以随模型发布的spk_stats均值与标准差base64 解码后为 float16 张量为参数做高斯采样randn * std mean再把结果 float16 序列化 LZMA 压缩 base64 编码成一个字符串。打印并保存这个字符串即可在之后的会话中原样恢复同一音色timbre recovery。推理时Speaker.apply()会把该嵌入按 L2 归一化后写入输入序列中[spk_emb]占位符对应位置的嵌入向量decorate_code_prompts()则把每条文本包装成[Stts][spk_emb]{文本}[Ptts]的提示模板。5.2 两个参数数据类的完整字段与默认值文档示例只展示了部分字段。以 ChatTTS/core.py L184-L208 的dataclass定义为准完整参数如下表这是比文档更可直接落地的取值参考RefineTextParams文本精化阶段作用于 refine 子模型字段类型默认值说明promptstr句级控制提示如[oral_2][laugh_0][break_6]top_Pfloat0.7核采样nucleus阈值top_Kint20top-K 解码temperaturefloat0.7采样温度repetition_penaltyfloat1.0重复惩罚max_new_tokenint384最大新生成 token 数min_new_tokenint0最少生成 token 数show_tqdmboolTrue是否显示进度条ensure_non_emptyboolTrue强制非空输出manual_seedOptional[int]None手动随机种子InferCodeParams代码生成阶段继承自 RefineTextParams覆盖默认值字段类型默认值说明promptstr[speed_5]默认速度档位提示spk_embOptional[str]None高斯采样得到的说话人字符串spk_smpOptional[str]None从参考音频反推的说话人提示多句自动对齐用txt_smpOptional[str]None参考文本temperaturefloat0.3注意默认比 refine 阶段更低repetition_penaltyfloat1.05重复惩罚max_new_tokenint2048最大生成长度stream_batchint24流式生成的 batch token 数stream_speedint12000每批流式输出的采样数24 kHz 下约 0.5 秒pass_first_n_batchesint2流式时跳过的首批批次数stream_speed12000与pass_first_n_batches这两个字段的消费逻辑见_infer中流式分支每生成一批先解码整段再按length ~ length stream_speed切片yield首批前 2 批直接丢弃以降低首包延迟感。5.3 句级控制 vs 词级控制句级RefineTextParams.promptoral_(0-9)控制口语化程度、laugh_(0-2)控制笑声倾向、break_(0-7)控制停顿倾向。这些标记写在 prompt 里由 refine 子模型在文本精化阶段“自动”把相应标记插入到文本的合理位置——适合不想逐词手动标注的场景。词级skip_refine_textTrue直接在原文中手写[uv_break]停顿、[laugh]笑、[lbreak]短句断点并传skip_refine_textTrue跳过精化阶段标记位置完全由用户掌控确定性最高。六、官方示例模型自我介绍文档附带一个可直接运行的英文示例文档注明“English is still experimental”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 [laugh]like like [uv_break]laughter[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, ) # English is still experimental. 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(output3.wav, torch.from_numpy(audio_array_en[0]), 24000)文档同时提供了男声、女声两个效果对比音频见 docs/es/README.md 原文中的 male/female speaker 表格展示了同一文本在不同spk_emb下的音色差异。七、常见问题FAQ解析文档Preguntas y Respuestas给出三条高频问题与官方答复1. 需要多少显存推理速度如何对一段30 秒音频至少需要4 GB GPU 显存。以 RTX 4090 为例可生成约每秒 7 个语义 token的音频实时率RTF约0.3即生成速度约为实时的 3 倍。2. 模型稳定性不够好出现多说话人串音或音质差怎么办官方承认这是自回归模型如 bark、valle的共性难题通常难以完全避免建议多次采样挑选满意的结果。这与InferCodeParams中temperature/top_P/top_K可调、以及RefineTextParams.manual_seed支持固定种子复现的设计相互印证。3. 除了笑声还能控制什么能否控制其他情绪当前发布版本中token 级控制单元仅有[laugh]、[uv_break]、lbreak三类官方表示未来可能开源具备更多情绪控制能力的模型。这也解释了RefineTextParams.prompt中可用的oral_/laugh_/break_档位组合以及路线图里 “Multi-emotion controlling” 仍未勾选的原因。八、可进一步深入的仓库文件索引围绕本文内容以下仓库路径适合继续深挖ChatTTS/core.pyChat主类、load/infer/_refine_text/_infer_code完整推理链路ChatTTS/model/speaker.py说话人高斯采样、编码解码与提示模板拼装ChatTTS/model/tokenizer.py基于 BertTokenizerFast 的编码、[spk_emb]/[break_0]/[Ebreak]特殊 token 定义ChatTTS/res/homophones_map.json 与 ChatTTS/norm.py推理前的同音字替换与文本归一化examples/api/基于 FastAPI 的 API 服务与 OpenAI 兼容接口示例tests/testall.sh 及 tests/ 目录按 GitHub issue 编号组织的回归测试脚本可用sh tests/testall.sh逐一运行验证。最后重申文档的合规边界模型权重为 CC BY-NC 4.0仅限学术与科研用途不得用于商业或非法目的官方已通过训练期高频噪声注入与 MP3 音质压缩来限制其被滥用于伪造语音的风险。【免费下载链接】ChatTTSA generative speech model for daily dialogue.项目地址: https://gitcode.com/GitHub_Trending/ch/ChatTTS创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表