# 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 <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):
```bash
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):
```bash
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](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.
