Skip to content

v0.71.0 — El karaoke enciende palabra por palabra

Choose a tag to compare

@santiquiroz santiquiroz released this 19 Aug 04:26
· 14 commits to master since this release

El karaoke ahora enciende la letra palabra por palabra.

Antes la línea aparecía entera en blanco, que es un video con subtítulos. Lo que lo
vuelve karaoke es ver dónde va la voz ahora.

De dónde salen los tiempos

No de un reparto: son los del modelo. Whisper sabe en qué segundo cae cada palabra,
pero esa información no está en el texto — vive en los pesos de cross-attention del
decoder, y hay que alinearlos con DTW.

El problema: el grafo ONNX oficial de Whisper no publica esos pesos. Con eso,
pedirle tiempos por palabra devuelve cero.

Resultó que sí los calcula, solo que no los expone. Los nodos están ahí, con nombre.
Promoverlos a salidas del grafo alcanza — sin PyTorch, sin volver a descargar nada, y
sobre el .onnx que ya tenés instalado.

Cuánto se equivoca

Medido contra una verdad conocida, no estimada: se sintetiza cada palabra por
separado —así se sabe su duración exacta— y se pegan con silencios fijos, de modo que
los límites son un cálculo.

tiempos del modelo repartir la línea por letras
error medio 147 ms 320 ms
p90 259 ms 583 ms
máximo 260 ms 665 ms

La segunda columna importa tanto como la primera: 147 ms no significa nada hasta saber
contra qué. Le gana 2,2x en promedio y 2,6x en la cola, y eso es lo único que justifica
pagar una pasada más del decoder.

Podés rehacer la medición vos: scripts/make-word-alignment-bench.ps1 arma el banco con
la voz que ya trae Windows, y scripts/bench-word-alignment.py mide.

Si algo falla, no perdés la transcripción

Alinear es una mejora del karaoke. Si el modelo instalado no declara sus alignment
heads
, o el grafo no expone las atenciones, o cualquier otra cosa se rompe, el texto
sale igual y el karaoke vuelve al reparto proporcional. Nunca se cambia algo que
funciona por algo que decora.

Para quien quiera hacer esto en su propio proyecto

El algoritmo, la validación contra transformers (1.06e-06), la accuracy medida y las
trampas que costaron tiempo están en un repo aparte, MIT y documentado:
port-whisper-words-onnx.

Dos que valen solas: transformers usa sdpa por defecto y ese kernel nunca materializa
la matriz de pesos (las atenciones vuelven None), y alignment_heads aparece en
la config del generador, lo que hace parecer que debería funcionar cuando no.


3889 pruebas de backend en verde.