微型计算机上的语音合成:从eSpeak NG到Piper TTS
语音合成技术已从机械装置发展到神经网络模型。18世纪末,带有隔膜和气囊的机械声带模拟装置能够模仿人声——例如1846年的尤法尼亚(Euphonia)乐器,通过按键和声学部件实现发声。
电子时代始于贝尔实验室的Voder(1930年),该设备通过键盘控制音调发生器、噪声源和滤波器。20世纪40至50年代的模式回放系统可重现频谱图。1961年,IBM 704计算机成功用合成方式演唱了《黛西·贝尔》。日本于1968年推出首个基于共振峰的语音合成系统。MUSA系统(1975–1978年)实现了实时意大利语语音输出。
自1980年代起,采用音素的共振峰合成成为主流;1990年代转向统计方法;2010年代则迎来端到端神经网络,如VITS模型的广泛应用。
轻量级 eSpeak NG 语音合成
eSpeak NG 是一款开源、基于共振峰的语音合成系统,不依赖真实语音样本。虽然输出声音略显机械感,但资源占用极低,非常适合 Repka-Pi 4 这类仅配备 2GB 内存的微型计算机。特别适用于警报提示和原型开发。
安装与命令行使用
更新并安装软件包:
apt update
apt install espeak-ng
查看可用语音:
espeak-ng --voices | grep Russian
合成文本:
espeak-ng "Hello Repka Pi" -v ru
多行文本可通过 heredoc 输入:
espeak-ng -v ru -s 150 << EOF
Hello world!
This very long text,
that takes several lines。
EOF
从文件读取并使用女声:
espeak-ng -v ru+f5 -s 150 -f hello-repka-pi.txt
支持语音:ru、ru+m1..m7、ru+f1..f5。
与 Python 集成
定义子进程执行函数:
import subprocess
def say(text, voice="ru", speed=150, pitch=50):
"""
voice — 语言/语音(ru, en, de)。
speed — 80–200。
pitch — 0–99。
"""
try:
subprocess.run([
"espeak-ng",
"-v", voice,
"-s", str(speed),
"-p", str(pitch),
text
], check=True, capture_output=True)
except FileNotFoundError:
print("espeak-ng not found. Install: sudo apt install espeak-ng")
except subprocess.CalledProcessError as e:
print("Error:", e.stderr.decode())
if __name__ == "__main__":
say("Hello! This test of a Russian voice.", voice="ru", speed=140)
say("Hello, this is a test in English", voice="en-us", speed=160, pitch=60)
say("Testing another Russian voice", voice="ru+f3", speed=135)
运行命令:python3 espeak-ng-test.py。
基于神经网络的 Piper TTS
Piper TTS 采用 VITS(变分推断结合对抗训练的端到端语音合成)与 ONNX 模型,在微型计算机上实现自然流畅、实时响应的语音输出。其性能远超 eSpeak NG,即使在 Repka-Pi 4 上也能保持可接受的延迟。
安装与模型配置
创建虚拟环境:
sudo apt update
sudo apt install python3-pip
python3 -m venv ~/piper_env
source ~/piper_env/bin/activate
pip install --upgrade pip
pip install piper-tts sounddevice numpy
下载俄语模型(denis-medium):
mkdir -p ~/piper-voices/ru
cd ~/piper-voices/ru
wget https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/ru/ru_RU/denis/medium/ru_RU-denis-medium.onnx?download=true -O ru_RU-denis-medium.onnx
wget https://huggingface.co/rhasspy/piper-voices/resolve/v1.0.0/ru/ru_RU/denis/medium/ru_RU-denis-medium.onnx.json?download=true -O ru_RU-denis-medium.onnx.json
命令行与 Python 执行
合成为 WAV 文件:
piper --model ~/piper-voices/ru/ru_RU-irina-medium.onnx --output_file large_text.wav <<EOF
Hello world!
This very long text...
EOF
aplay large_text.wav
从文件输入:piper --model model.onnx --output_file output.wav -f input.txt。
Python 集成方式与 eSpeak NG 类似,可通过子进程调用 piper,或直接使用其原生 API。
FastAPI 语音合成服务器
构建异步服务器以管理请求队列,可在 Repka-Pi 4 上作为 systemd 服务长期运行。
- 优势:客户端发送 HTTP POST 请求后无需等待,服务器自动排队处理任务。
- 技术栈:FastAPI + Piper TTS + 任务队列。
服务器代码示例:
from fastapi import FastAPI
import queue
import threading
from piper import PiperVoice
app = FastAPI()
voice = PiperVoice.load("~/piper-voices/ru/ru_RU-denis-medium.onnx")
task_queue = queue.Queue()
def process_queue():
while True:
text = task_queue.get()
wav = voice.synthesize(text)
# 保存或流式输出
task_queue.task_done()
threading.Thread(target=process_queue, daemon=True).start()
@app.post("/synthesize")
async def synthesize(text: str):
task_queue.put(text)
return {"status": "queued"}
systemd 单元文件:
[Unit]
Description=Piper TTS Server
After=network.target
[Service]
ExecStart=/path/to/server.py
Restart=always
[Install]
WantedBy=multi-user.target
客户端调用:curl -X POST http://repka-pi:8000/synthesize -d 'Text for synthesis'。
核心要点
- eSpeak NG:资源占用极低,基于共振峰合成,适合性能较弱的硬件。
- Piper TTS:采用 VITS/ONNX 技术,实现自然语音,可在单板计算机上实时运行。
- FastAPI 服务器:支持异步队列,可配合 systemd 自动启动。
- 应用场景:语音助手、物联网设备、基于 Repka-Pi 4/5 的机器人项目。
- Repka-Pi 5:最高支持 32GB 内存,语音合成与语音识别(TTS+ASR)性能约为 Raspberry Pi 5 的两倍。
— Editorial Team
暂无评论。