Commit inicial: gr-locutor (Locutor IA - GRP)
Locuciones de radio con voz IA local (XTTS-v2) integradas a G Radio Player: interfaz Rust/GTK4 de configuración, motor de generación y enriquecimiento de texto en Python, daemon de monitoreo que dispara locuciones sin pausar playlist-refill. Requiere radio-player >= 0.4.11.
This commit is contained in:
@@ -0,0 +1,45 @@
|
||||
# Arquitectura del Locutor Automático IA
|
||||
|
||||
## Componentes instalados
|
||||
|
||||
| Ruta | Rol |
|
||||
|---|---|
|
||||
| `~/.gradio/locutor-venv/` | Entorno virtual Python con el motor XTTS-v2 (torch, coqui-tts, transformers) |
|
||||
| `~/.gradio/locutor-venv/gr-locutor.sh` | Wrapper: `gr-locutor.sh "texto" [nombre]` → genera un MP3 |
|
||||
| `~/.gradio/data/locutor-ia/generar.py` | Script real de síntesis (llamado por el wrapper) |
|
||||
| `~/.gradio/data/locutor-ia/referencia/voz_referencia.wav` | Voz de referencia activa (genérica de GRP o la de la estación) |
|
||||
| `~/.gradio/data/locutor-ia/salida/` | MP3 generados |
|
||||
| `~/.gradio/data/locutor-ia/scripts/enriquecer-locucion.py` | Genera el texto: metadata ID3 + Wikipedia + MusicBrainz |
|
||||
| `~/.gradio/data/locutor-ia/scripts/generar-intro.sh` | Orquesta: texto enriquecido → `gr-locutor.sh` |
|
||||
| `~/.gradio/data/locutor-ia/scripts/monitor-locuciones.py` | Daemon: mantiene 3 locuciones listas en `playlist4` |
|
||||
| `~/.gradio/data/locutor-ia/scripts/start-monitor.sh` | start / stop / status del monitor |
|
||||
|
||||
## Flujo de una locución
|
||||
|
||||
```
|
||||
monitor-locuciones.py detecta que faltan locuciones en la ventana
|
||||
└── generar-intro.sh "/ruta/tema.mp3"
|
||||
├── enriquecer-locucion.py → texto (metadata + Wikipedia + MusicBrainz)
|
||||
└── gr-locutor.sh "texto" → generar.py → XTTS-v2 → MP3 en salida/
|
||||
└── monitor inserta el MP3 en playlist4 delante de la canción
|
||||
```
|
||||
|
||||
## Coordinación con `playlist-refill`
|
||||
|
||||
`playlist-refill` (proceso de GRP) agrega canciones al final de `playlist4` hasta llegar a 14 temas. Si corre a la vez que el monitor inserta locuciones, puede haber una carrera (leer-generar-escribir tarda varios segundos, y mientras tanto el player puede haber consumido temas).
|
||||
|
||||
Solución ya implementada: `monitor-locuciones.py` crea `~/.gradio/data/tmp/pause_refill` al iniciar (GRP ya respeta este archivo — es el mismo mecanismo del botón "Automático" de la UI) y lo borra al detenerse. **No hace falta ninguna acción manual** — `start-monitor.sh start/stop` lo maneja solo.
|
||||
|
||||
## Bandera de habilitación
|
||||
|
||||
`~/.gradio/data/tmp/locutor_auto` (`1`/`0`) — se controla desde el diálogo de Configuración de GRP ("Locutor Automático"). El monitor y el generador no deberían correr si está en `0`.
|
||||
|
||||
## Rendimiento medido (texto de referencia ~10s de audio)
|
||||
|
||||
| Máquina | Generar | Cargar modelo (1 vez) |
|
||||
|---|---|---|
|
||||
| Escritorio con GPU NVIDIA | ~2s | ~10s |
|
||||
| Escritorio CPU (20 hilos, sin GPU) | ~29s | ~10s |
|
||||
| RPi5 real (CPU, sin GPU) | ~104s | ~120s |
|
||||
|
||||
Todos entran en el margen de una canción de 3-4 minutos. La recomendación es **no correr el generador en la misma máquina que reproduce en vivo** salvo que tenga GPU o de sobra de RAM/CPU — en el RPi5 se midió presión real de memoria (swap) al generar en aislamiento.
|
||||
Reference in New Issue
Block a user