CentOS8部署ChatTTS实战指南:从环境配置到避坑全解析
背景:为什么要在Cent机顶盒里塞一个“会说话”的大脑
ChatTTS凭借媲美真人的韵律停顿,已经被大量用在客服、有声书、视频解说等场景。可一旦把它搬到 CentOS8,就会发现“官方只给了 Ubuntu 一键脚本”,CentOS8 缺库、缺驱动、缺编译链,SELinux 还天天拦路。本文把踩过的坑全部摊开,给你一条能复制粘贴的 CentOS8 专属路线。环境准备:CentOS8 与 7 的“代沟”先捋清
2.1 系统要求
- 最小 8C16G,生产建议 32 G 起步,模型一次进内存 5 G+
- CentOS 8.5 及以上,内核 ≥ 4.18(支持 io_uring,后面音频缓冲用得到)
2.2 与 CentOS7 差异速览
- 默认 Python3.6,但 ChatTTS 需要 ≥3.8,得手动编译或启用 module
- yum → dnf,epel-release 包名变化
- CentOS7 用 nvidia-440 即可,CentOS8 建议 525+,否则 torch2.1 会报“CUDA capability sm_86”
- SELinux 策略从 targeted 升到 mls,不关闭就要自己写布尔值
2.3 一次装齐依赖
# 1. 启用 powertools 与 epel sudo dnf config-manager --set-enabled powertools sudo dnf -y install epel-release # 2. 开发全家桶 sudo dnf groupinstall -y "Development Tools" sudo dnf -y install cmake3 ninja-build gcc-toolset-11 \ openssl-devel bzip2-devel libffi-devel \ xz-devel readline-devel sqlite-devel \ wget git vim # 3. 升级 git(CentOS8 自带 2.31 太低) sudo dnf -y install https://packages.endpointdev.com/rhel/8/git/x86_64/git-2.42.0-1.ep8.x86_64.rpm # 4. 安装 CUDA 12.2(示例用 runfile) wget https://developer.download.nvidia.com/compute/cuda/12.2.0/local_installers/cuda_12.2.0_535.54.03_linux.run sudo sh cuda_12.2.0_535.54.03_linux.run --toolkit --samples --override echo 'export PATH=/usr/local/cuda/bin:$PATH' >> ~/.bashrc echo 'export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc source ~/.bashrc- 分步部署:从源码到 systemd 服务
3.1 编译 Python3.10(Deadsnakes 在 CentOS8 源不全,源码最稳)
cd /usr/src sudo wget https://www.python.org/ftp/python/3.10.12/Python-3.10.12.tgz sudo tar xf Python-3.10.12.tgz cd Python-3.10.12 sudo ./configure --enable-optimizations --enable-shared sudo make -j$(nproc) altinstall sudo ln -sf /usr/local/bin/python3.10 /usr/bin/python3 sudo ln -sf /usr/local/bin/pip3.10 /usr/bin/pip3 # 解决 libpython3.10.so 找不到 echo "/usr/local/lib" | sudo tee /etc/ld.so.conf.d/python3.conf sudo ldconfig3.2 拉 ChatTTS 与模型
# 建议单独建用户,防止权限扩散 sudo useradd -r -s /bin/bash -d /opt/chatter chatter sudo mkdir -p /opt/chatter/{src,model,log} sudo chown -R chatter:chatter /opt/chatter sudo -u chatter bash -c ' cd /opt/chatter/src git clone https://github.com/2Noise/ChatTTS.git cd ChatTTS pip3 install -r requirements.txt -f https://download.pytorch.org/whl/cu121/torch_stable.html # 下载默认模型(约 1.8 G) python3 -c "import ChatTTS; ChatTTS.ChatTTS().load(compile=False, source=\"huggingface\")" '3.3 写最小启动脚本
# /opt/chatter/src/app.py import ChatTTS, torch, json, os from flask import Flask, request, Response import numpy.p as np import soundfile as sf import io app = Flask(__name__) chat = ChatTTS.ChatTTS() chat.load(compile=False, source='huggingface') # 生产可开 compile=True device = 'cuda' if torch.cuda.is_available() else 'cpu' chat.to(device) @app.route("/tts", methods=["POST"]) def tts(): data = request.json text = data.get("text", "") voice = data.get("voice", 0) if not text: return {"error": "text required"}, 400 wavs = chat.infer(text, use_decoder=True, voice_id=voice) buf = io.BytesIO() sf.write(buf, wavs[0], 24000, format='WAV') buf.seek(0) return Response(buf, mimetype="audio/wav") if __name__ == "__main__": # 单进程 + gevent,方便后面挂 nginx from gevent.pywsgi import WSGIServer WSGIServer(("0.0.0.0", 8090), app).serve_forever()3.4 systemd 托管
# /etc/systemd/system/chattss.service [Unit] Description=ChatTTS synthesis api After=network.target [Service] Type=simple User=chatter WorkingDirectory=/opt/chatter/src Environment="PATH=/usr/local/cuda/bin:/usr/local/bin:/usr/bin" ExecStart=/usr/local/bin/python3 /opt/chatter/src/app.py Restart=always RestartSec=5 [Install] WantedBy=multi-user.targetsudo systemctl daemon-reload sudo systemctl enable --now chattss- 性能调优:让 GPU 不摸鱼
4.1 torch 线程绑定
# 在 app.py 头部加 torch.set_num_threads(8) # CPU 侧 torch.cuda.set_per_process_memory_fraction(0.7, 0) # 留 30 % 给其他进程4.2 音频缓冲
- 使用 io_uring 版本的 libsndfile,可减少 15 % 的 write 延迟
sudo dnf remove libsndfile git clone https://github.com/libsndfile/libsndfile.git && cd libsndfile cmake -Build -DCMAKE_BUILD_TYPE=Release -DENABLE_IO_URING=ON sudo make install4.3 大页内存
# 临时生效 sudo sysctl -w vm.nr_hugepages=1024 # 永久 echo 'vm.nr_hugepages=1024' | sudo tee /etc/sysctl.d/99-chattss.conf- 安全配置:端口 + 权限
- 只开 8090 给内网,前端 nginx 反向代理,外网统一 443
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.0/8" port port="8090" protocol=tcp accept' sudo firewall-cmd --reload- SELinux 不关闭,只给端口
sudo semanage port -a -t http_port_t -p tcp 8090 sudo setsebool -P httpd_can_network_connect 1避坑指南:报错对照表
| 现象 | 根因 | 解决 | |---|---|---| | ImportError: libpython3.10.so.1.0 找不到 | 编译时未 --enable-shared | 重新编译 Python,并 ldconfig | | CUDA error: out of memory | 模型+音频缓存同时暴涨 | 调小 batch_size,infer 完立即 del wavs | | libsndfile.so.1 版本冲突 | CentOS8 自带与手动安装冲突 |sudo ldconfig -v | grep sndfile确认路径,必要时LD_PRELOAD| | 服务启动 5 秒后自动重启 | 日志权限不足 | 保证 /opt/chatter/log 目录对 chatter 可写 | | 合成音频卡顿 | 单进程被 nginx 复用 | 在 systemd 里加LimitNOFILE=65535|验证测试:curl 一句话
# 合成一句欢迎语 curl -X POST http://10.10.10.10:8090/tts \ -H "Content-Type: application/json" \ -d '{"text":"欢迎来到 CentOS8 语音世界","voice":0}' \ --output welcome.wav # 播放 play welcome.wav # sox 包自带若返回 200 且 wav 正常播放,即代表链路打通。
- 小结与思考题
我们已经把 ChatTTS 完整搬上了 CentOS8:从 Python3.10 编译、CUDA 驱动、systemd 守护到 SELinux 放行,每一步都给出可复制的命令。生产环境再配个 nginx + gunicorn 多进程,就能顶住并发。
思考题:如果日调用量涨到 10 万次,单卡显然撑不住。你打算如何做 ChatTTS 的负载均衡?是按 user_id 做一致性哈希,还是把模型扔进 K8s + GPU 池,再配合 NVIDIA Triton 推理服务器?欢迎留言聊聊你的方案。
—— 想先快速体验“让 AI 开口说话”的魔力,又懒得自己搭显卡机器?我顺手把同款链路搬到线上,直接戳这里 从0打造个人豆包实时通话AI 动手实验,浏览器里就能跑通 ASR+LLM+TTS 全链路,小白也能 10 分钟听到自己的第一句 AI 语音。