ChatTTS-ui离线语音合成:断网一次跑通实战
【免费下载链接】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 可以同时拿到网页界面和 TTS API。本文按"先联网跑通、再整体搬到断网机"的思路走:在一台有网的机器上备好模型与依赖,整体迁移后离线验证,全程不用碰源码。
断网机器第一次启动会卡在哪
很多人直接把代码拷到断网机器上就运行,结果程序在第一步就停下——app.py 启动时会先找本地模型,找不到就尝试联网下载(优先 HuggingFace,连不上再走 ModelScope 魔塔)。模型只是第一道坎,第二道是 pip 装依赖,同样需要网络。
所以离线部署没有神秘的"离线开关",程序本身就是"本地优先"逻辑:你要做的只是提前备好两样东西——完整的模型目录、装好的 Python 依赖环境。
模型文件到底丢哪个目录
答案是固定的models目录,目录约定写在 uilib/cfg.py 里,启动时会自动创建。需要预置的内容如下:
| 路径 | 内容 |
|---|---|
models/pzc163/chatTTS/asset/ | 模型权重:Vocos.safetensors、DVAE.safetensors、Decoder.safetensors、Embed.safetensors、gpt/、tokenizer/、spk_stat.pt |
models/pzc163/chatTTS/config/ | path.yaml 等配置文件 |
具体文件名以 ChatTTS/config/config.py 中的默认值为准,拷贝前对照一遍。别把它放到项目根目录的asset/下,程序只认models/。
除了模型还有什么会卡网络
就是 Python 依赖:requirements.txt 里的 torch、transformers、vocos 等,外加 torch 自己的大轮子(几百 MB)。这些都必须在离线机装好,第一次python app.py才会真正进入加载模型环节。
最短路径:联网机上 5 分钟跑通服务
这一步一石二鸟:既验证环境没问题,又顺手把模型缓存在models/里,后面整体打包带走。🚀
cd /data/chattts && git clone https://gitcode.com/GitHub_Trending/ch/ChatTTS-ui . python3 -m venv venv && source ./venv/bin/activate pip3 install -r requirements.txt && pip3 install torch==2.7.1 torchaudio==2.7.1 python3 app.py注意两点:Python 必须 3.9–3.11,3.12 会报 dynamo 错误;需要 GPU 加速时把 torch 换成 cu128 源安装,且要求 NVIDIA 显卡显存大于 4G、系统装好 CUDA 12.8+。
启动后浏览器会自动打开http://127.0.0.1:9966,在页面输入中英混排文本点合成,能听到声音即算成功。
如何把整套环境搬到断网机器
联网机跑通后只做三件事:依赖打包、模型拷贝、整体迁移。📦
离线依赖包怎么一键打包
在与离线机相同操作系统、相同 CPU 架构、相同 Python 版本的联网机上执行:
pip download -r requirements.txt -d ./offline_packages pip download torch==2.7.1 torchaudio==2.7.1 -d ./offline_packages pip freeze > requirements-offline.txt然后把offline_packages和requirements-offline.txt拷到离线机,与代码放同一目录,用pip install --no-index --find-links=./offline_packages -r requirements-offline.txt完成安装。
三个提醒:torch 的轮子与平台绑定,架构不匹配就装不上;要 GPU 版就下载 torch 时加--index-url https://download.pytorch.org/whl/cu128;pynini、WeTextProcessing 这几个包只有 Linux 能装,离线机若是 Windows 请留意 requirements.txt 里的平台标记。
除依赖外还要带什么
| 要搬的东西 | 来源 | 放到离线机的位置 |
|---|---|---|
整个models/目录 | 联网机程序目录 | 相同相对路径 |
.env文件 | 程序根目录 | 相同位置 |
speaker/(可选) | 音色 .csv / .pt 文件 | 相同位置 |
offline_packages | 刚打包的 | 与代码同级 |
离线机不用 GPU 的话,装 CPU 版 torch 即可,无需 CUDA。用到音频拼接、转码功能时系统需要有 ffmpeg,把可执行文件放进ffmpeg/目录,目录内附了获取说明。
场景分叉:个人、内网、高并发怎么跑
.env里一共三个变量:WEB_ADDRESS、device、compile。默认值127.0.0.1:9966意味着只有本机能用,按场景改:
| 场景 | WEB_ADDRESS | device | 附加建议 |
|---|---|---|---|
| 个人单机 | 保持默认 | default(自动选 CUDA/MPS/CPU) | 8GB 内存、纯 CPU 就够 |
| 内网共享 | 192.168.x.x:9966或0.0.0.0:9966 | default | 防火墙放行 9966 端口 |
| 长文本 / 高频合成 | 0.0.0.0:9966 | cuda(显存 >4G) | compile=true开启 torch.compile |
内网部署只改WEB_ADDRESS为服务器内网 IP,同事浏览器访问http://IP:9966就能用网页界面、调 API。
高并发要注意:ChatTTS-ui 是单进程服务,请求多了会排队。GPU 机上多开几个实例、各占一个端口是最简单的横向扩展;偏好容器化的话,仓库自带 docker-compose 的 cpu/gpu 两套编排文件,把当前目录挂进容器即可复用同一套models/。
怎么确认离线服务真的断了网
断网机启动后,做两个动作就能闭环。🩺
第一步,看控制台:出现模型下载进度说明本地models/pzc163/chatTTS不完整,回到上一节补文件;没有任何下载动作,说明全部命中本地。
第二步,直接打一次 API:
curl -X POST 'http://127.0.0.1:9966/tts' -d 'text=离线合成测试成功' -d 'voice=2222'返回 JSON 里code为 0、且带url字段就通了,这个 url 可直接播放;想直接拿音频文件就加一个-d 'wav=1'。
常用可选参数(text必填,其余都有默认值):
| 参数 | 默认 | 说明 |
|---|---|---|
| voice | 2222 | 音色种子数,或 speaker/ 里的音色文件名 |
| prompt | 空 | 控制符,如[laugh_0][break_6] |
| temperature / top_p / top_k | 0.3 / 0.7 / 20 | 采样参数,越大声音越飘 |
| skip_refine | 0 | 置 1 跳过文本精修,出音更快 |
| is_stream | 0 | 置 1 走流式输出 |
现象 → 原因 → 解法
断网机启动不了别慌,先查这张表(更详细的讨论在 faq.md):🔧
| 现象 | 原因 | 解法 |
|---|---|---|
| 启动后仍尝试联网下载模型 | models/pzc163/chatTTS缺失或不完整 | 把联网机的models/整目录拷过来覆盖 |
FileNotFoundError: ...config/path.yaml | 模型包不全(魔塔源缺该文件) | 手动补config/path.yaml到对应目录 |
合成时报Missing spk_stat.pt | 魔塔模型包缺这个文件 | 把 spk_stat.pt 复制到models/pzc163/chatTTS/asset/ |
下载模型时ProxyError | ModelScope 不允许走代理下载 | 关闭代理后重试 |
Dynamo is not supported on Python 3.12 | Python 版本过高 | 换 Python 3.9–3.11 重建环境 |
| GPU 机器推理仍走 CPU 或很慢 | 装了 CPU 版 torch 或显存不足 4G | 重装 cu128 版 torch,装好 CUDA 12.8+ |
cannot find a working triton installation | 当前环境不支持 torch.compile | 把.env的compile改为false |
跑起来之后还能做什么
- 固定音色:把 .csv 或 .pt 音色文件放进
speaker/目录,API 的voice传对应文件名即可。注意同一音色值在不同机器上音调可能有差异,跨设备交付前要试听。 - 清理音频:合成的 wav 都堆在
static/wavs/,调POST /clear_wavs可一键清空,避免磁盘写满。 - 看日志:运行日志落在
logs/目录,按天滚动保留 5 份,合成异常时先翻这里。
下一步建议:先用 curl 压一轮/tts接口记录单次合成耗时,再决定要不要上 GPU 或多实例扩容。
【免费下载链接】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),仅供参考