69e849d38e
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.
122 lines
7.0 KiB
Markdown
122 lines
7.0 KiB
Markdown
# 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.
|