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, así que el trabajo lo hace tu dispositivo y tu archivo nunca se sube. Con tu primer archivo descarga un motor y el modelo desde este sitio, y tu navegador guarda el modelo para los siguientes archivos cuando tiene espacio.

Tres pasos, todos dentro de tu navegador

1. Tu navegador lee el archivo

Si el archivo se puede leer por partes, un worker de tu pestaña toma la pista de sonido 30 segundos cada vez; si no, la página descodifica el archivo entero de una vez. En ambos casos, el sonido pasa a ser el 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 en el formato de cuantización de 5 bits de whisper.cpp (q5_1). Es la descarga más ligera.
  • El modelo grande es Whisper small en el formato de 8 bits (q8_0): una descarga mayor que necesita más memoria.

La cuantización redondea los pesos del modelo a menos bits, lo que hace más pequeños los archivos. 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 hilo, si no hay hilos disponibles o tu navegador declara un solo núcleo lógico. 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, el lector multimedia, un modelo y el detector de voz llegan desde este sitio cuando añades tu primer archivo. Solo se queda una versión del motor: la versión WebGPU ocupa el lugar de una versión para CPU cuando arranca con un dispositivo GPU. Los tamaños están en MB, donde 1 MB son 1.000.000 bytes:

Archivos que la transcripción descarga de este sitio (tamaños de los archivos publicados)
ArchivoTamañoCuándo
Motor, versión WebGPUunos 3,4 MBTu primer archivo; se prueba primero si tu navegador ofrece un adaptador WebGPU utilizable
Motor, versión para CPU: WebAssembly en varios hilos o en un hilo (una de las dos)unos 1,5 MBTu primer archivo, salvo que la versión WebGPU arranque con un dispositivo GPU; y siempre que la versión WebGPU falle durante una transcripción
Modelo pequeño (Whisper base, formato de 5 bits), el predeterminado59,7 MB en 3 partesTu primer archivo con él
Modelo grande (Whisper small, formato de 8 bits)264,5 MB en 13 partesSolo si lo eliges
Detector de voz (Silero VAD)0,9 MBTu primer archivo
Lector multimedia (Mediabunny), parte de los scripts de la páginaunos 0,3 MBTu primer archivo

Los modelos llegan en partes de 20 MiB como máximo (un MiB son 1.048.576 bytes, así que 20 MiB son unos 21 MB), 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.

Diagrama de adónde va tu grabación: tu navegador lee el archivo; si el archivo se puede leer por partes, un lector multimedia en un worker descodifica su sonido en fragmentos de 30 segundos (si no, la página descodifica el archivo entero); el motor Whisper en WebAssembly lo transcribe por ventanas de unos 3 minutos, y tu pestaña muestra los párrafos para que los copies o los guardes en TXT. La grabación nunca se envía al servidor del sitio. El servidor envía la página y, con tu primer archivo, el motor, el lector multimedia, el modelo (unos 60 MB el pequeño, el predeterminado, en partes) y un pequeño detector de voz; el navegador guarda el modelo y el detector si tiene espacio.
Tu grabación se queda en la pestaña de tu navegador: entran la página, el motor, el lector multimedia, el modelo y el detector de voz, y no sale nada de tu archivo.

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, si el archivo se puede leer por partes, la página no descodifica el archivo entero de una vez. Un segundo worker abre el archivo con Mediabunny y lee su pista de sonido 30 segundos cada vez: Mediabunny descodifica el sonido comprimido con el descodificador del propio navegador, y el sonido sin comprimir, como el de un WAV, por sí mismo. 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 centro del medio segundo más silencioso de los 15 segundos anteriores a la marca de los tres minutos, con el fin de poner el corte en una pausa y no 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 las últimas palabras anteriores a ella, 200 caracteres como máximo, como indicación (prompt), pensada para dar al modelo la frase que el corte puede haber partido, 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. Cuando el archivo no se puede leer por partes, porque Mediabunny no abre su contenedor o tu navegador no tiene un descodificador que lea su sonido por partes, la página descodifica el archivo entero de una vez con el descodificador del propio navegador, sin Mediabunny, y entonces rechaza los de más de 500 MB o de más de 1 hora.

Cuatro pasos de un archivo largo a párrafos: la pista de sonido se lee en fragmentos de 30 segundos como mono a 16 kHz; los fragmentos se unen en ventanas de unos 3 minutos, cada una cortada en el medio segundo más silencioso; el detector de voz se salta el silencio y Whisper escribe las palabras de cada ventana con sus tiempos; una pausa de 2 segundos o más entre dos palabras empieza un párrafo nuevo, que puede llevar su marca de tiempo como [hh:mm:ss].
Siempre que el navegador puede leerla por partes, una grabación larga no se descodifica entera de golpe: pasa por la página fragmento a fragmento y ventana a ventana. Las cifras son ajustes del motor.

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

Tu dispositivo hace el trabajo, con la versión que la página haya podido arrancar, 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: el motor mantiene el modelo en memoria mientras trabaja, y el modelo grande necesita más. No damos ninguna cifra hasta haberla medido.
  • Conexión en cada visita: la página la necesita para abrirse, y tu primer archivo descarga además el motor y el modelo. No hay modo sin conexión. Si tu navegador tiene espacio, guarda el modelo, de modo que los siguientes archivos y visitas no repiten esa descarga.

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 descarga y arranca primero la versión WebGPU. Si esa versión no registra ningún dispositivo GPU, no arranca o falla durante una transcripción, la página descarga una versión para CPU y sigue con ella. Nuestras máquinas de prueba no tienen una GPU utilizable, así que la versión WebGPU real nunca se ha ejecutado en una GPU en nuestras pruebas: el paso a una versión para CPU se prueba con fallos de WebGPU simulados, y en esas máquinas la página va directamente a una versión para CPU. 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, donde el navegador lo guardó si tenía espacio, así que el modelo no se vuelve a descargar.

Fuentes

Pruébalo con una grabación

La transcripción se hace en tu navegador. Tu archivo nunca sale de tu dispositivo.

Abrir la herramienta de transcripción