Se me ocurrió la idea de crear una emisora de radio basada 100% en IA, que tomara noticias de tecnología y las emitiera de forma continua, actualizando sus guiones y emitiéndolos. Algo más que posible porque algo muy parecido ya hace Openclaw cada mañana al mandarme un boletín de noticias en audio con una voz de Azure que funciona de fábula. Es una especie de podcast emitido sólo para mí, estoy muy satisfecho del resultado y del contenido que me ofrece así que ¿por qué no hacer eso mismo pero con una emisora online? La IA ha eliminado las limitaciones técnicas, ahora sólo tengo que dar la orden y esa máquina misteriosa se ocupara de montarlo, solucionar los problemas y ejecutarlo. Así de sencillo, al fin y al cabo funcionaba con DeepSeek, y con Codex ni os digo. Y bueno, MiniMax no es el más listo de su clase pero se defiende, así que no debería salir mal, ¿no? Minimax hasta ahora se ha defendido en tareas menores, es sobresaliente creando audios y canciones, pero cuando le he pedido una tarea como la de montar una radio basada en IA, ha cometido tantos errores que ha tardado muchísimo y el resultado ha sido lamentable, noticias repetidas, audios con noticias repetidas... terrible.
Cuando la cuota de las 5 horas se agotó y pasé a GPT 5.5 en unos pocos minutos solucionó los problemas y levantó la radio. Sencillo, eficaz. Seguro que Deepseek también lo hubiera hecho bien. Ya he desactivado la renovación automática, pasaré a usar Ollama Cloud con su cuota de 20 Euros, seguro que otros modelos lo hacen mejor que MiniMax. Para tareas menores aunque da algunos palos de ciego, termina haciendo lo que le pido, pero no tenía nada que ver con el funcionamiento de DeepSeek. Agur, Sayonara, hasta nunca amigo. Toca probar nuevas aventuras, o quemar Tokens como si fuera rico. Es la fiebre de la IA. Y por supuesto, toca echar mano de Codex, eficiente, competente, y con buenos límites.
Si mañana esto sigue dando guerra, pasaré a Codex.
OS COMPARTO LA DOCUMENTACIÓN DEL PROYECTO DE LA "RADIO IA"
==========================================================================
RADIO IA - DOCUMENTACION DEL PROYECTO
==========================================================================
Fecha: 13 junio 2026
Creado por: Jane (asistente OpenClaw de Julio)
Proposito: Documentar el proyecto para que cualquier modelo futuro pueda
entenderlo, mantenerlo y ampliarlo sin partir de cero.
==========================================================================
ÍNDICE
1. QUÉ ES RADIO IA
2. ARQUITECTURA GENERAL
3. TECNOLOGÍAS Y DEPENDENCIAS
4. ESTRUCTURA DE DIRECTORIOS
5. FLUJO DE TRABAJO COMPLETO
5.1. Scraping (obtener noticias)
5.2. Generación de guiones (LLM)
5.3. Traducción (si aplica)
5.4. Síntesis de voz (TTS)
5.5. Empaquetado y emisión
6. JERARQUÍA DE LLM
7. JERARQUÍA DE TTS
8. ESTADO ACTUAL (13 JUN 2026)
9. PROBLEMAS CONOCIDOS Y WORKAROUNDS
10. TRABAJO REALIZADO
10.1. Histórico (primeras tandas)
10.2. Trabajo de Jane (12-13 Jun 2026)
11. COMANDOS ÚTILES
12. CREDENCIALES (referencia, sin tokens)
13. NOTAS PARA EL PRÓXIMO MODELO
==========================================================================
1. QUÉ ES RADIO IA
==========================================================================
Radio IA es una emisora de radio online autónoma que:
- Extrae noticias tecnológicas de ~40 fuentes RSS y NewsAPI
- Genera guiones de locución con modelos de lenguaje (LLM)
- Convierte los guiones a audio mediante síntesis de voz (TTS)
- Emite en bucle via Icecast en http://localhost:8000/radioia
Creada por Julio, inicialmente con XTTS (voz clonada de Samuel), después
ampliada con Azure TTS (voz Beatriz), MiniMax TTS y edge-tts (Microsoft).
2. ARQUITECTURA GENERAL
[RSS Feeds + NewsAPI]
|
scraper.py (extrae artículos)
|
guion.py (LLM genera guion de locución en español)
|
tts_xtts.py / azure_tts.py / minimax_tts.py (síntesis de voz)
|
Ficheros MP3 en audios/noticias/
|
emision.py (construye playlist y la envía a Icecast via ffmpeg)
|
Icecast server (localhost:8000/radioia)
|
Oyente (navegador, VLC, reproductor HTTP)
3. TECNOLOGÍAS Y DEPENDENCIAS
- Python 3.12+ (coqui-tts necesita 3.12) / 3.14 también presente
- Icecast 2.4.4 (servidor de streaming, binario en icecast/)
- ffmpeg Para concat de audios y streaming a Icecast
- edge-tts Síntesis de voz Microsoft (gratis, sin API key)
- coqui-tts XTTS v2 local con fine-tune de voz Samuel
- Azure Speech TTS cognitivo de Microsoft (2h/día gratis, necesita key)
- MiniMax TTS TTS de MiniMax (Spanish_SereneWoman, necesita key)
- Ollama LLM local (qwen3:14b, gemma4:12b) - último recurso
- OpenRouter API para LLM (nemotron-nano-9b-v2:free)
- NewsAPI API agregadora de noticias (30 llamadas/día)
- pydub Para combinar audios (intros + noticias + promos)
4. ESTRUCTURA DE DIRECTORIOS
C:\Python313\Radio IA\
├── audios/
│ ├── noticias/ MP3 generados (noticias individuales y bloques)
│ ├── noticias/rechazados_xtts/ Audios fallados de XTTS
│ ├── relleno/ Audios de transición
│ └── jingles/ Cabeceras/cierres (sintonías)
├── bin/
│ ├── radioia.cmd CLI unificado (punto de entrada recomendado)
│ ├── arrancar_icecast.ps1 / arrancar_radioia.ps1
│ ├── estado_radioia.ps1
│ └── parar_radioia.ps1
├── data/
│ ├── playlist.txt Playlist activa en formato ffmpeg concat
│ ├── manifest_*.json Manifiestos de tandas de producción
│ ├── azure_tts_usage.json Control de cuota diaria Azure TTS
│ ├── newsapi_usage.json Control de cuota diaria NewsAPI
│ └── edge_ollama_*.json Manifiestos de edge-tts
├── guiones/
│ ├── *.jsonl Guiones en formato JSONL (id, title, source, script)
│ └── *.md Guiones en Markdown (legible)
├── logs/
│ ├── *.log Logs de producción y errores
│ ├── *.out.log Salida estándar
│ └── *.err.log Errores
├── icecast/
│ ├── icecast.xml Configuración de Icecast
│ └── icecast/ Binarios de Icecast (extraídos)
├── src/
│ ├── scraper.py Extrae artículos de RSS y NewsAPI
│ ├── guion.py Genera guiones de locución con LLM
│ ├── tts_xtts.py Síntesis XTTS local y edge-tts
│ ├── azure_tts.py Síntesis Azure Speech
│ ├── minimax_tts.py Síntesis MiniMax TTS
│ ├── producir.py Orquesta 1 bloque o buffer N horas
│ └── emision.py Construye playlist, arranca Icecast, streamea
├── config.py Configuración global (rutas, keys, parámetros)
├── generar_audios_edge_desde_guiones.py Script autónomo edge-tts desde JSONL
├── generar_guiones_ollama_5000.py Script autónomo generación masiva
├── producir_3h_v3.py Script autónomo producción 3h con jerarquía TTS
├── traducir_titulares_guiones.py Traduce títulos de guiones a español
├── DOCUMENTACION_PROYECTO.txt ESTE ARCHIVO
└── README.md Documentación rápida
5. FLUJO DE TRABAJO COMPLETO
5.1. SCRAPING (obtener noticias)
Archivo: src/scraper.py
- Lee ~40 feeds RSS de tecnología (config.RSS_FEEDS)
- Opcionalmente consulta NewsAPI (máx 30/día, config.NEWSAPI_DAILY_LIMIT)
- Devuelve lista de artículos con título, descripción, fuente
- Feeds en inglés y español; se marcan con idioma en la tupla (url, nombre, "en"/"es")
5.2. GENERACIÓN DE GUIONES (LLM)
Archivo: src/guion.py
- Toma cada artículo y genera un guion de locución (~80-110 palabras)
- Jerarquía de modelos (ver sección 6)
- Si el artículo está en inglés, el prompt pide al LLM que genere el guion
en español directamente (traducción implícita)
- Devuelve lista de {"id":..., "title":..., "source":..., "script":..., "word_count":...}
- Los guiones se guardan en guiones/*.jsonl y guiones/*.md
5.3. TRADUCCIÓN EXPLÍCITA (alternativa)
Archivo: traducir_titulares_guiones.py
- Toma un JSONL existente con títulos en inglés y traduce títulos y guiones
- Usa Ollama local (gemma4:12b)
- Crea un nuevo JSONL con "titulares en español"
5.4. SÍNTESIS DE VOZ (TTS)
Ver jerarquía completa en sección 7.
- El script principal es src/tts_xtts.py (también maneja edge-tts)
- Scripts autónomos:
* generar_audios_edge_desde_guiones.py → edge-tts, agrupa en bloques
* generar_audios_minimax_desde_guiones.py → MiniMax TTS
* generar_audios_xtts_desde_guiones.py → XTTS local
- Los MP3 se guardan en audios/noticias/
- Los bloques combinados (intros + noticias + promos) se llaman
BLOQUE_{BACKEND}_OLLAMA_{RUN_ID}_{BLOQUE_NUM}.mp3
5.5. EMPAQUETADO Y EMISIÓN
Archivo: src/emision.py
- Función list_news_audios(): prioriza bloques MiniMax > edge-tts > XTTS
- Función build_playlist(): combina noticias propias + boletines viejos + podcasts
- save_playlist(): guarda en formato ffmpeg concat (data/playlist.txt)
- stream_to_icecast(): lanza ffmpeg que lee la playlist y envía a Icecast
- Icecast sirve en http://localhost:8000/radioia
6. JERARQUÍA DE LLM (para generar guiones)
Orden de preferencia:
1. OpenRouter - nvidia/nemotron-nano-9b-v2:free (gratis, funcional)
2. MiniMax - MiniMax-M3 (key da 2049 "invalid" actualmente, histórico)
3. DeepSeek - deepseek-chat (key bloqueada por "governor", $8 saldo)
4. Ollama local - qwen3:14b (siempre disponible)
5. Ollama local - gemma4:12b (fallback)
La selección está en src/guion.py.
7. JERARQUÍA DE TTS (para síntesis de voz)
Orden de preferencia (configurado en config.py y producir_3h_v3.py):
1. Azure TTS - es-MX-BeatrizNeural (2h/día gratis, necesita key y cuota)
→ Rápido (~2s por audio)
→ Voz preferida de Julio para todo (conversaciones, boletín, radio)
→ Config: estilo friendly, rate 0%, pitch 0%
→ Fichero: src/azure_tts.py
→ Límite diario: config.AZURE_TTS_DAILY_BUDGET_S = 7200s (2h)
→ ⚠️ El 12-13 Jun 2026 se agotó la cuota diaria
2. MiniMax TTS - Spanish_SereneWoman (~3s/audio, buena calidad)
→ Fichero: src/minimax_tts.py
→ Daba 2049 "invalid api key" en este período
3. edge-tts - Microsoft Edge TTS (gratis, sin key)
→ Voces disponibles: es-ES-AlvaroNeural (usado), es-ES-ElviraNeural,
es-MX-JorgeNeural, es-MX-DaliaNeural
→ Fichero: generar_audios_edge_desde_guiones.py
→ Se usó como respaldo principal cuando Azure y MiniMax fallaron
4. XTTS local - Voz de Samuel (fine-tune del 26 May 2026)
→ Lento (~50s por chunk), calidad variable
→ Fichero: src/tts_xtts.py
→ Último recurso, a veces balbucea
==============================================================================
8. ESTADO ACTUAL (13 JUN 2026, 01:00)
==============================================================================
- Icecast: ARRANCADO en localhost:8000
- Playlist activa: 85 bloques ~228 min (~3,8 horas) de contenido variado
(mezcla de bloques de producción anterior + relleno)
- ffmpeg emitiendo en bucle a /radioia
- Stream accesible: http://127.0.0.1:8000/radioia
- Admin Icecast: http://127.0.0.1:8000/admin/ (pass: ***)
Última producción (Jane, 13 Jun 00:48):
- 43 noticias limpias (ver sección 10.2)
- Edge TTS con voz es-ES-AlvaroNeural
- 43 audios individuales (~26 min brutos)
- 9 bloques compuestos con intros y promos (~31 min totales)
- Manifest: data/edge_ollama_20260613_004801.json
Estado de APIs:
- OpenRouter: FUNCIONANDO (nemotron-nano-9b-v2:free)
- Azure TTS: CUOTA DIARIA AGOTADA (12 Jun 2026)
- MiniMax: Key con error 2049 (no funcional)
- DeepSeek: Key bloqueada por governor
- Ollama local: Siempre disponible
- NewsAPI: Sin usar hoy (ahorrando llamadas)
- Edge TTS: Funcionando perfectamente
==============================================================================
9. PROBLEMAS CONOCIDOS Y WORKAROUNDS
==============================================================================
9.1. TTS: Azure agotado a diario
- Azure da 2h de TTS gratis al día
- Si se necesita más, usar edge-tts
- Workaround: repartir producción entre Azure (rápido) y edge-tts (lento)
9.2. XTTS balbucea
- A veces XTTS repite sílabas o produce audios ininteligibles
- Workaround: emision.py tiene RADIOIA_ALLOW_BAD_XTTS=0 por defecto,
ignora audios XTTS a menos que se fuerce con variable de entorno
9.3. MiniMax key "invalid" (2049)
- La key de pago por uso de MiniMax da 2049 "invalid api key"
- Workaround: no usar MiniMax, saltar a edge-tts
9.4. Edge TTS caracteres especiales
- Algunos caracteres Unicode (superíndices, ×, etc.) se leen mal
- Workaround: sanitizar el texto antes de enviarlo a edge-tts
- Ver reglas TTS pitfall en MEMORY.md de Julio
9.5. Noticias repetidas entre tandas
- El LLM tiende a generar guiones sobre los mismos temas (SpaceX IPO,
Google demanda china, etc.) aunque los artículos sean distintos
- Workaround: filtro manual de duplicados temáticos (ver sección 10.2)
9.6. Caracteres rotos en guiones (codificación)
- Al traducir títulos puede haber '?' donde deberían ir tildes
- Workaround: pasar un script de fix antes de generar audios
9.7. PowerShell problemas de encoding
- PowerShell usa CP1252 por defecto, rompe UTF-8
- Workaround: usar Python para todo I/O de archivos, no Set-Content
==============================================================================
10. TRABAJO REALIZADO
==============================================================================
10.1. HISTÓRICO (primeras tandas - antes de Jane)
- 12 Jun 2026, ~18:00-22:00: Producción 3h v2 (MiniMax TTS principalmente)
* ~234 KB de log, varios bloques generados con voz SereneWoman
- 12 Jun 2026, ~23:00-23:50: Generación masiva de guiones con Ollama
* Script: generar_guiones_ollama_5000.py
* 4 tandas de guiones (234441, 234520, 234944, 235351)
* Cada tanda: archivos .jsonl + .md
- 12 Jun 2026, ~23:53: Traducción de titulares a español
* Script: traducir_titulares_guiones.py
* Crea archivo 235351 con títulos en español
- 13 Jun 2026, ~00:00-00:30: Producción MiniMax TTS desde guiones
* Script: generar_audios_minimax_desde_guiones.py
* Logs: minimax_ollama.out.log (~15 KB)
- 13 Jun 2026, ~00:25: Producción XTTS (falló? solo 429 bytes de log)
- 13 Jun 2026, ~00:30: Producción edge-tts
* Script: generar_audios_edge_desde_guiones.py
* Primer intento con el JSONL original (235351)
- 13 Jun 2026, ~00:36: Icecast arrancado y emitiendo
10.2. TRABAJO DE JANE (12-13 Jun 2026, ~00:44-00:51)
Julio pidió: revisar que los guiones estén en español y sin repetidos,
luego pasarlos a audio con edge-tts.
Pasos realizados:
1. ANÁLISIS del archivo guiones/ollama_5000_20260612_235351.jsonl (56 guiones)
2. FILTRADO:
- 6 noticias NO tecnológicas eliminadas:
* UFC en Casa Blanca
* Macroplanta biomasa León
* Padrón telefonía México
* Funcionarios teletrabajo Catalunya
* Google TV Copa del Mundo
* Playa Cerdeña sombrillas
- 7 DUPLICADOS TEMÁTICOS eliminados:
* SpaceX IPO: se quedó la principal (ollama-007), se quitaron 5 versiones extra
* Google demanda china: se quedó la principal (ollama-005), se quitó duplicado
3. LIMPIEZA de caracteres rotos:
- 12 guiones con '?' en lugar de tildes (codificación): corregidos
4. REASIGNACIÓN de IDs: ollama-XXX → noticia-001 a noticia-043
5. SÍNTESIS edge-tts con es-ES-AlvaroNeural:
- 43 audios individuales generados (~26 min total)
- 9 bloques compuestos con intros/promos de Vidas en Red (~31 min total)
- Manifest JSON guardado en data/edge_ollama_20260613_004801.json
6. CREACIÓN de DOCUMENTACION_PROYECTO.txt (este archivo)
Archivos generados por Jane:
- guiones/ollama_5000_20260612_235351_LIMPIO.jsonl (43 guiones limpios)
- audios/noticias/EDGE_OLLAMA_noticia-001_20260613_004801.mp3 (y 42 más)
- audios/noticias/BLOQUE_EDGE_OLLAMA_20260613_004801_01.mp3 (y 8 más)
- data/edge_ollama_20260613_004801.json (manifest)
- DOCUMENTACION_PROYECTO.txt (este archivo)
==============================================================================
11. COMANDOS ÚTILES
==============================================================================
NOTA: todos los comandos asumen C:\Python313\Radio IA como directorio actual.
Usar: cd /d C:\Python313\Radio IA (cmd) o Set-Location (PowerShell).
--- CLI principal (radioia.cmd) ---
radioia test Detecta backends TTS disponibles
radioia produce Genera 1 bloque de noticias (~5 min)
radioia buffer 3 Pre-graba 3 horas de audio
radioia playlist Construye playlist con todos los audios
radioia icecast Arranca Icecast en localhost:8000
radioia stream Manda playlist a Icecast
radioia start Arranca todo (Icecast + emisión)
radioia stop Para todo
radioia status Muestra estado actual
--- Desde Python directamente ---
python -m src.producir --block
python -m src.producir --buffer 3
python -m src.emision --build-playlist
python -m src.emision --start-icecast
python -m src.emision --stream
--- Scripts autónomos ---
python generar_audios_edge_desde_guiones.py [jsonl_path] [limite]
python generar_audios_minimax_desde_guiones.py [jsonl_path] [limite]
python generar_guiones_ollama_5000.py
--- Verificación del stream ---
curl.exe http://127.0.0.1:8000/radioia (Windows)
curl http://127.0.0.1:8000/status-json.xsl (JSON de estado)
Abrir http://127.0.0.1:8000/ en navegador
==============================================================================
12. CREDENCIALES (referencia - los tokens reales están en config.py)
==============================================================================
OpenRouter: config.OPENROUTER_API_KEY (sk-or-...)
Azure Speech: config.AZURE_SPEECH_KEY y REGION
MiniMax: config.MINIMAX_API_KEY (sk-cp-...)
DeepSeek: config.DEEPSEEK_API_KEY (sk-...)
NewsAPI: config.NEWSAPI_KEY (cdb1f0...)
Ollama: localhost:11434 (sin key)
Edge TTS: sin key (gratis de Microsoft)
Icecast admin: admin / *** (en icecast.xml y config.py)
⚠️ Los tokens de OpenRouter, Azure y NewsAPI son los únicos funcionales
a día de hoy. MiniMax y DeepSeek están caídos.
==============================================================================
13. NOTAS PARA EL PRÓXIMO MODELO
==============================================================================
- Si te piden continuar este proyecto, LEE PRIMERO este documento y
DOCUMENTACION_PROYECTO.txt.
- Visita http://127.0.0.1:8000/ para ver si Icecast sigue activo.
- El flujo más fiable ahora mismo es:
generar_guiones_ollama_5000.py → (usar Ollama local)
generar_audios_edge_desde_guiones.py → (usar edge-tts, gratis)
src/emision.py --build-playlist → (construir playlist)
src/emision.py --stream → (emitir)
- Si Azure TTS tiene cuota disponible, usarlo primero (más rápido y mejor
calidad de voz, con es-MX-BeatrizNeural).
- Los guiones limpios están en ..._LIMPIO.jsonl. Usar SIEMPRE ese.
- Si el próximo modelo ve caracteres raros en los títulos o scripts:
es doble encoding UTF-8→CP1252→UTF-8. NO retraducir, aplicar fix
de reversión de encoding.
- Para más contexto sobre preferencias de Julio (voz, estilo, reglas):
leer MEMORY.md y TOOLS.md en C:\Users\julio\.
- Los logs de producción están en logs/. Los más relevantes:
* produccion_3h_v2.log (234 KB) - la tanda grande del 12 Jun
* produccion_v3_b.log (138 KB) - tanda más reciente con MiniMax
* minimax_ollama.out.log - producción MiniMax TTS
* edge_ollama.out.log - producción edge-tts de Jane
==========================================================================
FIN DE DOCUMENTACIÓN
Guardado: C:\Python313\Radio IA\DOCUMENTACION_PROYECTO.txt
Creado por: Jane (OpenClaw) el 13 Junio 2026
==========================================================================