# Loros · banco de frases y subfrases para Finaz

**Estado actual · 11 de septiembre de 2026:** primeros prototipos exclusivamente en **español peninsular `es-ES`**. Inglés de EE. UU. después. Ampliación por pilotos de escucha y coste; sin series grandes antes de validar calidad y dificultad.

## Bitácora única de escucha

**[Abrir la bitácora de Loros](bitacora.html)** · [Último piloto H3](bitacora.html#h3). Cada aporte tiene fecha y hora de Madrid, navegación al histórico, filtros, audios comparables, texto y prompt de Gemini, cortes, procesamiento local y métricas de Whisper. Las notas de escucha se guardan en el navegador y se pueden exportar.

**Nueva comparación larga:** [toma completa, dos bloques y cuatro bloques](bitacora.html#seed-frases-largas). Dos textos ficticios de 34 palabras, seis versiones, todas con Charon y seed 12345. Cierre reutilizado en los cuatro montajes. Coste nuevo 0,033404 USD; acumulado **0,788924 USD**. [Guía de escucha y método](docs/SEED_FRASES_LARGAS.md).

**Nueva prueba de subfrases:** [activo + verbo + cantidad con seed fijo](bitacora.html#seed-subfrases). Seis grabaciones independientes, ocho montajes locales y dos referencias; pendientes de escucha, especialmente BBVA y verbo → cantidad. Coste reportado de este experimento 0,014007 USD; acumulado hasta esa prueba **0,755520 USD**. [Método, dificultades y costes](docs/SEED_SUBFRASES.md).

**Seed ya probado:** doce llamadas reales, sin caché local; cinco repeticiones con semilla fija produjeron tres audios distintos, incluidas dos parejas idénticas. [Escuchar y ver resultados](bitacora.html#seed-prueba-1). Coste nuevo 0,020172 USD; acumulado hasta esa prueba **0,741513 USD**. H3 muestra ahora en cada tarjeta los fragmentos A/B, fuentes completas, cortes y ajustes de volumen.

H3 prueba cantidades compartidas entre subida y bajada con dos fórmulas: «La subida/bajada es de…» y «Sube/baja un…». Hay 12 montajes y 8 referencias; **pendientes de escucha**, sin ampliar el banco. Siete tomas nuevas: **0,015297 USD**; acumulado documentado **0,721341 USD**. [Método y resultados](docs/H3_RESULTADOS.md).

```bash
python visor.py                       # Abre la bitácora en el navegador
python tools/build_bitacora.py        # Actualiza el mismo HTML, sin TTS
```

Las entradas se mantienen en `data/bitacora.json`; [cómo añadir una contribución](docs/H3_RESULTADOS.md#actualizar-la-bitácora). Los HTML antiguos se conservan como archivos históricos.

La propuesta y sus condiciones de avance están en [Plan de Loros](docs/PLAN_LOROS.md). Se acepta probar la pausa tras el activo si resulta natural y ágil. El primer piloto tiene **cuatro donantes**, una voz candidata (Charon) y el caso problemático «sube un uno». Sus **tres versiones han sido aceptadas por el usuario para el piloto**. Coste calculado de las cuatro tomas: **0,008298 USD**.

[Escuchar la comparación H1](output/runs/loros_h1_es_v1-94ec53f7c3a1/experimentos/h1_pausa_v1/index.html): ensamblado, referencia con pausa y referencia continua. Las siguientes pruebas abordarán composición interna de cantidades y fechas con pocos donantes, sin generar todas las combinaciones.

```bash
python demo.py --plan data/loros_h1_es.json --pace ideal_200 --prepare --no-browser
```

Abre `index.html` para inspeccionar los textos y peticiones. Este plan contiene los donantes. El montaje candidato se reproduce con `python tools/build_loros_h1.py`; sus tres versiones ya fueron aceptadas por el usuario. Consulta el plan antes de lanzar síntesis: el runner limita clips, pero no tiene límite monetario automático.

El informe recibido se conserva en [InputExternal](InputExternal/informe_contextual.txt); su [código auxiliar](InputExternal/finaz_tts_starter/README.md) es una base experimental, no un motor acústico validado. [Log.md](Log.md) conserva aceptaciones y rechazos históricos. La documentación siguiente describe el paquete de demo original; para decisiones actuales prevalecen el plan y la entrada más reciente del registro.

## H2: cuatro activos, dos movimientos, tres cantidades

[Escuchar H2: 24 combinaciones, boletín y referencias](output/loros_h2/index.html). **Diez módulos compartidos**, dos de ellos recuperados de H1, permiten cambiar activo y predicado sin volver a sintetizar. H2 ha sido aceptado por el usuario para el piloto; las cantidades aún permanecen dentro de cada predicado.

```bash
# Componer solo lo solicitado, sin TTS ni clave:
python tools/build_loros_h2.py --asset bbva --movement baja --amount 1_05
```

[Resultados y límites de H2](docs/H2_RESULTADOS.md). Coste nuevo calculado: **0,066212 USD**, incluidos dos rechazos; acumulado documentado **0,688413 USD**. Autorización vigente: continuar por debajo de 3 USD, siempre con pruebas pequeñas antes de ampliar.

## H2: comparación de tres versiones

[Escuchar ensamblado, referencia con pausa y referencia continua](output/loros_h2_comparacion/index.html), lado a lado para Inditex, BBVA, euro dólar y el boletín. «Continua» significa sin pausa de rótulo; no es una cuarta variante diferente de «sin pausa». Los ensamblados son los ya aceptados, sin modificación de sus bytes. Las referencias son tomas completas de Gemini; no se ha construido un ensamblado continuo en esta prueba.

Cinco referencias nuevas y tres recuperadas de caché. Coste calculado nuevo: **0,017631 USD**; acumulado **0,706044 USD**. El usuario confirmó que BBVA estaba bien pronunciado: «BDVA» fue un error de Whisper, registrado en `qa/loros_bbva_pronunciacion.json`.

## Paquete de demo original · FINAZ Gemini TTS

**Entrega 3.0.0-demo.1 · 10 de septiembre de 2026 · español de España peninsular**

Un paquete único con la biblioteca v2 completa (1.002 frases), sus fuentes y herramientas, los tres ZIP anteriores, un guion ficticio de unos cinco minutos, generación de audio con `gemini-3.1-flash-tts-preview` y un visor para buscar, escuchar, comparar y componer pruebas propias.

## Ejecutar: cambia una línea y lanza el script

Descomprime **todo el ZIP**. No ejecutes el script desde dentro de un archivo comprimido. Necesitas Python **3.11 o posterior**, acceso a Internet y una clave de Google AI Studio con acceso al modelo y cuota disponible.

Abre `demo.py` y sustituye este valor por tu clave real:

```python
API_KEY = "manuelcambialaclave0000"
```

Guarda y ejecuta desde la carpeta del paquete:

```bash
python demo.py
```

En equipos donde el comando sea `python3`:

```bash
python3 demo.py
```

**No hay paquetes Python que instalar para esta demo.** El runner usa la API REST y la biblioteca estándar. No necesita `google-genai`, `requests`, Pydantic ni una instalación del proyecto antiguo para generar WAV. El runtime original de `biblioteca_v2/` conserva sus dependencias propias, pero no forma parte de este arranque.

El script genera y guarda los audios automáticamente. Abre el visor al terminar. No tienes que copiar base64 ni descargar manualmente la respuesta de Google.

Como alternativa a editar la clave, la variable de entorno `GEMINI_API_KEY` tiene prioridad. No pongas la clave en argumentos de consola, JSON, prompts o HTML. **No compartas ni publiques `demo.py` después de introducir una clave real.**

## Qué encontrarás al terminar

```text
output/
  demo_completa.wav                 Último montaje REAL terminado
  demo_completa.mp3                 También, si FFmpeg está disponible
  ULTIMO_AUDIO_COMPLETO.json        Identifica a qué ejecución pertenecen
  runs/<identificador>/
    clips/01.wav ...               Cada intervención por separado
    requests/01.json ...           Peticiones exactas, SIN la clave
    demo_completa.wav              Montaje completo de esta ejecución
    demo_completa.mp3              Conversión opcional
    transcripcion.txt              Guion resuelto
    transcripcion_por_clips.vtt    Límites exactos de clip, no por palabra
    manifest.json                  Voz, estilo, hashes, tiempos y estado
  cache/gemini/                    Audios recuperables y metadatos
index.html                         Visor actualizado de todas las ejecuciones
```

El WAV es **PCM mono de 16 bits a 24.000 Hz** cuando la respuesta corresponde al formato solicitado y validado. Se inspecciona la cabecera de WAV o se encapsula el PCM que devuelve Gemini; no se cambia una extensión para fingir otro formato.

El objetivo editorial de referencia para FINAZ es **200 palabras por minuto medidas**, con margen por tipo de contenido. Las cifras complejas pueden requerir algo menos. Como Gemini interpreta el ritmo solicitado y no ofrece un control determinista, siempre se registra la velocidad real de la toma.

El MP3 es opcional. Si `ffmpeg` ya está en el PATH, se crea además un MP3 a 160 kbit/s. Si no está, **el WAV funciona igualmente**. No se instala ni descarga FFmpeg de forma oculta. El montaje conserva los WAV originales, sin aceleración, recorte de palabras, relleno a cinco minutos ni normalización de sonoridad pretendidamente certificada.

## Qué contiene la demo principal

**22 clips · 715 palabras · dos voces por defecto · ocho direcciones de lectura.** Los perfiles rápidos solicitan entre **165 y 180 palabras por minuto**, con pulso de boletín de última hora. El presupuesto calculado ronda los **250 segundos**, incluidas las pausas entre clips. Es una estimación; el manifiesto y el visor muestran la duración real después de generar. Pedir un ritmo al modelo no garantiza una duración exacta.

El guion recorre resultados empresariales; diferencias entre comparación histórica y consenso; partidas no recurrentes; sobrecompra persistente; señal y veto en simulación; datos insuficientes; revisiones de analistas; liquidez; un dato macro; signos y unidades; y una comparación de tres entonaciones con **la misma voz y el mismo texto**.

Voces predeterminadas: **Kore**, para conducción, y **Charon**, para análisis. No se presentan como personas reales ni fuentes independientes. El acento castellano peninsular se solicita explícitamente en todas las peticiones y se configura `es-ES`. Debes escucharlo y evaluarlo: no hay un certificado automático de acento, pronunciación o fidelidad numérica.

Los nombres, cifras y noticias son **ficticios**. Las partes procedentes de biblioteca se resuelven por ID exacto, sin reescribirlas. Las partes adicionales están redactadas en `data/demo_5min.json`, con números en palabras para probar su locución. No se pide a otro LLM que improvise noticias.

## El visor HTML

Abre **`index.html`** con doble clic, incluso antes de generar. Sin audios, verás la escaleta prevista y el catálogo, no grabaciones inventadas. Cuando el script genere archivos, actualizará el HTML. Recarga la página para ver avances si la tenías abierta.

Puedes recorrer la escaleta, buscar texto, filtrar por tono o estado, escuchar clips y el montaje, descargar archivos, consultar la procedencia de una frase y ver el prompt enviado. La forma de onda se obtiene del WAV real, no es un dibujo que simule un audio inexistente.

En **Biblioteca** puedes buscar las 1.002 frases, filtrar por familia o público y añadirlas a **Mi selección**. Allí puedes ordenar clips, cambiar voz y entonación, introducir texto ficticio propio y exportar un plan. Guarda el archivo descargado en la carpeta del paquete:

```bash
python demo.py --plan mi_demo.json
```

También puedes pasar la ruta completa al JSON de tu carpeta de Descargas. El plan se limita a 60 clips, y cada clip a 160 palabras: no se sintetiza por accidente toda la biblioteca.

Las notas de escucha quedan en el almacenamiento local de tu navegador, cuando está disponible. Puedes exportarlas como JSON. No se convierten por sí solas en aprobaciones editoriales de FINAZ.

El visor original se conserva en `biblioteca_v2/viewer/index.html`.

### Cuando el navegador bloquee archivos locales

El modo normal no requiere servidor. Como alternativa, ejecuta:

```bash
python visor.py
```

Sirve exclusivamente el visor y sus activos en `127.0.0.1`; no sirve `demo.py`, fuentes Python, claves ni listados arbitrarios de carpetas. Mantén esa consola abierta y pulsa Ctrl+C para cerrarla. No es necesario ni recomendable publicar todo el paquete con un servidor abierto a la red.

## Otros comandos útiles

| Comando | Resultado |
|---|---|
| `python demo.py --suite ultima_hora` | Nuevo boletín ficticio breve, a ritmo ágil, con tres clips y dos voces. |
| `python demo.py --suite cantidades --pace ideal_200` | Combina una frase fija y nueve frases programáticas A/B/C con cantidades distintas. |
| `python demo.py --suite combinaciones --pace ideal_200` | Genera esas diez oraciones por separado y después las concatena; prueba real de activos reutilizables. |
| `python demo.py --suite intrafrase --pace ideal_200` | Genera nueve cortes internos para el experimento 3×3; después se unen con `tools/build_intrafrase_combinations.py`. |
| `python demo.py --suite ultima_hora --pace rapida` | Los mismos textos a unas 195 palabras por minuto. |
| `python demo.py --suite ultima_hora --pace muy_rapida` | Los mismos textos a unas 215 palabras por minuto. |
| `python demo.py --suite ultima_hora --pace nativa_rapida` | Pide al TTS una toma nativa mucho más rápida; no aplica aceleración posterior. |
| `python demo.py --suite ultima_hora --pace nativa_muy_rapida` | Segunda toma nativa aún más rápida, sin posprocesado temporal. |
| `python demo.py --suite prueba_corta` | Tres primeros clips, dos voces; prueba inicial de conexión y escucha. |
| `python demo.py --suite alternativas_abc` | Tres textos de la misma situación con la misma voz y dirección. |
| `python demo.py --prepare` | Prepara la escaleta y el visor; ninguna petición ni generación. |
| `python demo.py --mock --limit 3` | Prueba técnica con tonos cortos, claramente marcados; no es voz Gemini. |
| `python demo.py --clip 21` | Genera o recupera solo ese clip. |
| `python demo.py --clip 21 --force` | Solicita una toma nueva y conserva la ejecución anterior. Puede volver a generar coste. |
| `python demo.py --voice Kore` | Usa Kore en todos los turnos para comparar una frente a dos voces. |
| `python demo.py --audio-tags` | Añade etiquetas experimentales de actuación a las instrucciones normales. |
| `python demo.py --api generate-content` | Usa la segunda ruta REST compatible; no cambia de modelo. |
| `python demo.py --no-mp3 --no-browser` | Solo WAV; no intenta abrir el navegador. |
| `python tools/run_tests.py` | Ejecuta las pruebas offline del nuevo runner. |
| `python tools/verify_bundle.py` | Comprueba el sello de integridad del paquete recibido. |

## Reanudación, errores y coste

Cada clip terminado se guarda inmediatamente. Al repetir el mismo comando, el sistema comprueba texto, voz, instrucciones, ruta API y bytes del WAV antes de reutilizar la caché. Cambiar el tono o activar etiquetas genera una identidad distinta. Los datos ficticios que justifican el guion no se confunden con una autorización de publicación real.

Si falla una petición, los audios anteriores se conservan. El montaje completo solo aparece cuando todos los clips de esa ejecución están listos. El visor distingue preparado, pendiente, generando, error y completo. No presenta una mezcla incompleta como episodio final.

Hay reintentos limitados para problemas de red, HTTP 429 y errores transitorios del servidor, con espera progresiva. Un fallo de permisos, clave o rechazo del modelo no provoca un bucle infinito ni un cambio silencioso de modelo. Un timeout puede haber consumido recursos en el proveedor aunque no recibas su resultado; los reintentos no garantizan coste cero.

La demo principal requiere inicialmente **22 trabajos de síntesis**, más los posibles reintentos. Los precios, límites y acceso dependen de tu proyecto: **no se promete generación gratuita**. El script conserva el uso reportado por la API cuando está disponible, pero no calcula una factura. No se ejecuta ninguna llamada real con la clave de ejemplo.

Un proceso local evita que dos instancias generen a la vez. Después de una terminación forzada del sistema puede quedar `output/.generation.lock`: comprueba que no existe otro `demo.py` activo y elimina ese archivo para continuar. No elimines un bloqueo de un proceso todavía en marcha.

## Archivos anteriores, conservados

`biblioteca_v2/` contiene los **206 archivos originales**, sin reescribirlos. Incluye las 1.002 frases, 40 reglas programáticas, 14 patrones y 56 planes del paquete anterior, además del código, pruebas, fuentes y documentación de esa entrega.

`historico/` conserva los **tres ZIP originales**: frases v1, auditoría MUST/SHOULD y biblioteca v2. Son referencia histórica: la demo utiliza la biblioteca v2, no las frases erróneas antiguas. `docs/PROCEDENCIA.json` recoge sus hashes.

## Alcance comprobado

Consulta `docs/VALIDACION.md` y los resultados en `qa/`. Se ha probado el recorrido de software con respuestas de API simuladas, no la voz real de Gemini. La clave facilitada es deliberadamente ficticia. La primera síntesis real, la cuota disponible y la evaluación auditiva se comprobarán al ejecutar con tu clave.

La biblioteca sigue siendo candidata a revisión; sintetizar una frase para una demo **no la promueve a publicación**. No se han ejecutado ni modificado los repositorios remotos de FINAZ en esta entrega.

### Comprobación opcional del visor para desarrolladores

`python tools/check_viewer.py` usa Playwright y un Chromium local para comprobar la interfaz y la exportación de planes. Son herramientas opcionales de QA; **no las instales para ejecutar `demo.py`**. El script carga el HTML sin red y prueba el reproductor con tonos temporales, no con voces reales.
