Files
Locutor-IA-G-Radio-Player/assets/locutor-ia/context/01-arquitectura.md
T
cescobar 2f6b5340f5 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.
2026-08-23 01:58:56 -05:00

46 lines
2.7 KiB
Markdown

# 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.