Audio TTS por artículo: player compacto arriba + elección de voz ES (muestras listas) #89

Closed
opened 2026-06-28 19:14:26 +00:00 by rafa · 0 comments
Owner

Labels: area:infra, area:plugin, improvement

Resumen

Añadir audio (TTS) a los artículos de feadulta, con un reproductor pequeño en la parte superior del artículo (como en ytsummaries). Reutiliza la infra de audio que ya funciona en ytsummaries (edge-tts) y la inferencia local. Incluye resolver el punto débil que ya detectó Rafa: la voz en español no convence ("en inglés sale mejor").

Iniciativa larga (milestone v3). Análisis y muestras de voz generadas el 2026-06-15.


Estado actual / base reutilizable

  • ytsummaries ya tiene audio (issue #47, implementado 2026-06-14): Gemma genera un guion oral → edge-tts sintetiza OGG → se importa a la Media Library → meta audio_briefing_url<audio controls> compacto (36px) en single-video.php dentro de video-hero-actions. Patrón directamente replicable.
  • edge-tts 7.2.7 instalado en ~/.hermes/hermes-agent/venv/bin/edge-tts. Voces actuales: es-ES-AlvaroNeural (ES), en-US-AndrewNeural (EN).
  • Es online (voces neuronales de Microsoft, gratis y rápidas), no 100% local. La parte local es Gemma (texto). Para audio totalmente offline ver "Opciones de voz" abajo.

Diferencia clave con ytsummaries (importante)

En ytsummaries el audio es un briefing reescrito por Gemma. En feadulta el contenido es teológico/doctrinal: el audio debe leer el artículo de forma fiel, no una reescritura que pueda alterar el sentido.

→ Pipeline propuesto:

  1. Tomar post_content, limpiar (quitar nav, imágenes, shortcodes, "pensamiento aleatorio", etc.) → texto plano.
  2. Normalización ligera para lectura (opcional, con reglas, no reescritura libre): expandir abreviaturas y, si se quiere, citas bíblicas ("Jn 3, 16" → "Juan, capítulo 3, versículo 16"). Configurable; por defecto conservador.
  3. TTS → MP3/OGG.
  4. Importar a Media Library → meta audio_url (+ audio_voz, audio_generado_en).
  5. Player compacto arriba del artículo.

La voz (lo que no le gusta a Rafa) — muestras listas para elegir

He generado 5 muestras con la misma frase de feadulta para que elijas al despertar. Escúchalas en:
https://farmer.taild3aaf6.ts.net/fea/wp-content/uploads/tts-samples/sample-<VOZ>.mp3

Voz Género Archivo
es-ES-AlvaroNeural (actual) M sample-es-ES-AlvaroNeural.mp3
es-ES-ElviraNeural F sample-es-ES-ElviraNeural.mp3
es-ES-XimenaNeural F sample-es-ES-XimenaNeural.mp3
es-MX-JorgeNeural M sample-es-MX-JorgeNeural.mp3
es-AR-TomasNeural M sample-es-AR-TomasNeural.mp3

(También existen es-ES-Elvira/Ximena, es-MX-Dalia, es-US-Alonso/Paloma, es-AR-Elena.)

Opciones de voz, de menos a más esfuerzo

  1. Cambiar de voz edge-tts (coste cero): elegir entre las muestras de arriba. Para tono espiritual/pausado, las femeninas (Elvira/Ximena) o Jorge (MX) suelen sonar más cálidas que Álvaro. Recomendado empezar aquí.
  2. Ajustar prosodia edge-tts (--rate, --pitch, --volume) para un ritmo más reposado.
  3. TTS local de alta calidad (offline), aprovechando la RTX 5060 Ti 16GB, si ninguna voz edge convence:
    • Kokoro-82M: multilingüe, ligero, calidad alta, 2026. Buen punto dulce.
    • XTTS v2 (Coqui): voice cloning GPU → permite una voz "de marca" feadulta (incluso clonar a un locutor/colaborador real con su permiso). Más pesado.
    • Piper: muy ligero (CPU), calidad media, voces ES (carlfm, davefx) — buen fallback offline.
    • Recomendación: A/B con edge-tts primero; si no, prototipar Kokoro y XTTS v2 con la misma frase y comparar.

Reproductor (UI)

  • Player compacto arriba del artículo (bajo el título), como pide Rafa. Patrón ytsummaries (<audio controls> discreto), aquí en el template single FSE (wp_posts ID 42359) o vía filtro the_content mostrando el player solo si existe meta audio_url.
  • Mostrar duración y, opcionalmente, "Escuchar este artículo" como etiqueta marketiniana.

Escala, almacenamiento y exclusiones

  • No generar audio para los 24k artículos de golpe: cada MP3 ~1-3 MB → 24k×2MB ≈ 48 GB. Priorizar igual que las traducciones:
    1. Cartas de la semana y destacados.
    2. Bajo demanda (botón "Generar audio" / al primer play).
  • Por idioma: generar el audio en el idioma del post (cuando existan traducciones, audio por idioma — la voz EN ya gusta).
  • Exclusiones: probablemente sin audio para lecturas bíblicas puras / citas (coherente con el pensamiento aleatorio). A decidir.
  • Pipeline idempotente y reanudable (estado JSON + log), por cron Hermes o loop, como audio_briefing.py.

Plan de ejecución

  1. Elegir voz (muestras arriba) y, si hace falta, evaluar Kokoro/XTTS local.
  2. articulo_audio.py (patrón audio_briefing.py): limpiar HTML → normalizar → TTS → Media Library → meta audio_url.
  3. Player compacto en el single (template 42359 / the_content).
  4. Cola priorizada (cartas + destacados) reanudable; botón on-demand para el resto.
  5. Deploy a prod (/web/wp-nuevo): sin scp (ssh 'cat > ruta'), sin proc_open; verificar con Rafa (Cloudflare bloquea headless).

Ficheros y referencias

  • Patrón: ytsummaries/scripts/audio_briefing.py + generate_audio_briefing() en daily_scan.py.
  • edge-tts: ~/.hermes/hermes-agent/venv/bin/edge-tts (voces --list-voices).
  • Template single FSE: wp_posts ID 42359.
  • Muestras de voz: wordpress/wp-content/uploads/tts-samples/ (borrar tras decidir).

Criterios de aceptación

  • Voz ES elegida y validada por Rafa.
  • Un artículo de muestra reproduce su audio (lectura fiel) desde un player compacto arriba.
  • Pipeline idempotente/reanudable con cola priorizada (cartas/destacados) + opción on-demand.
  • Audio por idioma cuando hay traducción.
  • No se generan 24k audios a ciegas (control de alcance/almacenamiento).
**Labels:** area:infra, area:plugin, improvement ## Resumen Añadir **audio (TTS) a los artículos** de feadulta, con un reproductor pequeño en la parte superior del artículo (como en ytsummaries). Reutiliza la infra de audio que ya funciona en ytsummaries (edge-tts) y la inferencia local. Incluye resolver el punto débil que ya detectó Rafa: **la voz en español no convence** ("en inglés sale mejor"). > Iniciativa larga (milestone v3). Análisis y muestras de voz generadas el **2026-06-15**. --- ## Estado actual / base reutilizable - **ytsummaries ya tiene audio** (issue #47, implementado 2026-06-14): Gemma genera un guion oral → **edge-tts** sintetiza OGG → se importa a la Media Library → meta `audio_briefing_url` → `<audio controls>` compacto (36px) en `single-video.php` dentro de `video-hero-actions`. Patrón directamente replicable. - **edge-tts 7.2.7** instalado en `~/.hermes/hermes-agent/venv/bin/edge-tts`. Voces actuales: `es-ES-AlvaroNeural` (ES), `en-US-AndrewNeural` (EN). - Es **online** (voces neuronales de Microsoft, gratis y rápidas), no 100% local. La parte local es Gemma (texto). Para audio totalmente offline ver "Opciones de voz" abajo. ## Diferencia clave con ytsummaries (importante) En ytsummaries el audio es un **briefing reescrito** por Gemma. En feadulta el contenido es **teológico/doctrinal**: el audio debe **leer el artículo de forma fiel**, no una reescritura que pueda alterar el sentido. → Pipeline propuesto: 1. Tomar `post_content`, **limpiar** (quitar nav, imágenes, shortcodes, "pensamiento aleatorio", etc.) → texto plano. 2. **Normalización ligera para lectura** (opcional, con reglas, no reescritura libre): expandir abreviaturas y, si se quiere, citas bíblicas ("Jn 3, 16" → "Juan, capítulo 3, versículo 16"). Configurable; por defecto conservador. 3. TTS → MP3/OGG. 4. Importar a Media Library → meta `audio_url` (+ `audio_voz`, `audio_generado_en`). 5. Player compacto arriba del artículo. --- ## La voz (lo que no le gusta a Rafa) — muestras listas para elegir He generado **5 muestras** con la misma frase de feadulta para que elijas al despertar. Escúchalas en: `https://farmer.taild3aaf6.ts.net/fea/wp-content/uploads/tts-samples/sample-<VOZ>.mp3` | Voz | Género | Archivo | |-----|--------|---------| | es-ES-AlvaroNeural (actual) | M | `sample-es-ES-AlvaroNeural.mp3` | | es-ES-ElviraNeural | F | `sample-es-ES-ElviraNeural.mp3` | | es-ES-XimenaNeural | F | `sample-es-ES-XimenaNeural.mp3` | | es-MX-JorgeNeural | M | `sample-es-MX-JorgeNeural.mp3` | | es-AR-TomasNeural | M | `sample-es-AR-TomasNeural.mp3` | (También existen es-ES-Elvira/Ximena, es-MX-Dalia, es-US-Alonso/Paloma, es-AR-Elena.) ### Opciones de voz, de menos a más esfuerzo 1. **Cambiar de voz edge-tts** (coste cero): elegir entre las muestras de arriba. Para tono espiritual/pausado, las femeninas (Elvira/Ximena) o Jorge (MX) suelen sonar más cálidas que Álvaro. **Recomendado empezar aquí.** 2. **Ajustar prosodia** edge-tts (`--rate`, `--pitch`, `--volume`) para un ritmo más reposado. 3. **TTS local de alta calidad (offline)**, aprovechando la RTX 5060 Ti 16GB, si ninguna voz edge convence: - **Kokoro-82M**: multilingüe, ligero, calidad alta, 2026. Buen punto dulce. - **XTTS v2 (Coqui)**: **voice cloning** GPU → permite una voz "de marca" feadulta (incluso clonar a un locutor/colaborador real con su permiso). Más pesado. - **Piper**: muy ligero (CPU), calidad media, voces ES (carlfm, davefx) — buen fallback offline. - Recomendación: A/B con edge-tts primero; si no, prototipar Kokoro y XTTS v2 con la misma frase y comparar. --- ## Reproductor (UI) - Player **compacto arriba del artículo** (bajo el título), como pide Rafa. Patrón ytsummaries (`<audio controls>` discreto), aquí en el **template single FSE** (`wp_posts` ID 42359) o vía filtro `the_content` mostrando el player **solo si existe meta `audio_url`**. - Mostrar duración y, opcionalmente, "Escuchar este artículo" como etiqueta marketiniana. ## Escala, almacenamiento y exclusiones - **No generar audio para los 24k artículos** de golpe: cada MP3 ~1-3 MB → 24k×2MB ≈ **48 GB**. Priorizar igual que las traducciones: 1. Cartas de la semana y destacados. 2. Bajo demanda (botón "Generar audio" / al primer play). - **Por idioma**: generar el audio en el idioma del post (cuando existan traducciones, audio por idioma — la voz EN ya gusta). - **Exclusiones**: probablemente sin audio para lecturas bíblicas puras / citas (coherente con el pensamiento aleatorio). A decidir. - Pipeline **idempotente y reanudable** (estado JSON + log), por cron Hermes o loop, como `audio_briefing.py`. ## Plan de ejecución 1. Elegir voz (muestras arriba) y, si hace falta, evaluar Kokoro/XTTS local. 2. `articulo_audio.py` (patrón `audio_briefing.py`): limpiar HTML → normalizar → TTS → Media Library → meta `audio_url`. 3. Player compacto en el single (template 42359 / `the_content`). 4. Cola priorizada (cartas + destacados) reanudable; botón on-demand para el resto. 5. Deploy a prod (`/web/wp-nuevo`): sin scp (`ssh 'cat > ruta'`), sin `proc_open`; verificar con Rafa (Cloudflare bloquea headless). ## Ficheros y referencias - Patrón: `ytsummaries/scripts/audio_briefing.py` + `generate_audio_briefing()` en `daily_scan.py`. - edge-tts: `~/.hermes/hermes-agent/venv/bin/edge-tts` (voces `--list-voices`). - Template single FSE: `wp_posts` ID **42359**. - Muestras de voz: `wordpress/wp-content/uploads/tts-samples/` (borrar tras decidir). ## Criterios de aceptación - [ ] Voz ES elegida y validada por Rafa. - [ ] Un artículo de muestra reproduce su audio (lectura fiel) desde un player compacto arriba. - [ ] Pipeline idempotente/reanudable con cola priorizada (cartas/destacados) + opción on-demand. - [ ] Audio por idioma cuando hay traducción. - [ ] No se generan 24k audios a ciegas (control de alcance/almacenamiento).
rafa closed this issue 2026-06-28 19:14:26 +00:00
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: rafa/feadulta#89