docs: 添加Piper TTS部署方案(Ubuntu)

2026-08-02 12:34:25 +08:00
parent bb2d74db52
commit c1a0e508b2
+260
@@ -0,0 +1,260 @@
# Piper TTS 部署方案(Ubuntu)
## 1. 方案说明
`spanish-diary` 的朗读采用双引擎策略:
```text
系统 Web Speech API 优先
手机无 TTS 语音或浏览器不支持时
自动回退到自建 Piper TTS
```
Piper 是轻量级本地神经网络 TTS,支持西班牙语、英语、中文,适合 CPU 服务器部署。
本项目不会单独启动 Piper 服务,而是由 `spanish-diary` 后端直接调用 Piper 命令行生成 WAV,并按“语言 + 文本”缓存,避免重复生成。
## 2. 安装基础依赖
```bash
sudo apt update
sudo apt install -y python3-venv python3-pip espeak-ng
```
## 3. 安装 Piper
```bash
sudo mkdir -p /opt/piper
sudo python3 -m venv /opt/piper/venv
sudo /opt/piper/venv/bin/pip install --upgrade pip
sudo /opt/piper/venv/bin/pip install piper-tts
```
验证:
```bash
/opt/piper/venv/bin/piper --help
```
## 4. 下载语音模型
创建模型目录:
```bash
sudo mkdir -p /opt/piper/voices
cd /opt/piper/voices
```
下载英语:
```bash
sudo curl -L -o en_US-lessac-medium.onnx https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/en/en_US/lessac/medium/en_US-lessac-medium.onnx
sudo curl -L -o en_US-lessac-medium.onnx.json https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/en/en_US/lessac/medium/en_US-lessac-medium.onnx.json
```
下载西班牙语:
```bash
sudo curl -L -o es_ES-davefx-medium.onnx https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/es/es_ES/davefx/medium/es_ES-davefx-medium.onnx
sudo curl -L -o es_ES-davefx-medium.onnx.json https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/es/es_ES/davefx/medium/es_ES-davefx-medium.onnx.json
```
下载中文:
```bash
sudo curl -L -o zh_CN-huayan-medium.onnx https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/zh/zh_CN/huayan/medium/zh_CN-huayan-medium.onnx
sudo curl -L -o zh_CN-huayan-medium.onnx.json https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/zh/zh_CN/huayan/medium/zh_CN-huayan-medium.onnx.json
```
国内服务器如果无法访问 Hugging Face,可以把下载地址中的 `huggingface.co` 替换为 `hf-mirror.com`,例如:
```text
https://hf-mirror.com/rhasspy/piper-voices/resolve/v1.0.0/es/es_ES/davefx/medium/es_ES-davefx-medium.onnx
```
## 5. 测试 Piper
```bash
echo 'Hola, buenos días' | /opt/piper/venv/bin/piper \
--model /opt/piper/voices/es_ES-davefx-medium.onnx \
--output_file /tmp/hola.wav
```
生成后检查:
```bash
ls -lh /tmp/hola.wav
```
英语和中文同理:
```bash
echo 'Good morning' | /opt/piper/venv/bin/piper --model /opt/piper/voices/en_US-lessac-medium.onnx --output_file /tmp/en.wav
echo '早上好' | /opt/piper/venv/bin/piper --model /opt/piper/voices/zh_CN-huayan-medium.onnx --output_file /tmp/zh.wav
```
## 6. 配置 spanish-diary 后端
`spanish-diary` 后端通过环境变量读取 Piper 配置:
```text
PIPER_BIN
PIPER_MODELS_DIR
TTS_CACHE_DIR
```
创建 systemd 配置覆盖文件:
```bash
sudo mkdir -p /etc/systemd/system/spanish-diary.service.d
sudo tee /etc/systemd/system/spanish-diary.service.d/piper.conf > /dev/null <<'EOF'
[Service]
Environment=PIPER_BIN=/opt/piper/venv/bin/piper
Environment=PIPER_MODELS_DIR=/opt/piper/voices
Environment=TTS_CACHE_DIR=/opt/spanish-diary/server/data/tts_cache
EOF
```
创建缓存目录并设置权限:
```bash
sudo mkdir -p /opt/spanish-diary/server/data/tts_cache
sudo chown -R spanish-diary:spanish-diary /opt/spanish-diary/server/data
```
重新加载并重启:
```bash
sudo systemctl daemon-reload
sudo systemctl restart spanish-diary
```
## 7. 测试后端 TTS 接口
先登录获取 Cookie:
```bash
curl -c /tmp/cookies.txt \
-X POST http://127.0.0.1:5000/api/login \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"admin123"}'
```
调用 TTS:
```bash
curl -b /tmp/cookies.txt \
-X POST http://127.0.0.1:5000/api/tts \
-H "Content-Type: application/json" \
-d '{"text":"Hola","lang":"es"}' \
--output /tmp/hola.wav
```
检查返回文件:
```bash
file /tmp/hola.wav
ls -lh /tmp/hola.wav
```
支持语言:
```text
es:西班牙语
en:英语
zh:中文
```
## 8. 前端回退逻辑
前端 `speech.js` 的行为:
```text
1. 浏览器支持 Web Speech API 且已加载系统语音
→ 使用手机/电脑系统 TTS
2. 浏览器不支持,或语音列表始终为空
→ 调用 /api/tts 获取 Piper WAV
3. 后端缓存相同文本
→ 直接返回缓存音频,不重复生成
```
## 9. 缓存目录
Piper 生成结果缓存在:
```text
/opt/spanish-diary/server/data/tts_cache
```
文件名格式:
```text
es_xxxxxxxxxxxxxxxxxxxxxxxx.wav
en_xxxxxxxxxxxxxxxxxxxxxxxx.wav
zh_xxxxxxxxxxxxxxxxxxxxxxxx.wav
```
清理缓存:
```bash
sudo systemctl stop spanish-diary
sudo find /opt/spanish-diary/server/data/tts_cache -name '*.wav' -delete
sudo systemctl start spanish-diary
```
## 10. 常见问题
### 10.1 接口返回 503:Piper 未配置或未安装
检查环境变量是否已写入 systemd:
```bash
systemctl cat spanish-diary | grep PIPER
```
检查 Piper 可执行文件:
```bash
ls -l /opt/piper/venv/bin/piper
```
### 10.2 提示模型不存在
确认模型文件在 `/opt/piper/voices`:
```bash
ls -lh /opt/piper/voices
```
### 10.3 生成失败,提示 espeak-ng
Piper 依赖 espeak-ng:
```bash
sudo apt install -y espeak-ng
```
### 10.4 缓存目录无权限
```bash
sudo mkdir -p /opt/spanish-diary/server/data/tts_cache
sudo chown -R spanish-diary:spanish-diary /opt/spanish-diary/server/data
sudo systemctl restart spanish-diary
```
### 10.5 浏览器中朗读没有声音
- 确认已通过 `http://localhost:5000` 或域名访问,而不是本地 `file://`
- 确认当前用户已登录
- 手机系统有 TTS 语音包时优先使用系统语音;没有时自动回退 Piper
## 11. 总结
```text
1. 安装 espeak-ng 和 piper-tts
2. 下载 es/en/zh 三个 Piper 模型
3. 配置 spanish-diary 的 PIPER_BIN、PIPER_MODELS_DIR、TTS_CACHE_DIR
4. 重启 spanish-diary
5. 前端系统 TTS 不可用时自动回退 Piper
6. WAV 按文本哈希缓存,避免重复生成
```