Hear every voice in your language
실시간 AI 더빙과 양언어 자막을 제공, 무료·오픈소스·프라이버시 보장
Escriba 자체 Gemini·GPT·Claude 키로 회의 녹화·전사하는 무료 오픈소스 크롬 확장
Free, open-source Chrome extension that records Meet, Teams, Zoom web or in-person meetings and transcribes them with your own Gemini, GPT or Claude key. No server, no account.
플러그인JavaScript · CSSGitHub @AlvaroGarrido10온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Free Chrome extension that records meetings (Meet, Teams, Zoom web or in person) and transcribes them with your own Gemini, GPT or Claude key. No server, no account, no subscription.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Instalar desde la Chrome Web Store · Web · English website · Descargar el zip Extensión de Chrome (Manifest V3) que graba reuniones y las transcribe con IA. Sin servidor, sin cuenta y sin suscripción: cada usuario pone su propia clave de API (BYOK) y el audio va de su navegador al modelo, sin intermediarios.README 전문 보기 ↗
Instalar desde la Chrome Web Store · Web · English website · Descargar el zip
Extensión de Chrome (Manifest V3) que graba reuniones y las transcribe con IA. Sin servidor, sin cuenta y sin suscripción: cada usuario pone su propia clave de API (BYOK) y el audio va de su navegador al modelo, sin intermediarios. Y sin clave también graba: guarda el audio en tu equipo y lo transcribe el día que pongas la clave.
Descargas\reuniones\ como .md y queda en el historial..wav en Descargas\reuniones\ (mono, 24 kHz; unos 170 MB por hora). Sin clave no sale nada de tu equipo. El historial guarda las 20 últimas: descarga lo que quieras conservar.config.js, PRECIOS_REFERENCIA).Descargas\reuniones\audio_<fecha>\) y no se envía nada a nadie; la reunión sale como «sin transcribir», se escucha desde la biblioteca y, en cuanto guardas una clave que transcriba (hoy, la de Gemini), se transcribe sola. Además, las claves de OpenAI y Anthropic pasan en Opciones al apartado «Claves de IA», cada una en su tarjeta, y se comprueban al pulsar «Guardar»; la biblioteca avisa si el modelo cortó un acta por longitud; y una cuenta sin saldo se dice tal cual, en vez de reintentar en balde.La grabación vive en un documento offscreen, no en el popup, así que cerrar la ventanita no corta la grabación. El service worker orquesta; el documento offscreen graba y transcribe.
popup.js ──┐ ┌─▶ offscreen.js
vivo.js ───┤ │ grabación, pausa, transcripción en vivo
importar.js├─▶ background.js (service worker) ──────┤ y por rondas, acta automática
reuniones.js┘ historial (única vía de escritura), │
alarmas, atajos, avisos, recuperación└─▶ IndexedDB (comun.js): audio pendiente
y audio conservado para escuchar
ia.js plantillas, Gemini/GPT/Claude, preguntas (lo usan la biblioteca y el offscreen)
exportar.js Word (.docx sin librerías), SRT, texto y HTML seguro
proveedores.js (3.8)
registro de las IA: quién transcribe y quién redacta, con qué clave, dirección
y modelos, y un interruptor por capacidad. Lo cargan todas las piezas
Un mismo motor (transcribirReunion) transcribe los tramos pendientes de una reunión, venga de una grabación, de un reintento o de un archivo importado.
Las tres cosas que impedían que funcionara de verdad, y cómo se resolvieron:
1. Una sola llamada por reunión no escala. Enviar la reunión entera en una petición hacía que el modelo se rindiera a los pocos minutos y devolviera la transcripción truncada, marcada como correcta — una reunión larga se quedó en 83 segundos transcritos. Ahora el audio se corta en tramos de 5 minutos, con un MediaRecorder por tramo, y el progreso se reporta tramo a tramo.
2. Sin reintentos, un 503 transitorio cuesta la reunión entera. Ahora hay backoff de 3/8/20 s respetando el retryDelay que devuelve la API, y una cascada de modelos de reserva. Un tramo fallido cuesta 5 minutos, no la reunión, y su audio se conserva en disco para reintentarlo.
3. El modelo alucina con el silencio. Ante audio mudo, Gemini llegó a inventarse una reunión completa, con hablantes y acuerdos falsos. Ahora un tramo sin voz no se manda, y el prompt obliga además a responder literalmente SIN_VOZ. Es el fallo más caro de los tres: una transcripción truncada se nota, una inventada no.
Y el fallo que introdujo ese arreglo. La primera versión del guardia de silencio medía con un AnalyserNode muestreado una vez por segundo: 2048 muestras, unos 42 ms de cada 1.000. Veía el 4 % del audio, así que una intervención corta caía entre muestras y el tramo se descartaba entero sin preguntar al modelo. Descartar voz real es peor que el problema original. Ahora el tramo ya grabado se decodifica completo y se recorre en ventanas de 20 ms; el analizador se ha quedado solo para el informe de niveles por fuente, que es para lo que sirve. Si la decodificación falla, el tramo se envía igual: gastar tres céntimos es más barato que perder un minuto de reunión.
4. Un fallo no puede costar la reunión (3.1). El 21/09/2026 una reunión de 13 minutos perdió sus tres tramos con «Falta la clave de Gemini» teniendo clave. Había dos defectos. El primero: el documento offscreen pide la configuración al service worker por mensaje, y una respuesta vacía se tomaba por «no hay clave». Ahora se reintenta y, si no llega, el error es «interno», no una mentira. El segundo: aunque el audio se guardaba en Descargas, la extensión no puede volver a leer ficheros de disco, así que no había forma de reintentar. Ahora cada tramo va a IndexedDB al grabarse (y el tramo en curso cada 30 s) y solo se borra cuando su texto está a salvo en el historial. Cada fallo lleva un código (sin_clave, clave_invalida, saturado, red, interno) que decide qué hacer:
chrome.alarms), y al abrir el panel;Al arrancar Chrome, una reunión que se quedó en «grabando» se transcribe con lo que llegó a guardarse. La poda automática del historial no toca reuniones con tramos pendientes.
5. Lo que viene después de grabar (3.2 – 3.4). Comparado con Transkriptor, Tactiq, tl;dv, Fireflies y Otter (docs/2026-09-30-plan-mejoras.md), Escriba ganaba en no perder nada y en no cobrar, pero perdía en todo lo que viene después de grabar. Las decisiones que sostienen lo nuevo:
[MM:SS] desde el principio de SU tramo. Cada tramo guarda dónde empieza (inicioS) y el texto se pasa a tiempo de reunión una sola vez, al guardarse. Así el visor, el .md y los subtítulos no saben nada de tramos.ia.js, sin DOM ni chrome.*. El acta automática se genera en el documento offscreen y no en el service worker, que Chrome puede parar a mitad de una llamada larga.<script> se ve como texto.6. Solo se enseña lo probado con una clave real (3.8). Hasta la 3.7 los proveedores eran tres nombres escritos a mano en cada fichero, y sin clave de Gemini el panel ni enseñaba el botón de grabar. Ahora hay un registro (proveedores.js) del que salen las tarjetas de Opciones, los desplegables y la elección de quién transcribe y quién redacta. Cada capacidad de cada proveedor lleva un interruptor (voz.activo, chat.activo), porque sin una clave de verdad no se puede garantizar que una API acepte el audio que manda Chrome ni medir cómo transcribe. Una capacidad apagada no existe para el usuario: no sale en ninguna pantalla, no se le pide permiso ni se le envía nada. Encendido está lo que ya funcionaba: Gemini para transcribir y redactar, y OpenAI y Anthropic para actas y preguntas, cuyas peticiones salen idénticas a las de la 3.7 (lo fija un test). Lo demás que trae el registro sigue apagado hasta que alguien lo pruebe de punta a punta: cómo se enciende está en CONTRIBUTING.md.
sin_clave y se transcriben solos al guardar una. Lo que cambia es que deja de sonar a fallo (textos, color e icono) y que el reproductor de la biblioteca toca también el audio pendiente.Los tests corren en Node contra un navegador simulado: se carga el código real de la extensión con vm.runInContext y se le inyectan stubs de chrome, MediaRecorder, AudioContext y fetch. Sin build, sin dependencias.
npm test
Cubren el ciclo de grabación y troceado, la cola de escritura del historial, la política de reintentos y modelos de reserva, la clasificación de silencio, la migración de claves de sync a local y, desde la 3.1, el motor completo con el service worker y el offscreen hablándose: reintentos programados, espera de clave, recuperación de grabaciones cortadas, limpieza de audio huérfano y el markdown que se rehace al completar un hueco. Desde la 3.2 – 3.4, además: marcas de tiempo, hablantes, Word/SRT/HTML, plantillas y las tres APIs de IA, acta automática, transcripción en vivo, pausa con reloj simulado, marcadores, aviso de silencio, atajo y audio conservado (103 casos). Desde la 3.8: el registro y sus interruptores (lo apagado se enciende solo dentro del test, con respuestas simuladas), que las peticiones de acta salgan idénticas a las de la 3.7.0, que todo host al que se llama esté en el manifest, y grabar sin clave de punta a punta, hasta que se transcribe sola al guardar una (275 casos en total, con lo que salió de la revisión: nada sin transcribir ni recién transcrito se borra solo, la clave que llega al cerrar una ronda y quitar la clave).
Pruebas de extremo a extremo en Chromium real con la extensión cargada y Gemini de verdad (3.1):
| Escenario | Resultado |
|---|---|
| Importar un WAV de 6 min con frases conocidas | 2 tramos, ambas frases transcritas, audio interno borrado |
| Sin clave → el usuario la guarda | queda pendiente sin llamar a la red; se transcribe sola al guardar la clave |
| Clave rechazada → clave buena | pendiente con «Google rechaza la clave»; se completa al cambiarla |
| Gemini inalcanzable → vuelve la red | pendiente con alarma de reintento; «Reintentar ahora» la completa |
| Grabar 35 s con el micrófono | transcrita con la frase del audio de prueba |
| Chrome se cierra a los 65 s sin parar | al reabrir, se recupera y transcribe lo grabado |
Y la de la 2.5: WAV sintético de 13 minutos con 120 puntos numerados → troceado → transcrito → 120/120 recuperados, en orden y sin duplicados.
Pruebas en pantalla de la 3.2 – 3.4 (30/09/2026), en Chromium con la extensión cargada y la IA simulada:
| Escenario | Resultado |
|---|---|
| Biblioteca con 4 reuniones (completa, incompleta, de la 3.1 y con error) | todas se abren; la de la 3.1 conserva su acta, marcada como versión anterior |
| Renombrar «Hablante 3» → Clara | cambia en todas sus intervenciones, el .md se rehace y el texto original no se toca |
| Buscar «renovacion» sin tilde en todas | encuentra la única reunión donde se dijo «renovación» |
| Exportar a Word y SRT | el .docx pasa zipfile.testzip y lo abre python-docx; el SRT sale con los nombres puestos |
| Acta de tareas y pregunta a la reunión | la IA recibe los nombres y los participantes; quedan guardadas con sus tokens |
| Grabar con micro simulado: marcar, pausar, notas desde el panel en vivo, parar sin red | el reloj se para en pausa, marcas y notas guardadas, la reunión queda pendiente con su audio a salvo |
| Escuchar desde una frase | suena desde ese segundo, resalta la frase y «🗑 Audio» borra el audio sin tocar el texto |
Lo que no se ha probado aún con Gemini de verdad: que el modelo respete siempre el formato [MM:SS] Hablante: texto. Si un tramo sale sin marcas, se ve igual que en la 3.1, sin romper nada.
chrome://extensions¿Sin clave? Sáltate el paso 1: en el panel, Grabar sin transcribir. Escriba guarda el audio y lo transcribe cuando pongas la de Gemini.
Para un audio que ya tienes: Transcribir un archivo en el panel, arrástralo y pulsa Transcribir. Varios archivos a la vez se tratan como partes seguidas de la misma reunión.
.wav. No hace falta cuenta ni instalar nada más.Descargas/reuniones/audio_<fecha>/, que sigue ahí después de transcribirse: se va al borrar la reunión con su audio de respaldo o cuando la limpieza automática se lleva la reunión.Descargas/reuniones/audio_<fecha>/.JavaScript sin dependencias ni build · Chrome Extensions MV3 · MediaRecorder · AudioContext · IndexedDB · chrome.alarms · chrome.tabCapture · chrome.offscreen · chrome.sidePanel · chrome.commands · chrome.notifications · Gemini API (inline y Files API) · OpenAI API · Anthropic API.
Cómo desarrollar y depurar: CONTRIBUTING.md.
MIT — ver LICENSE.