TTS: voz clonada por autor (a partir de feedback #78 / registro 54227) #152
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Origen
Feedback de usuario en el CPT
fea_feedback(registro 54231... concretamente el 54227, 04/07, sobre "Mi carga es ligera"):Propuesta
En vez de (o además de) permitir elegir voz genérica, clonar la voz de cada autor habitual y usarla para locutar (TTS) sus propios artículos. Ya tenemos el pipeline validado con la voz de Nico (voice cloning MiniMax,
scripts/minimax_tts.py, voice_idNicoFeadulta2026), así que el camino técnico ya existe — solo falta la materia prima por autor.Qué necesitamos de cada autor (para Inma, que es quien tiene contacto directo)
Que cada autor habitual grabe UNA vez su propio artículo leído en voz alta, y nos lo mande. Requisitos de calidad imprescindibles:
Plan técnico (una vez llegue el audio)
minimax_tts.py clone <audio> <voice_id>) — coste $1.5/voz (cobrado en la 1ª síntesis).voice_idpor autor (mapearauthor_id → voice_iden algún meta o config).Pendiente
minimax_tts.py/ el orquestador para elegir voz por autor.Relacionado: #78 (feedback Beta, CPT
fea_feedback).Voz de Fray Marcos clonada (2026-07-08)
Origen: documental "Fray Marcos, buscador de silencios" (Paula Hierro) en YouTube, tramo de 2 min a partir de t=973s (voz limpia, sin música de fondo, verificado con espectrograma antes de clonar).
voice_id = FrayMarcosFeadulta2026(MiniMax, misma cuenta/saldo que Nico). Clip fuente entts-voices/fraymarcos/(WSL local, no versionado en git).Implementado
scripts/minimax_tts.py: dictAUTHOR_VOICES = {382: "FrayMarcosFeadulta2026"}(382 = user_id de Fray Marcos, mismo mapping queassign_author_photos.php) +voice_for_author(author_id, default_voice).get_post_text()ahora devuelve también elauthor(post_author) — cambia el contrato a 3-tuplo(title, text, author).scripts/fea_post_io.php: accióngetincluyeauthor; acciónsetaudio <id> <relpath> [voice_id]ahora acepta la voz como 3er argumento opcional (defaultNicoFeadulta2026si no se pasa, retrocompatible).scripts/tts_produce.py: por cada post calculavoice = mm.voice_for_author(author, VOICE)y la usa en la síntesis y ensetaudio. El resto de autores sigue con Nico sin cambios.scripts/sync_audio_to_prod.py: al publicar en prod, lee el meta localfea_audio_voicereal y lo propaga (antes forzaba siempreNicoFeadulta2026al llamarsetaudioen prod — bug latente, corregido de paso).Regenerado
El único artículo de Fray Marcos de la carta 734 (post #54251, «Creerme tierra buena es el mayor peligro») se había locutado esta mañana con Nico (antes de tener el clon). Se regeneró con
FrayMarcosFeadulta2026y se resincronizó a prod; verificado byte-a-byte local↔prod y metafea_audio_voicecorrecto en ambos.Pendiente
assign_author_photos.php: sin voz clonada todavía, caen a Nico por defecto (comportamiento esperado hasta que Inma consiga más grabaciones, ver cuerpo del issue).Voz de José Antonio Pagola clonada (2026-07-08)
Origen: vídeo de YouTube (
https://youtu.be/_O0rbalEVFk), tramo de 2 min desde t=249s (los tramos en t=24 y t=27.5 tenían música de fondo colada, descartados tras revisar espectrograma).voice_id = PagolaFeadulta2026. Cableado enAUTHOR_VOICESdescripts/minimax_tts.py(author_id 383 = José Antonio Pagola, mismo mapping queassign_author_photos.php). Mismo mecanismo que Fray Marcos (#152): solo sus artículos usan su voz, el resto sigue con Nico.Regenerado
El único artículo de Pagola de la carta 734 (post #54252, «Sembrar con fe») se había locutado con Nico. Regenerado con
PagolaFeadulta2026y resincronizado a prod; verificado byte-a-byte y meta correcto en ambos.Pendiente (decisión de Rafa: dejarlos para más adelante)
Otros 8 artículos de Pagola con audio ya generado con Nico, sin regenerar por ahora:
Voz de José Luis Sicre clonada (2026-07-08)
Origen: vídeo de YouTube (
https://www.youtube.com/watch?v=MWmvTK5b1Jw), tramo de 2 min desde t=1s. Limpio a la primera (sin música colada como en el caso de Pagola).voice_id = SicreFeadulta2026. Cableado enAUTHOR_VOICESdescripts/minimax_tts.py(author_id 774 = José Luis Sicre).Regenerado
El único artículo de Sicre de la carta 734 (post #54250, «Respuestas para una crisis de la Iglesia») se había locutado con Nico. Regenerado con
SicreFeadulta2026y resincronizado a prod; verificado byte-a-byte y meta correcto en ambos.Pendiente (igual criterio que Pagola: dejarlos para más adelante)
Otros 6 artículos de Sicre con audio ya generado (3 con Nico, 3 sin meta de voz registrado — anteriores a ese tracking), sin regenerar por ahora:
Estado de voces clonadas hasta ahora
FrayMarcosFeadulta2026PagolaFeadulta2026SicreFeadulta2026assign_author_photos.php: siguen con Nico por defecto.Voz de José Arregi clonada (2026-07-08)
Origen: 2 candidatos probados.
https://youtu.be/7vxJcFQHg-ct=2118s: descartado — ruido de fondo más alto de lo normal (~-41dB en huecos vs ~-55dB de los otros) + tono fino persistente ~12.5kHz en el espectrograma.https://www.youtube.com/live/Sp3nNwb3mdYt=477s: usado, limpio (huecos de silencio real por debajo de -45dB, sin tono).voice_id = ArregiFeadulta2026. Cableado enAUTHOR_VOICESdescripts/minimax_tts.py(author_id 386 = José Arregi).Sin regenerar nada
Arregi tiene 3 artículos con audio antiguo (#45004, #45028, #45033 — todos anteriores al tracking de
fea_audio_voice, sin meta de voz registrado) pero ninguno en la carta 734, así que no aplica el patrón de regenerar-el-más-reciente esta vez.Estado de voces clonadas hasta ahora
FrayMarcosFeadulta2026PagolaFeadulta2026SicreFeadulta2026ArregiFeadulta2026assign_author_photos.php: siguen con Nico por defecto.