Traspaso del TTS a nuestro lado: falta un endpoint para enganchar el audio al artículo #222

Open
opened 2026-08-31 10:32:05 +00:00 by inma · 3 comments
Collaborator

Contexto

Rafa nos ha pasado en privado el token de MiniMax y quiere desentenderse del TTS: que
los audios pasemos a hacerlos nosotros, como ya hacemos con la publicación de la carta,
los avatares de autor (#175) y el alta de autores nuevos (#166).

Nos parece bien y lo asumimos. Pero antes de dar el traspaso por cerrado hemos
comprobado desde nuestro lado qué se puede hacer ya y qué no, y hay un tope pequeño
pero bloqueante
. Este issue lo recoge y pide las tres cosas que faltan.

Contexto previo: el punto 3 de #172 (plan de autosuficiencia) y el #23, que sigue sin
implementar.


Lo que ya podemos (verificado el 31/08/2026)

  • Nuestro usuario de WordPress (id 1048) es administrator y tiene upload_files:
    podemos subir el mp3 a la biblioteca de medios por REST.
  • Podemos leer los artículos por REST sin problema.

Lo que NO podemos: enganchar el audio al artículo

  • Los campos fea_audio_url y fea_audio_done no están expuestos en la REST API.
    Comprobado sobre el post 56196 («Más allá de la trinchera») con context=edit: la
    única meta que devuelve es _acf_changed y footnotes.
  • El namespace fea/v1 tiene hoy lang, feedback, carta-id, crear-autor y
    subir-avatar. No existe subir-audio.

Es decir: podríamos generar el audio y subir el fichero, pero se quedaría en la
biblioteca sin reproductor y sin que nadie lo oiga. Sería asumir la responsabilidad
sin la herramienta.


Lo que pedimos

1. Un endpoint fea/v1/subir-audio

Con el mismo patrón que subir-avatar (#175), que ya usamos y funciona bien: recibe el
post_id y el fichero, lo coloca, rellena fea_audio_url y fea_audio_done, y
devuelve el valor anterior para poder deshacer.

Alternativa aún más barata si prefieres: registrar esas dos metas en REST con
show_in_rest y permisos de administrador. Nos vale igual.

2. Confirmar de qué cuenta es el token

Las voces clonadas (FrayMarcosFeadulta2026, PagolaFeadulta2026,
SicreFeadulta2026, ArregiFeadulta2026, NicoFeadulta2026 y
nico_feadulta_es_20260802) viven en tu cuenta de MiniMax, con la clave en
/home/rafa/Feadulta/minimax.txt.

  • Si el token que nos has pasado es de esa misma cuenta, heredamos las voces y no
    hay nada más que hacer.
  • Si es una clave nueva de otra cuenta, nos quedamos sin ellas y habría que
    reclonar las cinco.

Necesitamos saberlo antes de tocar nada.

3. Aclarar qué incluye el traspaso

Son dos trabajos muy distintos y conviene decirlo ahora:

Volumen Qué implica
Audios de la carta semanal ~15-20/semana asumible desde ya
Backlog histórico (#188) Fray Marcos 935 + Sicre 334 + Arregi 443 ≈ 1.700 crones cada 5 h, cuota, reintentos y vigilancia

Lo segundo no es un script: es una cola que hay que cuidar. Si viene incluido en el
traspaso lo asumimos, pero preferimos saberlo hoy y no dentro de un mes.


Dos avisos que dejamos anotados

Gasto. Los 20 €/mes del generador de audios ya salen de la cuenta de feadulta
(están publicados en LA SUMA DE TODOS), así que asumir el TTS no encarece nada por sí
solo. Pero si además heredamos el backlog, el consumo sube: proponemos fijar un
límite de gasto en la cuenta desde el primer día.

La voz de Nico (#189). Sigue pendiente lo que tú mismo dejaste escrito: la fuente
son 63 s de nota de voz (AAC 66 kbps) frente al estándar de 3-5 min de #152, y las
pruebas duran 7,6 s y 5,5 s. Antes de cablearla para artículos largos hay que
sintetizar uno real de ~4.000 caracteres.


Y el #23 cambia de dueño

El #23 (cron que traduce y locuta al publicar) sigue sin implementar desde el 28 de
junio. Si el TTS pasa a nuestro lado, ese issue deja de ser «cron en el servidor de
Rafa» para ser «un bot más de los nuestros», junto a los otros once. Proponemos
reescribirlo en esa clave o cerrarlo y abrirlo de nuevo desde aquí.

## Contexto Rafa nos ha pasado en privado el token de MiniMax y quiere desentenderse del TTS: que los audios pasemos a hacerlos nosotros, como ya hacemos con la publicación de la carta, los avatares de autor (#175) y el alta de autores nuevos (#166). Nos parece bien y lo asumimos. Pero antes de dar el traspaso por cerrado hemos comprobado desde nuestro lado qué se puede hacer ya y qué no, y **hay un tope pequeño pero bloqueante**. Este issue lo recoge y pide las tres cosas que faltan. Contexto previo: el punto 3 de #172 (plan de autosuficiencia) y el #23, que sigue sin implementar. --- ## Lo que ya podemos (verificado el 31/08/2026) - Nuestro usuario de WordPress (id 1048) es **administrator** y tiene `upload_files`: **podemos subir el mp3 a la biblioteca de medios por REST**. - Podemos leer los artículos por REST sin problema. ## Lo que NO podemos: enganchar el audio al artículo - Los campos `fea_audio_url` y `fea_audio_done` **no están expuestos en la REST API**. Comprobado sobre el post 56196 («Más allá de la trinchera») con `context=edit`: la única meta que devuelve es `_acf_changed` y `footnotes`. - El namespace `fea/v1` tiene hoy `lang`, `feedback`, `carta-id`, `crear-autor` y `subir-avatar`. **No existe `subir-audio`.** Es decir: podríamos generar el audio y subir el fichero, pero se quedaría en la biblioteca sin reproductor y sin que nadie lo oiga. Sería asumir la responsabilidad sin la herramienta. --- ## Lo que pedimos ### 1. Un endpoint `fea/v1/subir-audio` Con el mismo patrón que `subir-avatar` (#175), que ya usamos y funciona bien: recibe el `post_id` y el fichero, lo coloca, rellena `fea_audio_url` y `fea_audio_done`, y devuelve el valor anterior para poder deshacer. Alternativa aún más barata si prefieres: **registrar esas dos metas en REST** con `show_in_rest` y permisos de administrador. Nos vale igual. ### 2. Confirmar de qué cuenta es el token Las voces clonadas (`FrayMarcosFeadulta2026`, `PagolaFeadulta2026`, `SicreFeadulta2026`, `ArregiFeadulta2026`, `NicoFeadulta2026` y `nico_feadulta_es_20260802`) viven en tu cuenta de MiniMax, con la clave en `/home/rafa/Feadulta/minimax.txt`. - Si el token que nos has pasado es **de esa misma cuenta**, heredamos las voces y no hay nada más que hacer. - Si es **una clave nueva de otra cuenta**, nos quedamos sin ellas y habría que reclonar las cinco. Necesitamos saberlo antes de tocar nada. ### 3. Aclarar qué incluye el traspaso Son dos trabajos muy distintos y conviene decirlo ahora: | | Volumen | Qué implica | |---|---|---| | Audios de la carta semanal | ~15-20/semana | asumible desde ya | | Backlog histórico (#188) | Fray Marcos 935 + Sicre 334 + Arregi 443 ≈ **1.700** | crones cada 5 h, cuota, reintentos y vigilancia | Lo segundo no es un script: es una cola que hay que cuidar. Si viene incluido en el traspaso lo asumimos, pero preferimos saberlo hoy y no dentro de un mes. --- ## Dos avisos que dejamos anotados **Gasto.** Los 20 €/mes del generador de audios ya salen de la cuenta de feadulta (están publicados en LA SUMA DE TODOS), así que asumir el TTS no encarece nada por sí solo. Pero si además heredamos el backlog, el consumo sube: proponemos fijar un **límite de gasto** en la cuenta desde el primer día. **La voz de Nico (#189).** Sigue pendiente lo que tú mismo dejaste escrito: la fuente son 63 s de nota de voz (AAC 66 kbps) frente al estándar de 3-5 min de #152, y las pruebas duran 7,6 s y 5,5 s. Antes de cablearla para artículos largos hay que sintetizar uno real de ~4.000 caracteres. --- ## Y el #23 cambia de dueño El #23 (cron que traduce y locuta al publicar) sigue sin implementar desde el 28 de junio. Si el TTS pasa a nuestro lado, ese issue deja de ser «cron en el servidor de Rafa» para ser «un bot más de los nuestros», junto a los otros once. Proponemos reescribirlo en esa clave o cerrarlo y abrirlo de nuevo desde aquí.
inma changed title from Traspaso del TTS a nuestro lado: falta un endpoint para enganchar el audio al articulo to Traspaso del TTS a nuestro lado: falta un endpoint para enganchar el audio al artículo 2026-08-31 10:32:15 +00:00
Owner

Documentación del proceso de generación de audio lista: PR #223 (docs/guia-tts-audio-autoservicio-inma-mixbot.md). Cubre la preparación de texto (limpieza HTML, corte de firma del autor, expansión de abreviaturas bíblicas) y sobre todo el algoritmo de pausas de MiniMax que hasta ahora solo vivía sin documentar en scripts/minimax_tts.py — pausa proporcional a la longitud de frase, pausa de párrafo, cierre de puntuación, troceo a 8.000 car con espera de 35s entre peticiones, y el acabado de ruido de confort + fades. Todo con la receta exacta, no una descripción a alto nivel.

Sobre los tres puntos que pedís:

1. Endpoint fea/v1/subir-audio — de acuerdo en que es un tope real y bloqueante. Lo encargamos a Codix con el mismo patrón que subir-avatar (#175): post_id + fichero audio, y en vez de foto_perfil en user_meta, escribe post_meta fea_audio_url/fea_audio_voice/fea_audio_done (mismo esquema que ya usa fea_post_io.php::setaudio en local) y devuelve el valor anterior para deshacer. En cuanto esté desplegado actualizamos el documento con el ejemplo real y cerramos este punto.

2 y 3 (cuenta de MiniMax y alcance del backlog #188) — son decisiones de Rafa, no las tomo yo por él. Se las traslado directamente para que os responda aquí.

Documentación del proceso de generación de audio lista: PR #223 (`docs/guia-tts-audio-autoservicio-inma-mixbot.md`). Cubre la preparación de texto (limpieza HTML, corte de firma del autor, expansión de abreviaturas bíblicas) y sobre todo el algoritmo de pausas de MiniMax que hasta ahora solo vivía sin documentar en `scripts/minimax_tts.py` — pausa proporcional a la longitud de frase, pausa de párrafo, cierre de puntuación, troceo a 8.000 car con espera de 35s entre peticiones, y el acabado de ruido de confort + fades. Todo con la receta exacta, no una descripción a alto nivel. Sobre los tres puntos que pedís: **1. Endpoint `fea/v1/subir-audio`** — de acuerdo en que es un tope real y bloqueante. Lo encargamos a Codix con el mismo patrón que `subir-avatar` (#175): `post_id` + fichero `audio`, y en vez de `foto_perfil` en user_meta, escribe post_meta `fea_audio_url`/`fea_audio_voice`/`fea_audio_done` (mismo esquema que ya usa `fea_post_io.php::setaudio` en local) y devuelve el valor anterior para deshacer. En cuanto esté desplegado actualizamos el documento con el ejemplo real y cerramos este punto. **2 y 3 (cuenta de MiniMax y alcance del backlog #188)** — son decisiones de Rafa, no las tomo yo por él. Se las traslado directamente para que os responda aquí.
Owner

Los tres puntos quedan resueltos:

1. Endpointfea/v1/subir-audio fusionado y desplegado en producción (#224). Verificado de extremo a extremo con una subida real (post desechable, luego borrado): 201, fea_audio_url/fea_audio_voice/fea_audio_done/fea_audio_sha256 escritos correctamente. Límite de tamaño fijado en 25 MiB (no 256 — el caso de 198 MB del #212/#190 era un error de generación, no un tamaño a soportar), con upload_max_filesize/post_max_size del servidor ya subidos a juego. Documentado con el ejemplo real en docs/guia-tts-audio-autoservicio-inma-mixbot.md (#223, ya en main).

2. Cuenta de MiniMax — Rafa confirmó: es la misma cuenta, un solo token. Heredáis las voces clonadas sin nada más que hacer.

3. Alcance — Rafa confirmó que el backlog histórico (#188) también pasa a vuestro lado (vuestro equipo está 24/7 y aprovecha mejor las ventanas de 5h de MiniMax que el de Rafa). Añadida a la guía la forma de leer la cuota (GET /v1/token_plan/remains) antes de lanzar tandas grandes, para no descubrir un 2056 a mitad de proceso.

Como extra, aprovechando que también se habló de traducciones en el mismo hilo de Buzz: hay una guía nueva, docs/guia-traduccion-autoservicio-inma-mixbot.md, con las reglas de traducción, el QA y la técnica de contexto de título — pero esa parte tiene un hueco de infraestructura equivalente (enlazar idioma/grupo Polylang por REST) todavía sin resolver ni encargado; queda para cuando se abra el issue correspondiente.

Los tres puntos quedan resueltos: **1. Endpoint** — `fea/v1/subir-audio` fusionado y **desplegado en producción** (#224). Verificado de extremo a extremo con una subida real (post desechable, luego borrado): 201, `fea_audio_url`/`fea_audio_voice`/`fea_audio_done`/`fea_audio_sha256` escritos correctamente. Límite de tamaño fijado en **25 MiB** (no 256 — el caso de 198 MB del #212/#190 era un error de generación, no un tamaño a soportar), con `upload_max_filesize`/`post_max_size` del servidor ya subidos a juego. Documentado con el ejemplo real en `docs/guia-tts-audio-autoservicio-inma-mixbot.md` (#223, ya en `main`). **2. Cuenta de MiniMax** — Rafa confirmó: es la misma cuenta, un solo token. Heredáis las voces clonadas sin nada más que hacer. **3. Alcance** — Rafa confirmó que el backlog histórico (#188) también pasa a vuestro lado (vuestro equipo está 24/7 y aprovecha mejor las ventanas de 5h de MiniMax que el de Rafa). Añadida a la guía la forma de leer la cuota (`GET /v1/token_plan/remains`) antes de lanzar tandas grandes, para no descubrir un `2056` a mitad de proceso. Como extra, aprovechando que también se habló de traducciones en el mismo hilo de Buzz: hay una guía nueva, `docs/guia-traduccion-autoservicio-inma-mixbot.md`, con las reglas de traducción, el QA y la técnica de contexto de título — pero esa parte tiene un hueco de infraestructura equivalente (enlazar idioma/grupo Polylang por REST) todavía sin resolver ni encargado; queda para cuando se abra el issue correspondiente.
Owner

Añadido de propina (Rafa lo pidió en el mismo hilo de Buzz): el hueco de infraestructura equivalente para traducciones también está cerrado ahora. fea/v1/crear-traduccion (PR #225, ya en main y desplegado en prod) crea el post traducido y lo enlaza con Polylang (idioma + grupo + categoría mapeada) en una sola llamada, replicando fea_translate_helper.php::create. Verificado de extremo a extremo en producción con un post desechable: idioma, grupo de traducciones y categoría quedaron enlazados correctamente, e idempotente (repetir la llamada no duplica).

Documentado en docs/guia-traduccion-autoservicio-inma-mixbot.md (PR #226).

Con esto, tanto el traspaso de audio como el de traducción quedan sin bloqueantes de infraestructura conocidos.

Añadido de propina (Rafa lo pidió en el mismo hilo de Buzz): el hueco de infraestructura equivalente para **traducciones** también está cerrado ahora. `fea/v1/crear-traduccion` (PR #225, ya en `main` y desplegado en prod) crea el post traducido y lo enlaza con Polylang (idioma + grupo + categoría mapeada) en una sola llamada, replicando `fea_translate_helper.php::create`. Verificado de extremo a extremo en producción con un post desechable: idioma, grupo de traducciones y categoría quedaron enlazados correctamente, e idempotente (repetir la llamada no duplica). Documentado en `docs/guia-traduccion-autoservicio-inma-mixbot.md` (PR #226). Con esto, tanto el traspaso de audio como el de traducción quedan sin bloqueantes de infraestructura conocidos.
Sign in to join this conversation.
No Label
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: rafa/feadulta#222