Syntéza řeči na mikropočítačích: od eSpeak NG po Piper TTS
Vývoj syntezátorů řeči prošel etapami od mechanických zařízení až po neuronové sítě. Na konci 18. století se objevily mechanické náhrady hlasového traktu s membránami a větrnými nástroji pro imitaci tónů. Příkladem je Euphonia z roku 1846 s klávesnicí a akustickými prvky.
Elektronická éra začala s Voderem (1930, Bell Labs): generátory tónů, šumu a filtrů byly ovládány klávesami. Pattern Playback (1940–1950) přehrával spektrogramy. S počítači v roce 1961 na IBM 704 byl modelován hlasový trakt pro písně Daisy Bell. V roce 1968 v Japonsku vznikl první TTS na formantním syntéze. MUSA (1975–1978) poskytovala reálný čas na italštině.
Od 80. let – formantní syntéza s fonémami, od 90. let – statistika, od 2010. let – neuronové sítě VITS pro end-to-end TTS.
Lehký syntézor eSpeak NG
eSpeak NG je open source TTS založený na formantním syntéze bez ukázek skutečných hlasů. Výsledek zní roboticky, ale nízké nároky na prostředky umožňují spuštění na Repka-Pi 4 s 2 GB RAM. Ideální pro upozornění a prototypy.
Instalace a spuštění z CLI
Aktualizujte balíčky a nainstalujte:
apt update
apt install espeak-ng
Zkontrolujte dostupné hlasy:
espeak-ng --voices | grep Russian
Syntéza textu:
espeak-ng "Ahoj Repka Pi" -v ru
Víceřádkový text přes heredoc:
espeak-ng -v ru -s 150 << EOF
Ahoj světe!
Tohle je velmi dlouhý text,
což zabírá několik řádků.
EOF
Z souboru s ženským hlasem:
espeak-ng -v ru+f5 -s 150 -f hello-repka-pi.txt
Hlasy: ru, ru+m1..m7, ru+f1..f5.
Integrace s Pythonem
Funkce pro spuštění přes subprocess:
import subprocess
def say(text, voice="ru", speed=150, pitch=50):
"""
voice — jazyk/hlas (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 nenalezen. Nainstalujte: sudo apt install espeak-ng")
except subprocess.CalledProcessError as e:
print("Chyba:", e.stderr.decode())
if __name__ == "__main__":
say("Ahoj! Tohle je test ruského hlasu.", voice="ru", speed=140)
say("Hello, this is a test in English", voice="en-us", speed=160, pitch=60)
say("Testujeme jiný ruský hlas", voice="ru+f3", speed=135)
Spusťte: python3 espeak-ng-test.py.
Neuronový Piper TTS
Piper TTS na základě VITS (Variational Inference with adversarial learning for end-to-end TTS) s ONNX modely poskytuje přirozenou řeč v reálném čase na mikropočítačích. Kvalita je vyšší než u eSpeak NG, zpoždění je přijatelné pro Repka-Pi 4.
Instalace a příprava modelů
Virtuální prostředí:
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
Stáhněte si ruský model (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
Spuštění z CLI a Pythonu
Syntéza do WAV:
piper --model ~/piper-voices/ru/ru_RU-irina-medium.onnx --output_file velky_text.wav <<EOF
Ahoj světe!
Tohle je velmi dlouhý text...
EOF
aplay velky_text.wav
Z souboru: piper --model model.onnx --output_file output.wav -f input.txt.
Integrace v Pythonu je podobná jako u eSpeak, pomocí volání piper přes subprocess nebo nativní API.
Server TTS na FastAPI
Vytvořte asynchronní server pro zpracování fronty požadavků. Spouští se jako systemd služba na Repka-Pi 4.
- Výhody: Klienti odesílají HTTP POST bez čekání, server umístí do fronty.
- Technologie: FastAPI, Piper TTS, fronta úloh.
Zdrojový kód serveru (příklad):
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)
# Uložit/ streamovat
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"}
Unit soubor pro systemd:
[Unit]
Description=Piper TTS Server
After=network.target
[Service]
ExecStart=/path/to/server.py
Restart=always
[Install]
WantedBy=multi-user.target
Klient: curl -X POST http://repka-pi:8000/synthesize -d 'Text pro syntézu'.
Co je důležité
- eSpeak NG: nízká spotřeba paměti, formantní syntéza, vhodné pro slabé hardware.
- Piper TTS: VITS/ONNX pro přirozenou řeč, reálný čas na SBC.
- Server na FastAPI: asynchronní fronta, autostart přes systemd.
- Použití: hlasové asistenty, IoT, roboti na Repka-Pi 4/5.
- Repka-Pi 5: až 32 GB RAM, dvakrát vyšší výkon ve srovnání s Raspberry Pi 5 pro TTS+ASR.
— Editorial Team
Zatím žádné komentáře.