BlogDevelopers

Como criar um app de notas de reunião sem bot

Grave o computador, não a chamada. Um guia prático sobre a arquitetura, as APIs de áudio de cada sistema e as partes que levam mais tempo do que parece.

Reline Team12 min de leitura
Neste artigo
  1. Duas arquiteturas: um bot na chamada ou captura no computador
  2. Como a captura local funciona: dois fluxos, mantidos separados
  3. Transcrição: streaming, canais e o limite da separação de falantes
  4. Resumos: entregue ao LLM a transcrição inteira
  5. Armazenamento, segurança e consentimento
  6. O fluxo completo, do início ao fim
  7. O que leva mais tempo do que você imagina
  8. Ou use uma ferramenta que já existe
  9. Fontes

Resposta curta: deixe a plataforma de reunião de lado e grave o computador. Capture dois fluxos locais, o microfone e o áudio do sistema que a chamada toca (ScreenCaptureKit ou Core Audio taps no macOS, loopback do WASAPI no Windows, um monitor do PulseAudio ou PipeWire no Linux), envie para uma API de fala para texto e resuma a transcrição com um LLM. Nenhum participante entra na chamada.

Este guia é para desenvolvedores que querem construir um, ou entender o que a ferramenta que eles pagam faz de verdade. Ele cobre as duas arquiteturas, como a captura local funciona em cada sistema operacional e qual permissão cada um pede, depois transcrição, resumos, armazenamento e consentimento. Cada API citada vem da documentação oficial do fornecedor, listada no fim e conferida em 2026-10-21.

Duas arquiteturas: um bot na chamada ou captura no computador

Existem dois jeitos de obter o áudio de uma reunião. Um bot é um cliente no servidor que entra na chamada como participante e recebe a mídia da plataforma. A captura local roda no computador da pessoa e grava o que esse computador já ouve: o microfone para a voz dela e a saída do sistema para todos os outros. Uma opção intermediária mais nova é a API de mídia de uma plataforma, que transmite a reunião para o seu servidor, mas cada uma vale só para uma plataforma.

Bot que entra na chamadaAPI de mídia da plataformaCaptura local
Visível para os participantesSim, como participanteDepende da plataforma (o Meet mostra um pedido de consentimento)Não
Cobre Zoom, Meet e TeamsUma integração por plataformaUma integração por plataformaSim, grava o computador, não a plataforma
Onde rodaNos seus servidoresNos seus servidoresNo computador da pessoa, mais o seu backend
Separação de falantesMuitas vezes fornecida pela plataformaMuitas vezes fornecida pela plataformaSeu microfone contra todo o resto, depois separação de falantes
Custo principalUm servidor por reunião simultânea, aprovações da plataformaCréditos ou inscrição na plataformaUm app desktop nativo por SO, pedidos de permissão
Reuniões presenciais e chamadas em outros appsNãoNãoSim, tudo o que o computador ouve

O que o caminho do bot envolve hoje

  • Zoom: o Meeting SDK entra em reuniões e dá acesso direto ao áudio e vídeo brutos nas plataformas nativas. Segundo a documentação do Zoom, a partir de 2 de março de 2026, apps que entram em reuniões fora da própria conta precisam de autorização com tokens ZAK ou OBF, ou usar RTMS.
  • Zoom RTMS (Realtime Media Streams) envia áudio, vídeo e transcrição ao vivo para o seu app sem um bot participante, e funciona com créditos comprados do Zoom. Só cobre o Zoom.
  • Microsoft Teams: áudio em tempo real exige um application-hosted media bot escrito em C# ou .NET, implantado em produção no Windows Server no Azure, com um IP público por instância de VM. A Microsoft ainda descreve sua plataforma de mídia em tempo real como developer preview.
  • Google Meet: a Meet Media API entrega áudio, vídeo e dados dos participantes em tempo real, mas está em Developer Preview e, segundo a documentação do Google, não aceita mais novas inscrições. Alguém na chamada precisa consentir, e reuniões criptografadas ou com marca d’água não conseguem se conectar.

Nada disso está errado. São três integrações com três processos de aprovação, e os participantes veem um bot ou um pedido de consentimento. Se você quer um único caminho de captura que funcione igual em todas as plataformas, e também em reuniões presenciais e ligações pelo notebook, você captura localmente.

Como a captura local funciona: dois fluxos, mantidos separados

Um app de notas local grava duas entradas ao mesmo tempo: o microfone (a própria pessoa) e um loopback da saída do sistema (os outros, do jeito que o app de reunião os toca). Mantenha os dois como canais separados pelo maior tempo possível. A separação dá de graça a distinção de falantes, porque tudo no canal do microfone é a pessoa. Ela também importa para o eco: segundo a documentação da Microsoft, o loopback do WASAPI existe principalmente para o cancelamento de eco acústico. Se a pessoa usa os alto-falantes do notebook, o microfone também ouve as vozes remotas, então aplique cancelamento de eco no microfone (no navegador, a restrição echoCancellation do getUserMedia) ou cada frase remota vai aparecer duas vezes na transcrição.

macOS: ScreenCaptureKit ou Core Audio taps

  • O ScreenCaptureKit transmite conteúdo da tela e áudio. Defina capturesAudio como true em SCStreamConfiguration (macOS 13 ou mais recente); captureMicrophone adiciona o microfone ao mesmo fluxo a partir do macOS 15. Ele precisa da permissão de gravação de tela e de uma chave NSScreenCaptureUsageDescription no Info.plist.
  • Os Core Audio taps (macOS 14.2 ou mais recente) capturam o áudio de saída de um processo, de um grupo de processos ou do sistema inteiro. Descreva o tap com CATapDescription, crie com AudioHardwareCreateProcessTap, adicione a um dispositivo agregado criado com AudioHardwareCreateAggregateDevice e leia esse dispositivo como se fosse um microfone.
  • Os taps exigem uma chave NSAudioCaptureUsageDescription. Na primeira vez que você grava de um dispositivo agregado com um tap, o macOS pede permissão para gravar o áudio do sistema. Ela é gerenciada em Ajustes do Sistema, Privacidade e Segurança, Gravação de Tela e Áudio do Sistema, onde um app pode ser liberado só para áudio.
  • O microfone é uma permissão separada, com seu próprio texto de explicação. Planeje o onboarding para os dois pedidos, e para a pessoa que clicou em Negar uma vez e agora não ouve nada.

Windows: loopback do WASAPI

  • Abra o endpoint de reprodução (eRender em vez de eCapture em GetDefaultAudioEndpoint) e inicialize um fluxo de captura em modo compartilhado com AUDCLNT_STREAMFLAGS_LOOPBACK. Fluxos em modo exclusivo não funcionam em loopback.
  • O loopback traz toda a mixagem tocada naquele endpoint, não só o app de reunião, então sons de notificação e música também entram na gravação.
  • O loopback orientado a eventos funciona a partir do Windows 10 versão 1703; versões anteriores precisam de um contorno com fluxo de reprodução que a Microsoft documenta.
  • O process loopback (AUDIOCLIENT_ACTIVATION_TYPE_PROCESS_LOOPBACK via ActivateAudioInterfaceAsync) inclui ou exclui o áudio de um processo e dos processos filhos, por exemplo para deixar de fora os sons do seu próprio app. O mínimo é o Windows 10 build 20348, então detecte o recurso e volte ao loopback do endpoint se ele não existir.
  • Um driver de áudio confiável não deixa o loopback capturar fluxos protegidos por DRM. A documentação de loopback da Microsoft não descreve nenhum pedido ao usuário como o do macOS, o que torna o seu próprio indicador de gravação e o seu fluxo de consentimento ainda mais importantes.

Linux: fontes monitor do PulseAudio e do PipeWire

  • No PulseAudio, cada saída (sink) tem uma fonte monitor que carrega o que o sink toca. Grave o monitor do sink padrão para o áudio da chamada e a fonte padrão para o microfone.
  • A maioria das distribuições atuais usa PipeWire com pipewire-pulse, que a documentação do PipeWire descreve como um substituto direto do daemon do PulseAudio, então o código escrito para a API do PulseAudio continua funcionando.
  • No PipeWire nativo, um fluxo de captura lê as portas monitor de um sink quando você define stream.capture.sink = true e aponta target.object para o nome do sink, como mostra a configuração de exemplo do módulo loopback.
  • Dois problemas que aparecem na prática: uma máquina só com ALSA e sem servidor de som não tem monitor, e uma saída no mudo pode entregar um monitor cheio de silêncio. Meça o nível e avise a pessoa em vez de transcrever o nada.

No navegador: getDisplayMedia, e áudio só no Chromium

  • navigator.mediaDevices.getDisplayMedia({ video: true, audio: true }) pede para a pessoa escolher uma tela, janela ou aba para compartilhar. Exige contexto seguro e um gesto do usuário, o pedido aparece a cada chamada e a permissão não pode ser salva.
  • O problema é o áudio. Os dados de compatibilidade do MDN indicam captura de áudio só no Chrome e no Edge; Firefox e Safari não capturam áudio por esse caminho. No Chrome, dá para capturar todo o áudio do sistema ao compartilhar a tela inteira no Windows e no ChromeOS, enquanto no macOS e no Linux só o áudio de uma aba pode ser capturado.
  • Então, no Mac, um app de notas no navegador só ouve a reunião se ela estiver rodando numa aba do Chrome ou do Edge e a pessoa compartilhar essa aba com o áudio ligado. Os apps desktop do Zoom ou do Teams ficam fora de alcance.
  • Grave o microfone com getUserMedia como segunda faixa. O pedido de compartilhamento precisa pedir vídeo; guarde só a faixa de áudio para a transcrição.

Transcrição: streaming, canais e o limite da separação de falantes

Envie o áudio para uma API de fala para texto em streaming por WebSocket enquanto a reunião acontece, para que a transcrição esteja pronta no fim. APIs em lote são mais simples e bastam se ninguém precisa do texto ao vivo. Estas escolhas pesam mais do que o fornecedor:

  • Dois canais de entrada, duas transcrições de saída. Transcreva o microfone e o áudio do sistema separadamente (ou como um único fluxo multicanal, se a sua API aceitar) e junte por carimbo de tempo. É a separação de falantes mais barata que você vai conseguir.
  • A separação de falantes dá números, não nomes. A documentação da Deepgram, por exemplo, retorna um falante numerado por palavra (falante 0, falante 1) e deixa para o seu app a tarefa de ligar isso a pessoas; no streaming não há confiança por palavra. Para ter nomes você precisa de um segundo sinal: o canal do microfone é a pessoa, o convite da agenda lista os participantes e a interface do app de reunião sabe quem está falando.
  • A separação de falantes roda no canal do sistema, um sinal misturado de todas as vozes remotas depois do codec da reunião. Espere falantes fundidos quando duas pessoas têm vozes parecidas ou falam ao mesmo tempo.
  • Idiomas: confira a lista de idiomas e se a detecção automática funciona no meio da reunião. Uma dica de idioma errada estraga mais uma transcrição do que um modelo um pouco pior.
  • Reconexões: a rede cai. Guarde o áudio em um buffer local e reenvie ao reconectar, ou você perde justamente o minuto em que a decisão foi tomada.

Resumos: entregue ao LLM a transcrição inteira

  • Envie a transcrição completa com carimbos de tempo e rótulos de falante, não um trecho cortado. Os modelos atuais têm janelas de contexto grandes; divida só quando a reunião for maior que a janela.
  • Peça uma estrutura que dê para conferir: decisões, tarefas com responsável e data, perguntas em aberto. Cada item deve poder ser rastreado até um carimbo de tempo.
  • Mantenha a transcrição e o áudio ao lado do resumo. Um resumo de LLM pode afirmar algo que ninguém disse; a solução é tornar a conferência rápida, não confiar no modelo.
  • Gere o resumo quando a reunião terminar e marque como desatualizado quando alguém editar a transcrição.

Armazenamento, segurança e consentimento

  • Áudio e transcrições são dados pessoais. Criptografe em repouso, deixe as notas privadas por padrão e defina a retenção antes do lançamento, incluindo como alguém apaga uma gravação.
  • Se você tem usuários na UE, saiba onde ficam o áudio e as transcrições e quais operadores (fala para texto, LLM) têm acesso, e diga isso na sua política de privacidade.
  • Sem bot, ninguém é anunciado. Mostre um indicador de gravação claro, lembre a pessoa de avisar os participantes e ofereça um aviso de uma linha para colar no chat da reunião. Vários estados dos EUA exigem o consentimento de todas as partes e muitos países têm regras próprias. Isto não é aconselhamento jurídico.
  • Não venda captura local como processamento local. Se o áudio vai para uma API de fala para texto na nuvem, diga isso.

O fluxo completo, do início ao fim

  1. Detecte uma reunião (um evento da agenda começando ou um app de reunião usando o microfone), ou deixe a pessoa apertar gravar.
  2. Peça na primeira vez a permissão de microfone e de áudio do sistema, e explique o motivo em uma frase.
  3. Inicie duas capturas: microfone e loopback do sistema. Meça os dois níveis e avise quando algum ficar em silêncio por mais de alguns segundos.
  4. Converta o áudio para o formato que o seu fornecedor de fala para texto espera (taxa de amostragem e codificação estão na documentação dele) e transmita, com um buffer local para reconexões.
  5. Mostre a transcrição ao vivo: junte os dois canais por carimbo de tempo e rotule o canal do microfone como a própria pessoa.
  6. Ao parar, esvazie os buffers, feche o fluxo e guarde o áudio com a transcrição final.
  7. Envie a transcrição inteira ao LLM para o resumo e as tarefas, e guarde tudo com referências aos carimbos de tempo.
  8. Exponha o resultado: uma interface, uma API, webhooks ou um servidor MCP para que assistentes de IA possam ler.

O que leva mais tempo do que você imagina

  • A experiência de permissões no macOS, e as pessoas que disseram não uma vez.
  • Troca de dispositivo no meio da chamada: fone conectado, Bluetooth mudando para o perfil de headset, saída padrão que muda.
  • Assinatura de código e notarização dos instaladores de macOS e Windows, além das atualizações automáticas.
  • Suspensão, tampa fechada e reuniões de duas horas, mais o uso de disco e memória em uma chamada longa.
  • Eco nos alto-falantes do notebook, e silêncio quando a saída está no mudo.

Ou use uma ferramenta que já existe

Se você precisa de notas de reunião e não de um projeto de app de notas, o Reline (reline.so) já aplica essa arquitetura. O app desktop para macOS, Windows e Linux (beta) grava o microfone e o áudio do sistema localmente, sem bot na chamada, e o app web captura o áudio da chamada no Chrome ou no Edge no desktop pelo áudio do compartilhamento de tela. A transcrição (mais de 60 idiomas), os resumos com IA e o armazenamento rodam na nuvem: sem bot, mas não no dispositivo.

Para desenvolvedores que querem os dados e não o app: o Reline mantém um servidor MCP em https://mcp.reline.so/mcp, com o qual Claude, ChatGPT, Cursor e outros clientes buscam notas, leem transcrições e tarefas e criam notas, com login por OAuth ou uma chave de API do workspace. Webhooks assinados disparam em seis eventos, como note.created, note.summarized e action_items.extracted, com uma assinatura HMAC-SHA256 sobre o carimbo de tempo e o corpo bruto.

Fontes

  • 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
Perguntas frequentes

Perguntas comuns

Dá para gravar uma reunião sem que um bot entre?
Sim. Capture localmente: grave o microfone e o áudio do sistema no computador da pessoa e depois transcreva. Nenhum participante entra na chamada, em nenhuma plataforma. Mesmo assim, as pessoas na reunião precisam saber que você está gravando.
Como capturo o áudio do sistema no Mac para um app de notas?
Com Core Audio taps a partir do macOS 14.2 (CATapDescription, AudioHardwareCreateProcessTap, um dispositivo agregado e uma chave NSAudioCaptureUsageDescription), ou com ScreenCaptureKit e capturesAudio a partir do macOS 13. Os dois são liberados em Privacidade e Segurança, Gravação de Tela e Áudio do Sistema.
Um app web ou uma extensão de navegador consegue gravar o áudio da reunião?
Só em navegadores Chromium. O getDisplayMedia retorna áudio no Chrome e no Edge: no macOS e no Linux só o de uma aba, no Windows e no ChromeOS todo o áudio do sistema ao compartilhar a tela inteira. Firefox e Safari não capturam áudio por esse caminho.
Como consigo o nome de quem fala sem bot?
A separação de falantes retorna falantes numerados, não nomes. Combine sinais: o canal do microfone é a pessoa, o convite da agenda lista os participantes e a interface da reunião mostra quem está falando. Sem eles, você fica com Falante 1 e Falante 2.
É legal gravar uma reunião sem bot?
A questão legal não é o bot, é o consentimento. Avise os participantes e siga a lei aplicável, já que vários estados dos EUA exigem o consentimento de todas as partes e outros países têm regras próprias. Isto não é aconselhamento jurídico.
Vale mais construir um app de notas ou usar um existente?
Construa se a captura for o seu produto. Se você só precisa das notas nas suas próprias ferramentas, use um app de notas sem bot que já tenha API: o Reline, por exemplo, expõe notas e transcrições por um servidor MCP e webhooks assinados.
Pronto quando você estiver

Pare de fazer anotações.Comece a entregar resultados.

Grátis para sempre para uso individual. Cinco minutos para instalar. Sua próxima reunião escreve as próprias notas.