Zpět na domů

TTS na Repka-Pi: eSpeak NG a Piper

Článek popisuje implementaci TTS na Repka-Pi 4 s eSpeak NG a Piper TTS. Uvedeny instrukce k instalaci, CLI/Python integraci a FastAPI serveru s frontou. Vhodné pro IoT a hlasové asistenty.

Syntéza řeči Piper TTS na Repka-Pi 4
Advertisement 728x90

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.

Google AdInline article slot

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:

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

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

Advertisement 728x90

Číst dál