ChatTTS-ui 音色定制 3 种方式实操:固定音色、种子值与 pt 文件转换
【免费下载链接】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 的音色由 speaker 目录 下的文件和数字种子共同决定:csv 文件存固定音色、pt 文件存转换后的音色、纯数字则按种子现场生成。下面按"换音色 → API 指定音色 → 保存、转换与批量生成音色文件"三条任务线讲清楚具体操作。
先分清三种音色来源
网页上"音色"听着玄乎,落到代码里就是一组 768 维的浮点向量,有三种拿到它的方式:
- csv / pt 文件:speaker 目录 里预置了 2222、7869、6653、4099、5099 等数十个 csv 文件,每个文件一行一个数,共 768 个,直接决定合成声音的特征。启动时 uilib/utils.py 的
get_speakers()会扫描该目录下所有 csv 和 pt 文件,填进网页的下拉框。 - 数字种子:填一个不存在的数字(如 3000、9000),app.py 会用
torch.manual_seed(数字)加上模型自带统计量算出一个随机音色向量,并顺手存成speaker/数字.csv。也就是说,你在网页上随便填个数字合成一次,这个音色就被固化下来了。 - 转换后的 pt 文件:0.96 内核升级后,外部下载的旧 pt 音色需要先转换才能使用,方法见下文。
网页端切换音色:下拉框与自定义音色值输入框
源码部署后默认访问http://127.0.0.1:9966(地址可在 .env 的WEB_ADDRESS中修改)。templates/index.html 页面上有两个入口:
- "选择音色"下拉框:列出 speaker 目录下已保存的 csv / pt 文件,选中即使用该文件。
- "自定义音色值"输入框:填写大于 0 的整数(如 2000、8000)。一旦填写,就会忽略左侧下拉框的选择,按该种子取值;网页端还会同时发送
text_seed(控制文本润色的随机性,默认 42)。
想试听某个陌生数字,直接填进输入框合成一句即可,听感合适的话该数字对应的 csv 已经自动生成在 speaker 目录里了。
用 API 请求指定音色:voice、custom_voice 与 prompt
服务跑起来后,/tts接口接受 POST 请求,音色相关参数如下:
| 参数 | 默认 | 作用 |
|---|---|---|
voice | 2222 | 音色文件名或种子数字 |
custom_voice | 0 | 大于 0 时优先生效,忽略voice |
prompt | 空 | 控制笑声、停顿等,如[oral_2][laugh_0][break_6] |
temperature/top_p/top_k | 0.3 / 0.7 / 20 | 采样随机性 |
最小调用示例,custom_voice传 8888 就是让服务按种子 8888 取(或生成)音色:
import requests res = requests.post("http://127.0.0.1:9966/tts", data={ "text": "自定义音色测试", "custom_voice": 8888, "prompt": "[oral_2][laugh_0][break_6]", "temperature": 0.3, "top_p": 0.7, "top_k": 20, }) print(res.json())这一步做的事:发一段文字给合成服务,指定音色种子和语气控制符。成功后返回code:0,audio_files里带 wav 文件的绝对路径与可下载 url;文件名中会内嵌seed、te、tp、tk等本次参数,方便回头对照。
固定一个满意的音色到 csv 文件
数字种子生成的音色满意后,它其实已经以 csv 形式躺在 speaker 目录里。如果想手动保存一个自己算出来的向量(768 维 torch 张量),用项目现成的工具函数即可:
import torch from uilib import utils # rand_spk: shape 为 (768,) 的 torch 张量 utils.save_speaker("my_voice", rand_spk)这一步把张量逐行写成speaker/my_voice.csv,下次启动服务它就会出现在下拉框中。反向读取由同一文件里的load_speaker()完成,接口处理voice=2222时会先找speaker/2222.csv直接加载,而不重新随机。
一条命令转换旧版 pt 音色文件
ChatTTS 0.96 之后内核升级,从外部站点下载的旧格式 pt 音色(如seed_2155_restored_emb.pt)不能直接用了。项目自带的 cover-pt.py 就是干这件事的:
- 把下载到的文件放进 speaker 目录,保持
seed_开头、_emb.pt结尾的默认命名; - 在项目根目录执行:
python cover-pt.py这一步会加载模型,把 speaker 目录下所有匹配命名的文件重新编码,输出以-covert.pt结尾的新文件(例如seed_2155_restored_emb-covert.pt),并提示你删掉原始_emb.pt。macOS 上脚本会自动设置 MPS 回退开关,直接运行即可;如果目录里没有可转换的文件,它会明确提示并结束。
批量生成候选音色做试听
想从种子空间里挑音色,可以写个小脚本按批量采样,再配合上面的转换脚本处理:
import torch import ChatTTS chat = ChatTTS.Chat() chat.load(source="custom", custom_path="./") for seed in (1111, 2222, 3333, 4444): torch.manual_seed(seed) spk = chat.sample_random_speaker() torch.save(spk, f"speaker/seed_{seed}_emb.pt")这一步按固定种子各生成一个 768 维音色向量并落盘。生成后运行一次python cover-pt.py统一转成可用格式,再用网页或 API 逐个合成试听,保留听感好的那几个即可。
几个容易踩的坑
- 同一种子换台机器声音会不同。项目 faq.md 开头就声明:不同机器用相同种子生成的音色可能不同,同一机器多次生成也可能漂移,尤其音调。所以跨机器迁移音色请携带 csv/pt 文件,而不是只记数字。
custom_voice会覆盖voice。两个都传时只有前者生效,写批量脚本时别指望二者叠加。- 显存低于 4G 会被强制走 CPU。
.env里device可手动指定cpu | mps | cuda,默认按显存自动选择;跑在 CPU 上和 GPU 上同一文件音色本身一致,但生成新种子时的随机音色不受此影响。 - 下拉框里没有数字音色。列表只来自磁盘上的文件,纯数字要填"自定义音色值"输入框,填一次后 csv 就会补进列表。
把听感合适的 csv 留在 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),仅供参考