Estou construindo o LiveSuggest, um assistente de reunião que mostra sugestões enquanto a conversa ainda está rolando. Sem o uso de um bot no Zoom ou Teams; o navegador processa só o áudio que a pessoa escolhe compartilhar.
Como o Áudio é Capturado
O áudio é capturado de maneiras diferentes em diferentes sistemas operacionais. Aqui está uma análise detalhada:
Windows
Compartilhar a Janela do App de Videoconferência:
A prévia parece certa e o MediaStream chega. Só não vem a faixa de áudio, e o navegador não avisa.
Compartilhar a Tela Inteira:
No Windows, compartilhar a tela inteira pode levar o áudio do sistema: Teams desktop, Zoom desktop, qualquer app que esteja tocando som.
Solução:
No Windows, a saída prática é usar um driver virtual (BlackHole, Loopback). No Linux e macOS, não expõem essa opção no navegador. No Mac, a saída prática é usar um driver virtual (BlackHole, Loopback). No Linux, o caminho nativo que dá para documentar é reunião numa aba do Chromium (Meet, Teams web, Zoom web) e compartilhar essa aba.
Linux e macOS
Compartilhar a Tela Inteira:
No Linux e macOS, não expõem essa opção no navegador.
Solução:
Solução prática é usar um driver virtual (BlackHole, Loopback).
Firefox e Safari
Compartilhar a Tela Inteira:
Firefox e Safari não entregam áudio de aba comparável.
Solução:
Não há plano B no produto.
Pipeline de Áudio
Aqui está o pipeline de áudio completo:
- AudioWorklet
- PCM16 mono 16 kHz
- Peças pequenas numa WebSocket
- STT em streaming
Gerenciamento de Conexão
A outra coisa que peguei foi não chamar o LLM em todo transcript. Conversa não chega fatiada em assuntos prontos. Acumulamos contexto e só geramos quando surgiu informação nova suficiente desde a última sugestão. Se a sugestão sai cedo demais, falta contexto; se sai tarde, o assunto já mudou. Subir a frequência só aumenta o ruído.
Monitoramento de Qualidade
Dá para medir qualidade sem guardar o conteúdo das conversas (latência, tempo até o primeiro token, feedback explícito positivo/negativo/cópia). O texto da reunião não precisa ir para analytics.
Conclusão
Construindo o LiveSuggest, o que mais me custou até aqui foi entender o que getDisplayMedia() promete em cada SO, antes de prometer qualquer coisa ao usuário final.
Fonte: [Building Real-Time AI Suggestions Without a Meeting Bot](https://dev.to/florian13/building-real-time-ai-suggestions-without-a-meeting-bot-22ef)