個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證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.