Cómo crear un tomador de notas de reuniones sin bot
Graba el ordenador, no la llamada. Una guía práctica sobre la arquitectura, las API de audio de cada sistema y las partes que llevan más tiempo del que crees.
En este artículo
- Dos arquitecturas: un bot en la llamada o captura en el ordenador
- Cómo funciona la captura local: dos flujos, separados
- Transcripción: streaming, canales y el límite de la separación de hablantes
- Resúmenes: dale al LLM la transcripción completa
- Almacenamiento, seguridad y consentimiento
- El flujo completo, paso a paso
- Lo que lleva más tiempo del que esperas
- O usar una herramienta que ya existe
- Fuentes
Respuesta corta: olvídate de la plataforma de reuniones y graba el ordenador. Captura dos flujos locales, el micrófono y el audio del sistema que reproduce la llamada (ScreenCaptureKit o Core Audio taps en macOS, loopback de WASAPI en Windows, un monitor de PulseAudio o PipeWire en Linux), envíalos a una API de voz a texto y resume la transcripción con un LLM. Ningún participante se une a la llamada.
Esta guía es para desarrolladores que quieren construir uno, o que quieren entender qué hace de verdad la herramienta que pagan. Cubre las dos arquitecturas, cómo funciona la captura local en cada sistema operativo y qué permiso pide cada uno, y después la transcripción, los resúmenes, el almacenamiento y el consentimiento. Cada API mencionada sale de la documentación oficial del fabricante, listada al final y revisada el 2026-10-21.
Dos arquitecturas: un bot en la llamada o captura en el ordenador
Hay dos formas de obtener el audio de una reunión. Un bot es un cliente en el servidor que se une a la llamada como participante y recibe los medios de la plataforma. La captura local se ejecuta en el ordenador de la persona y graba lo que ese ordenador ya oye: el micrófono para su voz y la salida del sistema para todos los demás. Una opción intermedia más reciente es la API de medios de una plataforma, que transmite la reunión a tu servidor, pero cada una sirve solo para una plataforma.
| Bot que se une a la llamada | API de medios de la plataforma | Captura local | |
|---|---|---|---|
| Visible para los participantes | Sí, como participante | Depende de la plataforma (Meet muestra un aviso de consentimiento) | No |
| Cubre Zoom, Meet y Teams | Una integración por plataforma | Una integración por plataforma | Sí, graba el ordenador, no la plataforma |
| Dónde se ejecuta | En tus servidores | En tus servidores | En el ordenador de la persona, más tu backend |
| Separación de hablantes | A menudo la da la plataforma | A menudo la da la plataforma | Tu micrófono frente a todo lo demás, luego separación de hablantes |
| Coste principal | Un servidor por reunión simultánea, aprobaciones de la plataforma | Créditos o inscripción en la plataforma | Una app de escritorio nativa por SO, avisos de permisos |
| Reuniones presenciales y llamadas en otras apps | No | No | Sí, todo lo que oye el ordenador |
Qué implica hoy la vía del bot
- Zoom: el Meeting SDK se une a reuniones y da acceso directo al audio y vídeo en bruto en plataformas nativas. Según la documentación de Zoom, desde el 2 de marzo de 2026 las apps que se unan a reuniones fuera de su propia cuenta deben estar autorizadas con tokens ZAK u OBF, o usar RTMS.
- Zoom RTMS (Realtime Media Streams) envía audio, vídeo y transcripción en directo a tu app sin un bot participante, y funciona con créditos comprados a Zoom. Solo cubre Zoom.
- Microsoft Teams: el audio en tiempo real necesita un application-hosted media bot escrito en C# o .NET, desplegado en producción sobre Windows Server en Azure, con una IP pública por instancia de VM. Microsoft sigue describiendo su plataforma de medios en tiempo real como developer preview.
- Google Meet: la Meet Media API da audio, vídeo y datos de participantes en tiempo real, pero está en Developer Preview y, según la documentación de Google, ya no acepta nuevas inscripciones. Alguien en la llamada tiene que dar su consentimiento, y las reuniones cifradas o con marca de agua no pueden conectarse.
Nada de eso está mal. Son tres integraciones con tres procesos de aprobación, y los participantes ven un bot o un aviso de consentimiento. Si quieres una sola vía de captura que funcione igual en todas las plataformas, y también en reuniones presenciales y llamadas desde el portátil, capturas en local.
Cómo funciona la captura local: dos flujos, separados
Un tomador de notas local graba dos entradas a la vez: el micrófono (la persona) y un loopback de la salida del sistema (los demás, tal como los reproduce la app de reuniones). Mantenlos como dos canales todo el tiempo que puedas. La separación te da gratis la distinción de hablantes, porque todo lo que entra por el micrófono es la persona. También importa para el eco: según la documentación de Microsoft, el loopback de WASAPI existe sobre todo para la cancelación de eco acústico. Si la persona usa los altavoces del portátil, el micrófono también oye las voces remotas, así que aplica cancelación de eco al micrófono (en un navegador, la restricción echoCancellation de getUserMedia) o cada frase remota aparecerá dos veces en la transcripción.
macOS: ScreenCaptureKit o Core Audio taps
- ScreenCaptureKit transmite contenido de pantalla y audio. Pon capturesAudio en true en SCStreamConfiguration (macOS 13 o posterior); captureMicrophone añade el micrófono al mismo flujo desde macOS 15. Necesita el permiso de grabación de pantalla y una clave NSScreenCaptureUsageDescription en Info.plist.
- Los Core Audio taps (macOS 14.2 o posterior) capturan el audio saliente de un proceso, de un grupo de procesos o de todo el sistema. Describe el tap con CATapDescription, créalo con AudioHardwareCreateProcessTap, añádelo a un dispositivo agregado creado con AudioHardwareCreateAggregateDevice y lee ese dispositivo como si fuera un micrófono.
- Los taps requieren una clave NSAudioCaptureUsageDescription. La primera vez que grabas desde un dispositivo agregado con un tap, macOS pide permiso para grabar el audio del sistema. Se gestiona en Ajustes del Sistema, Privacidad y seguridad, Grabación de pantalla y audio del sistema, donde una app puede tener permiso solo para audio.
- El micrófono es un permiso aparte, con su propio texto explicativo. Diseña el onboarding para ambos avisos, y para la persona que pulsó Denegar una vez y ahora no oye nada.
Windows: loopback de WASAPI
- Abre el endpoint de reproducción (eRender en lugar de eCapture en GetDefaultAudioEndpoint) e inicializa un flujo de captura en modo compartido con AUDCLNT_STREAMFLAGS_LOOPBACK. Los flujos en modo exclusivo no pueden funcionar en loopback.
- El loopback lleva toda la mezcla que suena en ese endpoint, no solo la app de reuniones, así que los sonidos de notificación y la música también acaban en la grabación.
- El loopback controlado por eventos funciona desde Windows 10 versión 1703; las versiones anteriores necesitan un rodeo con un flujo de reproducción que Microsoft documenta.
- El process loopback (AUDIOCLIENT_ACTIVATION_TYPE_PROCESS_LOOPBACK mediante ActivateAudioInterfaceAsync) incluye o excluye el audio de un proceso y sus hijos, por ejemplo para dejar fuera los sonidos de tu propia app. Requiere como mínimo Windows 10 build 20348, así que detecta la función y recurre al loopback del endpoint si no está.
- Un controlador de audio de confianza no permite que el loopback capture flujos protegidos con DRM. La documentación de loopback de Microsoft no describe ningún aviso al usuario como el de macOS, lo que hace que tu propio indicador de grabación y tu flujo de consentimiento importen todavía más.
Linux: fuentes monitor de PulseAudio y PipeWire
- En PulseAudio, cada salida (sink) tiene una fuente monitor que lleva lo que reproduce el sink. Graba el monitor del sink predeterminado para el audio de la llamada y la fuente predeterminada para el micrófono.
- La mayoría de distribuciones actuales usan PipeWire con pipewire-pulse, que la documentación de PipeWire describe como un sustituto directo del demonio de PulseAudio, así que el código escrito para la API de PulseAudio sigue funcionando.
- En PipeWire nativo, un flujo de captura lee los puertos monitor de un sink si defines stream.capture.sink = true y apuntas target.object al nombre del sink, como muestra la configuración de ejemplo del módulo loopback.
- Dos problemas que verás en la práctica: un equipo con ALSA puro y sin servidor de sonido no tiene monitor, y una salida silenciada puede darte un monitor lleno de silencio. Mide el nivel y avisa a la persona en lugar de transcribir la nada.
En el navegador: getDisplayMedia, y audio solo en Chromium
- navigator.mediaDevices.getDisplayMedia({ video: true, audio: true }) pide a la persona que elija una pantalla, ventana o pestaña para compartir. Necesita un contexto seguro y un gesto del usuario, el aviso aparece en cada llamada y el permiso no se puede guardar.
- El problema es el audio. Los datos de compatibilidad de MDN indican captura de audio solo en Chrome y Edge; Firefox y Safari no capturan audio por esta vía. En Chrome se puede capturar todo el audio del sistema al compartir la pantalla completa en Windows y ChromeOS, mientras que en macOS y Linux solo se puede capturar el audio de una pestaña.
- Así que en un Mac, un tomador de notas en el navegador solo oye una reunión si esta se ejecuta en una pestaña de Chrome o Edge y la persona comparte esa pestaña con el audio activado. Las apps de escritorio de Zoom o Teams quedan fuera de alcance.
- Graba el micrófono con getUserMedia como segunda pista. La solicitud de compartir tiene que pedir vídeo; quédate solo con la pista de audio para la transcripción.
Transcripción: streaming, canales y el límite de la separación de hablantes
Envía el audio a una API de voz a texto en streaming por WebSocket mientras dura la reunión, para que la transcripción esté lista al terminar. Las API por lotes son más simples y bastan si nadie necesita el texto en directo. Estas decisiones pesan más que el proveedor que elijas:
- Dos canales de entrada, dos transcripciones de salida. Transcribe el micrófono y el audio del sistema por separado (o como un único flujo multicanal, si tu API lo admite) y combínalos por marca de tiempo. Es la separación de hablantes más barata que vas a conseguir.
- La separación de hablantes da números, no nombres. La documentación de Deepgram, por ejemplo, devuelve un hablante numerado por palabra (hablante 0, hablante 1) y deja a tu app la tarea de asociarlos a personas; en streaming no hay confianza por palabra. Para los nombres hace falta una segunda señal: el canal del micrófono es la persona, la invitación del calendario lista a los asistentes y la interfaz de la app de reuniones sabe quién habla.
- La separación de hablantes corre sobre el canal del sistema, una señal mezclada de todas las voces remotas tras el códec de la reunión. Espera hablantes fusionados cuando dos personas suenan parecido o hablan a la vez.
- Idiomas: revisa la lista de idiomas y si la detección automática funciona a mitad de reunión. Una pista de idioma equivocada estropea más una transcripción que un modelo algo peor.
- Reconexiones: la red se cae. Guarda el audio en un búfer local y reenvíalo al reconectar, o perderás justo el minuto en el que se tomó la decisión.
Resúmenes: dale al LLM la transcripción completa
- Envía la transcripción completa con marcas de tiempo y etiquetas de hablante, no un fragmento recortado. Los modelos actuales tienen ventanas de contexto grandes; divide solo si la reunión supera la ventana.
- Pide una estructura que se pueda comprobar: decisiones, tareas con responsable y fecha, preguntas abiertas. Cada punto debería poder rastrearse hasta una marca de tiempo.
- Guarda la transcripción y el audio junto al resumen. Un resumen de LLM puede afirmar algo que nadie dijo; la solución es que comprobarlo sea rápido, no confiar en el modelo.
- Genera el resumen cuando termine la reunión y márcalo como desactualizado cuando alguien edite la transcripción.
Almacenamiento, seguridad y consentimiento
- El audio y las transcripciones son datos personales. Cífralos en reposo, haz que las notas sean privadas por defecto y decide la retención antes del lanzamiento, incluido cómo borra alguien una grabación.
- Si tienes usuarios en la UE, debes saber dónde se guardan el audio y las transcripciones y qué encargados del tratamiento (voz a texto, LLM) los ven, y decirlo en tu política de privacidad.
- Sin bot, nadie queda anunciado. Muestra un indicador de grabación claro, recuerda a la persona que avise a los participantes y ofrece un aviso de una línea para pegar en el chat de la reunión. Varios estados de EE. UU. exigen el consentimiento de todas las partes y muchos países tienen sus propias normas. Esto no es asesoramiento legal.
- No presentes la captura local como procesamiento local. Si el audio va a una API de voz a texto en la nube, dilo.
El flujo completo, paso a paso
- Detecta una reunión (empieza un evento del calendario o una app de reuniones usa el micrófono), o deja que la persona pulse grabar.
- Pide la primera vez el permiso de micrófono y de audio del sistema, y explica el motivo en una frase.
- Inicia dos capturas: micrófono y loopback del sistema. Mide ambos niveles y avisa si alguno sigue en silencio más de unos segundos.
- Convierte el audio al formato que espera tu proveedor de voz a texto (frecuencia de muestreo y codificación están en su documentación) y transmítelo, con un búfer local para las reconexiones.
- Muestra la transcripción en directo: combina los dos canales por marca de tiempo y etiqueta el canal del micrófono como la propia persona.
- Al parar, vacía los búferes, cierra el flujo y guarda el audio con la transcripción final.
- Envía la transcripción completa al LLM para el resumen y las tareas, y guárdalos con referencias a las marcas de tiempo.
- Expón el resultado: una interfaz, una API, webhooks o un servidor MCP para que los asistentes de IA puedan leerlo.
Lo que lleva más tiempo del que esperas
- La experiencia de permisos en macOS, y las personas que dijeron que no una vez.
- Cambios de dispositivo en plena llamada: auriculares conectados, Bluetooth que pasa al perfil de manos libres, la salida predeterminada que cambia.
- La firma de código y la notarización de los instaladores de macOS y Windows, además de las actualizaciones automáticas.
- La suspensión, la tapa cerrada y las reuniones de dos horas, más el uso de disco y memoria en una llamada larga.
- El eco con los altavoces del portátil, y el silencio cuando la salida está silenciada.
O usar una herramienta que ya existe
Si lo que necesitas son notas de reuniones y no un proyecto de tomador de notas, Reline (reline.so) ya aplica esta arquitectura. Su app de escritorio para macOS, Windows y Linux (beta) graba el micrófono y el audio del sistema en local, sin bot en la llamada, y la app web captura el audio de la llamada en Chrome o Edge de escritorio a través del audio de compartir pantalla. La transcripción (más de 60 idiomas), los resúmenes con IA y el almacenamiento se ejecutan en la nube: sin bot, pero no en el dispositivo.
Para desarrolladores que quieren los datos y no la app: Reline tiene un servidor MCP en https://mcp.reline.so/mcp con el que Claude, ChatGPT, Cursor y otros clientes pueden buscar notas, leer transcripciones y tareas, y crear notas, con inicio de sesión por OAuth o una clave de API del espacio de trabajo. Los webhooks firmados se disparan con seis eventos, como note.created, note.summarized y action_items.extracted, con una firma HMAC-SHA256 sobre la marca de tiempo y el cuerpo sin procesar.
Fuentes
- Apple, Capturing system audio with Core Audio taps: https://developer.apple.com/documentation/coreaudio/capturing-system-audio-with-core-audio-taps
- Apple, ScreenCaptureKit: https://developer.apple.com/documentation/screencapturekit
- Apple Support, Control access to screen and system audio recording on Mac: https://support.apple.com/guide/mac-help/mchld6aa7d23/mac
- Microsoft, Loopback Recording (WASAPI): https://learn.microsoft.com/windows/win32/coreaudio/loopback-recording
- Microsoft, AUDIOCLIENT_ACTIVATION_TYPE: https://learn.microsoft.com/windows/win32/api/audioclientactivationparams/ne-audioclientactivationparams-audioclient_activation_type
- Microsoft, Build application-hosted media bots (Teams): https://learn.microsoft.com/microsoftteams/platform/bots/calls-and-meetings/requirements-considerations-application-hosted-media-bots
- MDN, MediaDevices.getDisplayMedia(): https://developer.mozilla.org/docs/Web/API/MediaDevices/getDisplayMedia
- PulseAudio, pa_sink_info (monitor_source): https://freedesktop.org/software/pulseaudio/doxygen/structpa__sink__info.html
- PipeWire, pipewire-pulse: https://docs.pipewire.org/page_man_pipewire-pulse_1.html
- PipeWire, Loopback module: https://docs.pipewire.org/page_module_loopback.html
- Zoom, Meeting SDK: https://developers.zoom.us/docs/meeting-sdk/
- Zoom, Realtime Media Streams (RTMS): https://developers.zoom.us/docs/rtms/
- Google, Meet Media API overview: https://developers.google.com/workspace/meet/media-api/guides/overview
- Deepgram documentation (speaker labels per word): https://developers.deepgram.com/docs
Preguntas comunes
- ¿Se puede grabar una reunión sin que se una un bot?
- Sí. Captura en local: graba el micrófono y el audio del sistema en el ordenador de la persona y luego transcribe. Ningún participante se une a la llamada, en ninguna plataforma. Aun así, las personas de la reunión tienen que saber que estás grabando.
- ¿Cómo capturo el audio del sistema en un Mac para un tomador de notas?
- Con Core Audio taps desde macOS 14.2 (CATapDescription, AudioHardwareCreateProcessTap, un dispositivo agregado y una clave NSAudioCaptureUsageDescription), o con ScreenCaptureKit y capturesAudio desde macOS 13. Ambos se autorizan en Privacidad y seguridad, Grabación de pantalla y audio del sistema.
- ¿Puede una app web o una extensión del navegador grabar el audio de una reunión?
- Solo en navegadores Chromium. getDisplayMedia devuelve audio en Chrome y Edge: en macOS y Linux solo el de una pestaña, en Windows y ChromeOS todo el audio del sistema al compartir la pantalla completa. Firefox y Safari no capturan audio por esta vía.
- ¿Cómo obtengo los nombres de los hablantes sin bot?
- La separación de hablantes devuelve hablantes numerados, no nombres. Combina señales: el canal del micrófono es la persona, la invitación del calendario lista a los asistentes y la interfaz de la reunión muestra quién habla. Sin ellas tendrás Hablante 1 y Hablante 2.
- ¿Es legal grabar una reunión sin bot?
- La cuestión legal no es el bot, sino el consentimiento. Avisa a los participantes y cumple la ley aplicable; varios estados de EE. UU. exigen el consentimiento de todas las partes y otros países tienen sus propias normas. Esto no es asesoramiento legal.
- ¿Construyo mi propio tomador de notas o uso uno existente?
- Constrúyelo si la captura es tu producto. Si solo necesitas las notas en tus propias herramientas, usa un tomador de notas sin bot que ya tenga API: Reline, por ejemplo, expone notas y transcripciones mediante un servidor MCP y webhooks firmados.
Artículos relacionados

Cómo tomar notas de reunión con IA sin que un bot entre en tu llamada
Notas de reunión con IA sin bot: captura en el dispositivo, sin terceros en la llamada. Por qué escala para equipos, las concesiones y el stack exacto.

¿Qué herramientas de notas con IA funcionan con Claude y ChatGPT?
Qué herramientas de notas con IA funcionan con Claude y ChatGPT, cuáles aparecen en cada directorio y cómo conectar Reline: desde el directorio de conectores de Claude, o con la URL de su servidor MCP en ChatGPT y Cursor.

¿Cuál es la mejor IA para tomar notas de reuniones en Linux?
La mejor IA para tomar notas en Linux graba sin bot. Reline tiene una app de escritorio para Linux (beta) para Meet, Zoom o Teams, y una app web completa.
Deja de tomar notas.Empieza a entregar resultados.
Gratis para siempre para particulares. Cinco minutos para instalar. Tu próxima reunión escribe sus propias notas.