ChatTTS-ui 本地语音合成实战:3 分钟生成你自己的专属音色
【免费下载链接】ChatTTS-ui一个简单的本地网页界面,使用ChatTTS将文字合成为语音,同时支持对外提供API接口。A simple native web interface that uses ChatTTS to synthesize text into speech, along with support for external API interfaces.项目地址: https://gitcode.com/GitHub_Trending/ch/ChatTTS-ui
ChatTTS-ui 是一款本地网页语音合成工具:在浏览器里输入文字,直接得到语音,无需云服务、不配 API key。它内嵌 ChatTTS 模型,支持中英混杂文本,同时对外暴露 HTTP 接口方便程序调用。最有意思的是它的音色定制——一个数字就能选出生成的音色,或者把中意的音色固定成文件反复使用。下面先用 3 分钟拿到第一段音频,再逐个拆参数。
快速上手:3 分钟拿到第一段语音
准备好 Python 3.9~3.11 环境,三条命令即可:
git clone https://gitcode.com/GitHub_Trending/ch/ChatTTS-ui cd ChatTTS-ui && pip3 install -r requirements.txt python3 app.py首次启动会自动下载模型(优先 ModelScope,连不上再走 Hugging Face),稍等片刻后浏览器自动打开http://127.0.0.1:9966。在网页里输入文字、选个音色、点生成,就能听到效果。
不想用网页也可以直接调 API:
curl -X POST http://127.0.0.1:9966/tts --data "text=你好,这是一次本地语音合成测试"返回的 JSON 里有filename(本地 wav 路径)和url(可下载地址),拿到 url 直接播放即可。
音色定制核心:5 个参数决定声音长什么样
voice:决定音色的数字。内置预置音色为2222 | 7869 | 6653 | 4099 | 5099,也可以传任意数字。如果 speaker/ 目录里有同名文件(如2222.csv),就直接用文件里的音色;没有同名文件时,这个数字会当作随机种子生成一个新音色,并自动保存回 speaker 目录。它就像电视的频道号——频道有节目就播节目,没有频道就随机切台。调完效果差在哪:纯靠数字生成音色时,不同机器、甚至同一台机器重复生成,音调都可能漂移,想固定声音就不能只依赖数字。
custom_voice:大于 0 的整数种子,一旦设置就覆盖voice。类比成手动输入频道号,优先于预置菜单。适合"我就想要这一个种子对应的声音"的场景。
temperature:随机度旋钮,默认 0.3。就像音量旋钮,拧小声音更稳——设 0.1~0.2 时语调几乎不走形,适合播报;调到 0.5 以上会有更多起伏,但偶尔会读得"放飞"。
prompt:特殊标记串,例如[oral_2][laugh_0][break_6],分别控制口腔音、笑声、停顿。它像剧本里的舞台提示,告诉"演员"在哪里笑、在哪里停。空着就是正常陈述语气。
skip_refine:0 或 1。ChatTTS 合成前会先把原文润色成更适合朗读的形式(refine 阶段),设 1 跳过它,生成更快但自然度下降。像交稿前要不要审一遍:跳过快,但容易留下"生硬感"。
进阶工作流:从单条到批量
单条生成你已经会了。接下来是导入外部音色。0.96 版本内核升级后,从外部站点下载的旧格式 pt 文件不能直接用,转换流程是:把以seed_开头、_emb.pt结尾的文件放进 speaker/,然后运行 cover-pt.py:
python cover-pt.py脚本会把它们转换成以-covert.pt结尾的文件,转换完成后原文件可以删掉。
再往上就是批量产出。API 支持 GET/POST 两种请求方式,用 Python 循环调用即可,音频统一落在static/wavs/目录,文件名自带seed、te(temperature)、tp(top_p)、tk(top_k)等信息,方便回溯参数:
import requests for i in range(10): r = requests.post('http://127.0.0.1:9966/tts', data={ 'text': f'第{i}条测试文本,请查收。', 'voice': '2222', 'temperature': 0.3, 'top_p': 0.7}) print(r.json()['audio_files'][0]['url'])跑完觉得哪条参数合适,把对应音色种子记录下来或存成文件即可。目录越积越大时,可以调用/clear_wavs接口清空。
调参实战:三种常见场景的参数配方
top_k默认 20,一般不用动。下面三套组合可以直接抄:
| 场景 | 基础音色 | temperature | top_p | 特殊标记 | 一句话点评 |
|---|---|---|---|---|---|
| 正式播报 | 2222 | 0.2 | 0.6 | 不加 | 语调稳定不走形,新闻口播首选 |
| 轻松闲聊 | 7869 | 0.35 | 0.7 | [oral_1][break_2] | 带点口腔音和停顿,更像在说话 |
| 有声读物 | 4099 | 0.3 | 0.7 | [break_3] | 句间停顿拉长,长文听不累 |
不确定音色听感的话,先用几个不同数字各生成一句同样的文本对比,再定参数。
避坑清单:4 个高频问题的解法
| 症状 | 原因 | 解法 |
|---|---|---|
| 首次启动卡在下载 | 启动时自动拉模型,网络或代理问题 | 确认能连 ModelScope;用 ModelScope 下载时关掉代理 |
| 同一数字在别人机器上声音不同 | 数字只是种子,README 明确说明跨设备会有差异 | 用 speaker 目录里的同名.csv/.pt文件固定音色 |
| 外部下载的 pt 文件用不了 | 0.96 内核升级后旧格式不兼容 | 放入 speaker 目录跑python cover-pt.py转换 |
| 有 N 卡却还在用 CPU | 装的是 CPU 版 torch,或显存不足 4G | 卸载后重装 cu128 版 torch;显存低于 4G 是设计上强制回退 CPU |
部署和性能上再记三点:GPU 加速需要显存 4G 以上加 CUDA 12.8+,设备选择逻辑见 app.py;要在局域网访问,改.env里的WEB_ADDRESS(如192.168.0.10:9966);报错排查优先查 faq.md。
写在最后
一句话回顾:音色靠数字或文件,temperature管稳定,prompt管戏感,批量就是循环调 API。下一步建议用 5 个不同种子各生成一段试听,挑中意的那个存进 speaker 目录固定下来,之后所有合成都基于它微调参数即可。🎯
【免费下载链接】ChatTTS-ui一个简单的本地网页界面,使用ChatTTS将文字合成为语音,同时支持对外提供API接口。A simple native web interface that uses ChatTTS to synthesize text into speech, along with support for external API interfaces.项目地址: https://gitcode.com/GitHub_Trending/ch/ChatTTS-ui
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考