docs: 添加Piper TTS部署方案(Ubuntu)
@@ -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 按文本哈希缓存,避免重复生成
|
||||||
|
```
|
||||||
Reference in New Issue
Block a user