Cómo funciona
Transcribir audio con Whisper, dentro de tu navegador
La página ejecuta un modelo abierto de reconocimiento de voz, Whisper, dentro de la pestaña de tu navegador. Aquí verás qué descarga, cómo lee un archivo largo sin cargarlo entero, cómo se forman los párrafos y por qué el tiempo cambia de un dispositivo a otro.
Tres pasos, todos dentro de tu navegador
1. Tu navegador lee el archivo
Donde tu navegador puede, un worker de tu pestaña toma la pista de sonido en fragmentos de 30 segundos y la convierte en el sonido mono a 16 kHz que espera el modelo.
2. Whisper la transcribe por ventanas
El motor, whisper.cpp compilado a WebAssembly, transcribe unos tres minutos de sonido cada vez y entrega a la página el texto de cada ventana.
3. La página ordena el texto
Las palabras se agrupan en párrafos en las pausas, con una marca de tiempo en cada uno si la quieres, listas para buscar, copiar o guardar en TXT.
El modelo: Whisper, base o small
Whisper es un modelo de reconocimiento de voz que OpenAI publicó en 2022, con su código y sus pesos bajo licencia MIT. Escucha el sonido en tramos de 30 segundos y escribe las palabras, con los tiempos de cada segmento. Este sitio ofrece dos tamaños:
- El modelo pequeño (el predeterminado) es Whisper base, guardado con 5 bits por peso. Es la descarga más ligera.
- El modelo grande es Whisper small, guardado con 8 bits por peso: una descarga mayor que necesita más memoria.
Guardar los pesos con menos bits (cuantización) reduce el tamaño de un modelo a cambio de algo de precisión. Todavía no publicamos cómo se comparan los dos tamaños en este motor, idioma por idioma: primero medimos, luego describimos. El menú de idiomas recoge los idiomas que se le pueden indicar a Whisper; con la detección automática, el motor elige el idioma en la primera ventana que tiene voz y lo mantiene para el resto del archivo.
El motor: whisper.cpp compilado a WebAssembly
El modelo se ejecuta en whisper.cpp, una versión de código abierto de Whisper escrita en C/C++, que compilamos a WebAssembly (un formato de programa que ejecuta cualquier navegador actual) con una pequeña interfaz propia. Hay tres versiones, y la página las prueba en este orden:
- WebGPU, si tu navegador ofrece un adaptador gráfico con las funciones que necesita el motor. Aún no hemos medido esta versión en una tarjeta gráfica real, así que no afirmamos nada sobre ella.
- WebAssembly en varios hilos, uno por cada núcleo lógico que declara tu navegador. Los hilos necesitan que la pestaña esté aislada entre orígenes, algo que dan las cabeceras del sitio.
- WebAssembly en un solo hilo, si no hay hilos disponibles o tu navegador declara dos núcleos lógicos o menos. Da el mismo tipo de resultado.
Si una versión no arranca, o si la versión WebGPU falla durante la transcripción, la página reinicia el motor con la versión siguiente y continúa. La línea sobre la transcripción indica qué versión hizo el trabajo.
Qué descarga la página, y cuándo
Al abrir la página solo se descargan la página y sus propios archivos. El motor y un modelo llegan desde este sitio cuando añades tu primer archivo:
| Archivo | Tamaño | Cuándo |
|---|---|---|
| Motor, versión multihilo o de un hilo (una de las dos) | unos 1,5 MB | Tu primer archivo |
| Modelo pequeño (Whisper base, 5 bits), el predeterminado | 59,7 MB en 3 partes | Tu primer archivo con él |
| Modelo grande (Whisper small, 8 bits) | 264,5 MB en 13 partes | Solo si lo eliges |
| Detector de voz (Silero VAD) | 0,9 MB | Tu primer archivo |
| Lector multimedia (Mediabunny), parte de los scripts de la página | unos 0,3 MB | Tu primer archivo |
| Motor, versión WebGPU | unos 3,4 MB | Solo si el navegador ofrece un adaptador WebGPU utilizable |
Los modelos llegan en partes de 20 MiB como máximo, porque el alojamiento no sirve ningún archivo de más de 25 MiB. Antes de que el motor use una parte, tu navegador la compara con su huella SHA-256, de modo que una descarga dañada se rechaza en lugar de dar una transcripción errónea. Las partes verificadas se quedan en el Cache Storage de tu navegador cuando tiene espacio para ellas, así que tu siguiente archivo, y tu siguiente visita, se ahorran la descarga.
Por qué tu grabación nunca se sube
Cada paso ocurre dentro de tu pestaña, el sitio no tiene ningún punto que pueda recibir un archivo y la página solo puede conectarse a este sitio. La comprobación de que tu grabación no se sube está en la página de privacidad y seguridad, con los pasos para ver tú mismo las solicitudes.
Cómo se lee y se transcribe un archivo largo
Una grabación de una hora ocupa unos 115 MB de sonido una vez descodificada a mono y 16 kHz (3.600 segundos x 16.000 muestras x 2 bytes, o el doble como los números de 32 bits con los que trabaja el motor). Por eso, siempre que el navegador lo permite, la página no descodifica el archivo entero de una vez. Un segundo worker abre el archivo con Mediabunny, descodifica su pista de sonido con el descodificador del propio navegador, 30 segundos cada vez, y solo entrega el fragmento siguiente cuando el motor está listo para recibirlo.
Los fragmentos se unen en ventanas de unos tres minutos. Cada ventana termina en el medio segundo más silencioso de sus últimos 15 segundos, para que un corte rara vez caiga dentro de una palabra, y las ventanas se suceden sin huecos ni solapes. Un pequeño detector de voz marca los tramos con habla de cada ventana, así el modelo se salta el silencio en lugar de escribir palabras sobre él. Cada ventana se transcribe con el final del texto anterior como contexto, lo que ayuda a una frase que queda partida por un corte, y sus tiempos se colocan de nuevo sobre el reloj del archivo.
Cuando termina una ventana, sus párrafos aparecen en la página, así que puedes empezar a leer y a buscar mientras sigue el resto. Si tu navegador no tiene descodificador para el sonido de un archivo, la página pasa a descodificar el archivo entero de una vez, y entonces rechaza los de más de 500 MB o de más de 1 hora.
Cómo se forman los párrafos y las marcas de tiempo
Whisper devuelve segmentos de texto con un tiempo de inicio y otro de fin, y un tiempo para cada palabra. La página los une en párrafos: uno nuevo empieza en una pausa de 2 segundos o más, medida con los tiempos de las palabras a cada lado, y un párrafo que pasa de unos 600 caracteres termina en el siguiente final de frase. No hay etiquetas de hablante, así que un salto de párrafo indica una pausa o un tramo largo de habla, nunca un cambio de voz.
La marca de tiempo de un párrafo es el momento en que empieza su primera palabra, escrita como [hh:mm:ss] y redondeada hacia abajo al segundo. Es aproximada: sirve para encontrar un pasaje en la grabación, no para subtítulos. Copiar el texto y Descargar TXT escriben los mismos párrafos, separados por una línea en blanco y con las marcas de tiempo si están visibles.
Por qué cambia el tiempo
El trabajo lo hace tu procesador, así que el mismo archivo tarda distinto en un portátil nuevo y en uno antiguo, y el modelo y la duración de la grabación también cuentan. Por eso la página no promete ninguna velocidad. En cuanto el motor informa de su primer avance, la página mide cuántos segundos de trabajo cuesta cada segundo de sonido en tu dispositivo, lo suaviza entre ventanas para que un momento lento no lo desvíe y muestra el tiempo que falta.
Qué necesita tu dispositivo
- Un navegador actual con WebAssembly. Chrome, Edge, Firefox y Safari lo tienen; nuestra prueba automática se ejecuta en Chromium.
- Memoria libre suficiente para el modelo y una ventana de sonido. El modelo grande necesita más; publicaremos cifras medidas cuando las tengamos.
- Conexión para el primer archivo. El modelo se guarda en el almacenamiento del navegador cuando hay espacio para él, así que las visitas siguientes no lo descargan.
Los componentes de código abierto del motor, los modelos y el lector multimedia aparecen con sus licencias en la página de créditos.
Preguntas sobre el motor
¿Es el mismo Whisper que publicó OpenAI?
Es el mismo modelo: OpenAI publicó el código y los pesos de Whisper con licencia MIT. Esta página usa esos pesos en el formato de archivo del proyecto de código abierto whisper.cpp, cuantizados (guardados con menos bits por peso) para que la descarga sea menor. El motor es whisper.cpp compilado a WebAssembly, no el código Python de OpenAI, y ninguna solicitud va a OpenAI.
¿Usa mi tarjeta gráfica?
Lo intenta. Si tu navegador ofrece WebGPU con las funciones que necesita el motor, la página arranca primero la versión WebGPU y, si falla, pasa sola a las versiones para CPU. Nuestras máquinas de prueba no tienen tarjeta gráfica, así que de la versión WebGPU solo hemos comprobado que cede el paso sin problemas. La línea sobre la transcripción dice qué versión hizo el trabajo.
¿Por qué se volvió a descargar el modelo?
Tu navegador guarda el modelo en su Cache Storage para este sitio hasta que borras los datos del sitio, o hasta que el propio navegador lo borra para liberar espacio. Después, el siguiente archivo lo vuelve a descargar. Qué guarda tu navegador y cómo borrarlo lo explica con detalle.
¿Qué pasa al pulsar Cancelar?
La página detiene el motor al momento cerrando el worker en el que se ejecuta y descarta los párrafos hechos hasta entonces. Tu siguiente archivo arranca un motor nuevo y toma el modelo del almacenamiento del navegador, así que el modelo no se vuelve a descargar.
Fuentes
- OpenAI, repositorio de Whisper: El código del modelo, su licencia MIT y la tabla de tamaños (base y small).
- Radford y otros, Robust Speech Recognition via Large-Scale Weak Supervision (2022): El artículo que presenta Whisper.
- whisper.cpp: La versión en C/C++ de Whisper que el motor compila a WebAssembly (versión 1.9.4), y sus archivos de modelo cuantizados.
- Silero VAD: El detector de actividad de voz que encuentra los tramos con habla.
- Mediabunny: La biblioteca multimedia que lee por fragmentos la pista de sonido de tu archivo.
- MDN, AudioDecoder (WebCodecs): El descodificador del propio navegador, que convierte el sonido comprimido en muestras.
- MDN, CacheStorage: Donde se guardan entre visitas las partes verificadas del modelo.
- web.dev, Making your website cross-origin isolated using COOP and COEP: Por qué el sitio envía estas cabeceras: los hilos de WebAssembly necesitan SharedArrayBuffer.
- Cloudflare Workers, Limits: El límite de 25 MiB por archivo estático, la razón de que los modelos lleguen en partes.
Pruébalo con una grabación
La transcripción se hace en tu navegador. Tu archivo nunca sale de tu dispositivo.