Volver al inicio

TTS en Repka-Pi: eSpeak NG y Piper

El artículo describe la implementación de TTS en Repka-Pi 4 con eSpeak NG y Piper TTS. Se proporcionan instrucciones de instalación, integración CLI/Python y servidor FastAPI con cola. Adecuado para IoT y asistentes de voz.

Síntesis de voz Piper TTS en Repka-Pi 4
Advertisement 728x90

Síntesis de Voz en Microcomputadoras: De eSpeak NG a Piper TTS

La síntesis de voz ha evolucionado desde dispositivos mecánicos hasta modelos basados en redes neuronales. A finales del siglo XVIII, se crearon analogías del tracto vocal mecánico con diafragmas y fuelles que imitaban tonos vocales—un ejemplo emblemático fue la Euphonia de 1846, con teclas y componentes acústicos.

La era electrónica comenzó con el Voder de Bell Labs (1930), donde generadores de tono, fuentes de ruido y filtros eran controlados mediante teclado. El sistema Pattern Playback (décadas de 1940 y 1950) reproducía espectrogramas. En 1961, la IBM 704 modeló un tracto vocal para cantar "Daisy Bell". Japón lanzó su primera síntesis TTS basada en formantes en 1968. MUSA (1975–1978) logró hablar en italiano en tiempo real.

Desde los años 80: síntesis por formantes con fonemas. Desde los años 90: métodos estadísticos. Desde los 2010: redes neuronales end-to-end como VITS.

Google AdInline article slot

Síntesis de Voz Ligera con eSpeak NG

eSpeak NG es un sistema de síntesis de voz de código abierto basado en formantes, sin muestras reales de voz. Su salida suena robótica pero requiere mínimos recursos—ideal para Repka-Pi 4 con 2 GB de RAM. Perfecto para alertas y prototipos.

Instalación y Uso desde la Línea de Comandos

Actualiza paquetes e instala:

apt update
apt install espeak-ng

Consulta voces disponibles:

Google AdInline article slot
espeak-ng --voices | grep Russian

Sintetiza texto:

espeak-ng "Hello Repka Pi" -v ru

Texto multilínea mediante heredoc:

espeak-ng -v ru -s 150 << EOF
Hello world!
This very long text,
that takes several lines.
EOF

Desde archivo con voz femenina:

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

Voces: ru, ru+m1..m7, ru+f1..f5.

Integración con Python

Función para ejecución mediante subproceso:

import subprocess

def say(text, voice="ru", speed=150, pitch=50):
    """
    voice — idioma/voz (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 no encontrado. Instala: 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)

Ejecuta con: python3 espeak-ng-test.py.

Síntesis de Voz Basada en Redes Neuronales con Piper TTS

Piper TTS utiliza modelos VITS (Inferencia Variacional con aprendizaje adversarial para TTS end-to-end) y formatos ONNX para ofrecer una voz natural y en tiempo real en microcomputadoras. Su rendimiento supera al de eSpeak NG, con latencia aceptable en Repka-Pi 4.

Instalación y Configuración del Modelo

Entorno virtual:

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

Descarga el modelo ruso (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

Ejecución desde CLI y Python

Sintetiza a WAV:

piper --model ~/piper-voices/ru/ru_RU-irina-medium.onnx --output_file grande_texto.wav <<EOF
Hello world!
This very long text...
EOF
aplay grande_texto.wav

Desde archivo: piper --model model.onnx --output_file output.wav -f input.txt.

La integración con Python sigue el mismo patrón que eSpeak NG—usa piper mediante subproceso o API nativa.

Servidor TTS con FastAPI

Crea un servidor asíncrono para gestionar colas de solicitudes. Ejecútalo como servicio systemd en Repka-Pi 4.

  • Beneficios: Los clientes envían solicitudes HTTP POST sin esperar; el servidor encola tareas.
  • Pila tecnológica: FastAPI, Piper TTS, cola de tareas.

Ejemplo de código del servidor:

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)
        # Guardar o transmitir
        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"}

Archivo unit de systemd:

[Unit]
Description=Piper TTS Server
After=network.target

[Service]
ExecStart=/path/to/server.py
Restart=always

[Install]
WantedBy=multi-user.target

Cliente: curl -X POST http://repka-pi:8000/synthesize -d 'Texto para síntesis'.

Conclusiones Clave

  • eSpeak NG: bajo consumo, síntesis por formantes, ideal para hardware débil.
  • Piper TTS: VITS/ONNX para voz natural, en tiempo real en SBCs.
  • Servidor FastAPI: cola asíncrona, inicio automático con systemd.
  • Casos de uso: asistentes de voz, IoT, robots en Repka-Pi 4/5.
  • Repka-Pi 5: hasta 32 GB de RAM, rendimiento duplicado frente al Raspberry Pi 5 para TTS+ASR.

— Editorial Team

Advertisement 728x90

Leer después