返回首页

Repka-Pi 上的 TTS:eSpeak NG 和 Piper

本文描述了在 Repka-Pi 4 上使用 eSpeak NG 和 Piper TTS 实现 TTS。提供了安装说明、CLI/Python 集成以及带队列的 FastAPI 服务器。适用于 IoT 和语音助手。

Repka-Pi 4 上的 Piper TTS 语音合成
Advertisement 728x90

微型计算机上的语音合成:从eSpeak NG到Piper TTS

语音合成技术已从机械装置发展到神经网络模型。18世纪末,带有隔膜和气囊的机械声带模拟装置能够模仿人声——例如1846年的尤法尼亚(Euphonia)乐器,通过按键和声学部件实现发声。

电子时代始于贝尔实验室的Voder(1930年),该设备通过键盘控制音调发生器、噪声源和滤波器。20世纪40至50年代的模式回放系统可重现频谱图。1961年,IBM 704计算机成功用合成方式演唱了《黛西·贝尔》。日本于1968年推出首个基于共振峰的语音合成系统。MUSA系统(1975–1978年)实现了实时意大利语语音输出。

自1980年代起,采用音素的共振峰合成成为主流;1990年代转向统计方法;2010年代则迎来端到端神经网络,如VITS模型的广泛应用。

Google AdInline article slot

轻量级 eSpeak NG 语音合成

eSpeak NG 是一款开源、基于共振峰的语音合成系统,不依赖真实语音样本。虽然输出声音略显机械感,但资源占用极低,非常适合 Repka-Pi 4 这类仅配备 2GB 内存的微型计算机。特别适用于警报提示和原型开发。

安装与命令行使用

更新并安装软件包:

apt update
apt install espeak-ng

查看可用语音:

Google AdInline article slot
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

从文件读取并使用女声:

Google AdInline article slot
espeak-ng -v ru+f5 -s 150 -f hello-repka-pi.txt

支持语音:ruru+m1..m7ru+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

Advertisement 728x90

继续阅读