Este repo local tenia origin apuntando al Gitea local (localhost:3000), que Rafa
declaro archivado el 2026-06-28 (commit 962f33a, desarrollo movido a
gitea.feadulta.com). Ese memo nunca llego a este checkout: main quedo congelado
y todo el trabajo real de las ultimas 3+ semanas se fue commiteando solo en la
rama fix/multiidioma-portada-132 (ya fusionada a main sin perdida, commit
2504666), mientras que ademas se acumulaban 78 cambios sin commitear en el
working tree que nunca llegaron a NINGUN historial de git.
Este commit consolida esos cambios sueltos: TTS multi-voz (tts_*.py), scripts
de traduccion (translate_haiku.py, pretranslate_en_haiku.py, sync_translations_to_prod.py),
mu-plugins nuevos desplegados a prod (fea-beta-feedback, fea-cloudflare-realip,
fea-legacy-redirect, fea-gsc-verification, fea-support-campaign, fea-ui, etc.),
scripts de mantenimiento de enlaces/cartas, capturas E2E (tools/e2e/shot_*.cjs)
y documentacion de sesiones recientes.
Excluido deliberadamente (no es codigo versionable): tts-voices/ (3.3GB de
muestras de audio para clonacion de voz, anadido a .gitignore), logs/ (logs de
ejecucion, anadido a .gitignore), y 2 ficheros vacios accidentales + 2 copias
duplicadas sueltas en la raiz que ya existen en su ubicacion correcta.
7.0 KiB
Guía de traducción y audio (TTS) para Inma / Mixbot — feadulta.com
Para quién es este documento: para Inma y su asistente (Mixbot / Cowork), y como referencia para Hermes cuando se le pide que traduzca o locute un artículo/carta.
Estado real a 2026-07-12 (importante, corrige la guía de publicación §7 de versiones anteriores): esto NO es automático. No hay ningún cron corriendo hoy que traduzca o genere audio solo al publicar — esa automatización es la propuesta abierta issue #23, sin implementar. Todo lo de abajo es un proceso que hay que pedir, hoy solo ejecutable en el servidor/PC de Rafa.
1. Quién puede hacer qué, hoy
| Tarea | ¿Quién puede hacerla sin Rafa presente? |
|---|---|
| Publicar carta/artículos en español | Sí, Inma/Mixbot solos — API REST ya funciona (ver docs/guia-publicacion-carta-inma.md). No depende del PC de Rafa. |
| Pedir traducción o TTS | Solo indirectamente: hay que pedírselo a Hermes (WhatsApp/Telegram). Los scripts que traducen y locutan viven únicamente en el PC/servidor de Rafa (Docker local + credenciales locales) — Mixbot no tiene acceso directo a ellos. |
| Traducir/locutar si Hermes tampoco está disponible | Hoy, no. Es la limitación real que hay que conocer: si el PC de Rafa está apagado o Hermes está caído, ni Inma ni Mixbot pueden disparar esto por su cuenta. Ver §5 (qué falta para que esto no dependa de Hermes). |
2. Cómo pedir una traducción o un audio (mientras Hermes esté disponible)
Escribir al grupo de WhatsApp Feadulta_webmaster mencionando "Hermes" (o por Telegram),
indicando qué carta/artículo (ID de WordPress o título+fecha si no se tiene el ID) y qué se
necesita: traducción, audio, o ambos. Ejemplos:
"Hermes, tradúceme la carta 54XXX a los 4 idiomas" "Hermes, genera el audio de los artículos de la carta de esta semana"
Hermes ejecuta los scripts de abajo en el servidor de Rafa. No hace falta que Inma/Mixbot sepan los nombres de los scripts ni los IDs internos — es información para cuando Hermes (o Rafa) necesite el detalle técnico.
3. Traducción — motores disponibles
scripts/translate_post.py (repo joomla-migration) soporta tres motores via FEA_ENGINE:
| Motor | Coste | Cuándo usarlo |
|---|---|---|
gemma (por defecto) |
Gratis (modelo local, LM Studio en el PC de Rafa) | Opción por defecto. Requiere que el PC/GPU de Rafa esté encendido. |
minimax |
De pago, acotado (misma cuenta que el TTS) | Alternativa cuando Gemma no está disponible o la calidad no basta. |
haiku |
⚠️ De pago vía API directa de Anthropic (no es cuota de sesión) | No usar por defecto ni de forma autónoma. Choca con la política de no gastar API de pago sin que Rafa confirme cada vez. Reservado para cuando Rafa lo ejecuta él mismo o da autorización puntual. |
Comando (lo ejecuta Hermes o Rafa, no Inma/Mixbot directamente):
cd /home/rafa/joomla-migration
python3 scripts/translate_post.py --carta <ID_CARTA> --langs en,fr,it,pt --status draft
# o para un solo artículo:
python3 scripts/translate_post.py --post-id <ID_POST> --langs en,fr,it,pt --status draft
--status draft dejar en borrador para revisión; --status publish publica directo. Tras
traducir, hace falta el paso de enlaces internos (scripts/fix_carta_joomla_links.php) y, si se
publica, degradar la carta anterior (scripts/demote_old_cartasemana.php) — Hermes ya conoce
este flujo (ver skill feadulta-webmaster, references/procedures.md).
4. Audio (TTS) — voces por autor
scripts/minimax_tts.py + scripts/tts_produce.py (genera y escribe en WP local) +
scripts/sync_audio_to_prod.py (sube a prod, soporta --rollback para deshacer). Modelo MiniMax
speech-2.8-hd.
Voz por defecto: NicoFeadulta2026 (todos los autores sin voz clonada).
Voces clonadas por autor (issue #152 — solo estos 4 autores usan su propia voz, el resto cae a Nico):
| Autor | WP user_id | voice_id |
|---|---|---|
| Fray Marcos | 382 | FrayMarcosFeadulta2026 |
| José Antonio Pagola | 383 | PagolaFeadulta2026 |
| José Luis Sicre | 774 | SicreFeadulta2026 |
| José Arregi | 386 | ArregiFeadulta2026 |
Añadir un autor nuevo a esta lista requiere clonar su voz primero (grabación limpia 2-5 min, sin
música/ruido de fondo — verificar con espectrograma antes de clonar, ver memoria
feadulta-tts-voz-fraymarcos-202607 para el procedimiento y los descartes por música colada) y
añadirlo a AUTHOR_VOICES en scripts/minimax_tts.py. Esto sí requiere que Rafa (o alguien con
acceso al repo y a MiniMax) lo haga — no es autoservicio para Inma/Mixbot hoy.
Generar audio de una carta concreta (por defecto tts_produce.py procesa una cola larga de
cartas pendientes — para priorizar una carta concreta, sobreescribir la cola):
cd /home/rafa/joomla-migration
FEA_TTS_CARTAS="<ID_CARTA>" python3 scripts/tts_produce.py
Reanudable (no repite lo ya hecho, meta fea_audio_done) y con freno automático si la cuota de
MiniMax se agota (para tras fallos seguidos, no se queda colgado).
Publicar el audio en prod (el paso anterior solo escribe en el WordPress local):
python3 scripts/sync_audio_to_prod.py --carta <ID_CARTA>
# deshacer si algo suena mal:
python3 scripts/sync_audio_to_prod.py --rollback --carta <ID_CARTA>
Runbook de rollback ya documentado para que Hermes lo ejecute sin Rafa presente: issue #163.
5. La API key de MiniMax — decisión pendiente (de Rafa, no resuelta en este documento)
Hoy la key vive en un fichero local de Rafa, usada para TTS (y podría usarse para traducción
FEA_ENGINE=minimax). Para que Inma/Mixbot puedan disparar esto sin pasar por Hermes, harían
falta tanto acceso a esta key como acceso al entorno donde corren los scripts (Docker local del
PC de Rafa) — hoy ninguna de las dos cosas es cierta. Ver el issue maestro
#172 para las opciones que se están
valorando (key separada para Inma, gestor de secretos compartido, o mantener todo detrás de
Hermes). Mientras no se decida, la vía real es §2: pedírselo a Hermes.
6. Qué falta para que esto sea de verdad independiente de Hermes/Rafa
Siendo honestos: hoy, si el PC de Rafa está apagado (viaje, avería, lo que sea) y Hermes no responde, no hay forma de que Inma/Mixbot generen traducción o audio por su cuenta — los scripts y el WordPress local que usan como paso intermedio solo existen ahí. Para que esto cambiara de verdad haría falta uno de:
- Mover el pipeline de traducción/TTS a un sitio alcanzable por Mixbot directamente (ej. correr contra prod en vez de contra el WordPress local, y alojar los scripts en un servidor accesible, no en el PC personal de Rafa).
- O implementar de una vez el cron automático (issue #23) para que ni siquiera haga falta pedirlo — se dispara solo al publicar en español.
Ninguna de las dos está hecha. Documentado aquí para que la decisión de priorizarlo (o no) sea consciente, no un descuido.