Cómo funciona
Cómo tu vídeo se convierte en subtítulos sin salir de tu dispositivo
Subtitle Generator ejecuta un modelo de reconocimiento de voz dentro de la pestaña de tu navegador. Aquí tienes cada paso del archivo a los subtítulos, qué descarga y guarda tu navegador, y qué hemos medido y qué no.
Cinco pasos, todos dentro de la pestaña
1. Tu navegador abre el archivo
Eliges un archivo de vídeo o audio y el navegador le da a la página ese único archivo. La página se lo pasa al motor dentro de la pestaña. No se sube nada.
2. El sonido se lee por partes
Donde tu navegador puede, un lector multimedia en un Web Worker lee el sonido de 30 en 30 segundos con los decodificadores de tu navegador y lo pasa a 16 kHz mono, la forma que usa el modelo.
3. Ventanas cortadas en los puntos más silenciosos
El sonido se agrupa en ventanas de unos 3 minutos. Cada corte cae en el centro del medio segundo más silencioso de los 15 segundos anteriores a la marca de 3 minutos, para cortar en una pausa y no dentro de una palabra.
4. El modelo escribe cada ventana
Un detector de voz marca los tramos con habla, y el modelo de reconocimiento de voz los escribe, con su propia estimación de cuándo empiezan y acaban las palabras.
5. Las palabras se vuelven subtítulos
Las palabras se reparten en subtítulos que dé tiempo a leer, los subtítulos aparecen en la página y tú los editas. El archivo SRT o VTT se escribe al pulsar descargar.
El modelo: Whisper, en dos tamaños
Las palabras salen de Whisper, un modelo de reconocimiento de voz que OpenAI publicó en 2022 con sus pesos bajo la licencia MIT. Funciona a través de whisper.cpp, una versión de código abierto en C++, que compilamos a WebAssembly para que pueda ejecutarse en una página web. Eliges entre dos tamaños:
- El modelo más pequeño (el predeterminado) es Whisper base, guardado con sus pesos redondeados a 5 bits: una descarga de 59,7 MB.
- El modelo más grande de los dos es Whisper small, guardado con pesos de 8 bits: una descarga de 264,5 MB que necesita más memoria.
En el artículo de OpenAI, los modelos Whisper más grandes obtuvieron mejores resultados en la mayoría de sus pruebas, con las menores mejoras en inglés, pero todavía no hemos medido cómo se comparan estos dos en este motor, así que la página los llama «más pequeño» y «más grande» en vez de prometer que uno es más preciso. Antes del modelo, un pequeño detector de voz, Silero VAD, marca dónde se habla, para que el modelo dedique su tiempo a la voz. Si dejas el idioma en automático, el modelo lo identifica en la primera ventana con voz y la página mantiene ese idioma para el resto del archivo.
Cada ventana se escribe con las últimas palabras anteriores, unos 200 caracteres, como contexto: el modelo las lee como el texto que venía justo antes del corte. En cuanto termina una ventana, sus subtítulos aparecen en la página y puedes editarlos mientras se escribe la siguiente. Crea subtítulos de tu vídeo para verlo.
Cómo las palabras se vuelven subtítulos
El modelo entrega segmentos de texto, cada uno con un inicio y un final, y su estimación de cuándo empiezan y acaban las palabras que contiene. Un segmento puede ser una frase larga, así que la página lo corta en subtítulos que dé tiempo a leer:
- Como máximo dos líneas de 42 columnas por subtítulo; un carácter ancho, como en chino o japonés, cuenta como dos columnas. Las escrituras sin espacios se dividen en palabras con el segmentador de palabras de tu navegador.
- Como máximo 7 segundos en pantalla, y al menos 1 segundo cuando el hueco hasta el siguiente lo permite.
- Los cortes caen entre palabras: primero al final de una frase, después en una coma o una pausa de medio segundo o más, y si no, donde las dos partes quedan parejas. Un signo de cierre se queda con la palabra anterior.
- El corte se cronometra con los tiempos de las palabras. Si el modelo no dio ninguno que encaje con el texto, el tiempo se reparte según el texto.
- Los subtítulos nunca se solapan, y ninguno termina después que el archivo.
Los tiempos salen de la estimación del propio modelo de dónde empiezan y acaban sus palabras, o de ese reparto según el texto, así que un subtítulo puede aparecer un poco antes o un poco tarde. Todavía no hemos medido cuánto en este motor. Si un subtítulo se desvía, puedes corregirlo a mano: mueve su inicio o su final 0,1 segundos, divídelo o únelo con el siguiente.
Qué versión del motor se ejecuta
El motor existe en tres versiones, y la página elige una cuando añades tu primer archivo:
- WebGPU, que se prueba primero cuando tu navegador ofrece un adaptador gráfico que pasa la comprobación de la página. Si falla al cargar o al escribir una ventana, la página cambia a una versión para el procesador y vuelve a escribir esa ventana.
- WebAssembly en varios hilos, un hilo por cada procesador lógico que indica tu navegador. Los hilos necesitan una página aislada entre orígenes, y por eso el sitio envía las cabeceras COOP y COEP.
- WebAssembly en un hilo, el último recurso para un navegador que no puede usar hilos, y la versión que se usa si tu navegador indica un solo procesador lógico.
La línea bajo la vista previa dice qué versión se usó, por ejemplo «WebAssembly en varios hilos». Todavía no hemos medido la versión WebGPU en una tarjeta gráfica real, así que el sitio no afirma nada sobre su velocidad. Sea cual sea la versión, tu dispositivo hace el trabajo: la línea de estado muestra una estimación del tiempo que falta, medida en tu dispositivo sobre la marcha, en vez de prometer una velocidad.
Qué descarga tu navegador y qué guarda
Todo llega de este sitio. Los modelos se dividen en partes de 20 MiB como máximo, porque el alojamiento sirve archivos estáticos de hasta 25 MiB, y cada parte se comprueba con su huella SHA-256 antes de usarse, así que una descarga dañada se rechaza en lugar de producir subtítulos erróneos. Los tamaños son los de los archivos publicados, en megabytes de un millón de bytes:
| Archivo | Tamaño | Se guarda en |
|---|---|---|
| El motor, versión WebAssembly de varios hilos (si no se usa WebGPU y tu navegador indica dos o más procesadores lógicos) | 1,6 MB | La caché normal del navegador |
| El motor, versión de un hilo (si no hay hilos disponibles o tu navegador indica un solo procesador lógico) | 1,5 MB | La caché normal del navegador |
| El motor, versión WebGPU (solo si la página encuentra una GPU utilizable) | 3,4 MB | La caché normal del navegador |
| El modelo más pequeño, Whisper base (el predeterminado) | 59,7 MB, en 3 partes | Cache Storage, tras comprobar cada parte con SHA-256, si el navegador tiene espacio |
| El modelo más grande, Whisper small (solo si lo eliges) | 264,5 MB, en 13 partes | Cache Storage, tras comprobar cada parte con SHA-256, si el navegador tiene espacio |
| El detector de voz, Silero VAD | 0,9 MB, en 1 parte | Cache Storage, tras comprobarlo con SHA-256, si el navegador tiene espacio |
| El lector multimedia (un script de la página, que se descarga al añadir tu primer archivo) | 0,3 MB | La caché normal del navegador |
El motor, el lector multimedia, el modelo y el detector solo se descargan cuando añades un archivo, no al abrir la página. La página nunca almacena tu archivo, su sonido ni tus subtítulos: viven en la pestaña abierta y desaparecen al cerrarla. Para eliminar el modelo guardado, borra los datos de este sitio en tu navegador. La prueba de red paso a paso muestra cómo ver todo esto en las herramientas para desarrolladores de tu navegador.
Cómo lo probamos
Una prueba automática de navegador se ejecuta con cada cambio del sitio. Carga una copia compilada del sitio en Chromium, el motor de Chrome y Edge, con las cabeceras de seguridad del propio sitio, y comprueba, entre otras cosas, que:
- una frase en inglés de 3,5 segundos del corpus LibriSpeech, "Concorde returned to its place amidst the tents.", sale como subtítulos con dos palabras mal como mucho, con el modelo más pequeño, desde un archivo WAV, un vídeo MP4 y un archivo WebM;
- tras una edición, un desplazamiento de 0,1 segundos y una división, los archivos SRT y VTT se leen de vuelta exactamente como los subtítulos de la página, y el lector de subtítulos del propio Chromium carga el VTT;
- en un archivo de 60 segundos con la misma frase cada 10 segundos, procesado con ventanas de prueba de 20 segundos en vez de los 3 minutos de la herramienta, los subtítulos aparecen en al menos tres pasos, y en cada una de las seis marcas un subtítulo con la frase entera empieza entre medio segundo antes de la marca y 2 segundos después;
- Cancelar detiene el proceso, y el siguiente archivo reutiliza el modelo guardado, sin una nueva descarga;
- un clip en silencio no da subtítulos, una parte dañada de un archivo conserva los subtítulos anteriores y un archivo que no es multimedia se rechaza;
- cada solicitud va a este sitio, como GET o HEAD sin cuerpo.
Esa prueba usa una frase breve de una sola persona, en un solo idioma. Demuestra que las piezas funcionan juntas; no mide la precisión de los subtítulos.
Límites que conviene conocer
- La precisión y los tiempos aún no están medidos en este motor, así que ninguna página da una cifra. En el artículo de OpenAI, la tasa de error de Whisper variaba de un idioma a otro, muy ligada a la cantidad de voz de entrenamiento de cada idioma, y subía a medida que aumentaba el ruido de fondo añadido.
- Sin nombres de quien habla, sin descripción de sonidos, sin traducción. Los subtítulos son las palabras dichas, en el idioma en que se dicen.
- Los archivos largos tardan. Donde tu navegador puede, la página lee por partes y nunca tiene todo el sonido del archivo a la vez, pero cada minuto de audio es trabajo para tu procesador. El archivo más largo que hemos procesado hasta ahora dura 12 minutos.
- Algunos archivos se leen enteros. Cuando tu navegador no puede decodificar el sonido por partes, la página lo decodifica de una vez y se detiene en 500 MB o 1 hora.
- No está probado en teléfonos. El modelo más grande puede necesitar más memoria de la que un teléfono tiene libre; la página avisa cuando el navegador informa de que se ha quedado sin ella.
Los componentes de código abierto y sus licencias están en la página de créditos de código abierto.
Pruébalo con tu propio vídeo
Funciona en tu navegador. Tu archivo nunca sale de tu dispositivo.