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.
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:
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:
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
Aún no hay comentarios.