# 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](https://gitea.feadulta.com/rafa/feadulta/issues/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): ```bash cd /home/rafa/joomla-migration python3 scripts/translate_post.py --carta --langs en,fr,it,pt --status draft # o para un solo artículo: python3 scripts/translate_post.py --post-id --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): ```bash cd /home/rafa/joomla-migration FEA_TTS_CARTAS="" 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). **Alcance del TTS — qué NO llevar a audio (confusión real en la carta 741, 2026-08-26):** - **Solo el artículo original en español.** Las traducciones (EN/FR/IT/PT) nunca llevan audio propio — no meter los posts de traducción en la cola (`FEA_TTS_IDS`/`FEA_TTS_CARTAS`). - **Un audio por artículo, nunca uno combinado de toda la carta.** `tts_produce.py` es correcto (genera un mp3 por post). No usar `scripts/tts_carta.py` (legacy, concatena todos los artículos de la carta en un único audio) — no es el flujo que se usa hoy. - **Nunca la categoría `multimedia`** (término `multimedia`, id 1649 — ver `scripts/aplicar_clasificacion_a_bd.py`). Esas piezas no se locutan. **Publicar el audio en prod** (el paso anterior solo escribe en el WordPress local): ```bash python3 scripts/sync_audio_to_prod.py --carta # deshacer si algo suena mal: python3 scripts/sync_audio_to_prod.py --rollback --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](https://gitea.feadulta.com/rafa/feadulta/issues/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.