Artigo

Transcrição de reuniões sem a nuvem: Whisper e separação de falantes

Equipe editorial da Avenex · 2026-10-13

Gravações de reuniões muitas vezes não podem ser enviadas a um serviço externo: elas contêm acordos, números e nomes. A seguir, mostramos como montamos uma transcrição que roda inteiramente num computador de trabalho e o que obtemos dela. Trata-se da nossa própria ferramenta de trabalho, não de um produto pronto.

Do que o processo é composto

Primeiro, o ffmpeg converte a gravação para WAV de 16 kHz, o formato esperado pelos modelos de reconhecimento de fala. Em seguida, o Whisper large-v3 reconhece o texto. Em Macs com Apple Silicon usamos a versão mlx-whisper, que processa nos núcleos gráficos via Metal. O modelo detecta o idioma sozinho, mas também é possível defini-lo.

A separação de falantes (diarização) é uma etapa à parte, feita pelo pyannote speaker-diarization-3.1. O Whisper responde «o que foi dito», o pyannote responde «quem falou». Os resultados das duas etapas são combinados num único texto com rótulos de falante e marcações de tempo.

Como trabalhar sem internet

Os modelos do pyannote ficam no Hugging Face; no primeiro download é preciso aceitar os termos de uso e informar um token. Depois disso, os modelos ficam armazenados localmente. Nossa ferramenta tem um modo offline: se faltar no armazenamento local qualquer arquivo do modelo, a transcrição para com erro em vez de tentar baixá-lo silenciosamente.

Para um notebook sem placa de vídeo existe outra opção. No nosso assistente de ditado, o reconhecimento é feito pelo Whisper com aceleração por GPU ou pelo modelo Parakeet, otimizado para um processador comum. Antes do reconhecimento, um detector de atividade de voz (VAD) descarta o silêncio: menos trabalho desnecessário e menos frases «fantasma» em trechos vazios.

Reconhecer vozes conhecidas

Sozinho, o pyannote não conhece nomes: ele gera rótulos como SPEAKER_00, SPEAKER_01 e assim por diante. Rotular falantes à mão toda vez é cansativo, por isso mantemos uma galeria de impressões de voz. Para cada falante, o pyannote devolve um vetor médio de voz, comparado com a galeria por similaridade de cosseno.

O nome só é atribuído se o melhor candidato atingir pelo menos 0,5 e superar o segundo por uma margem clara de no mínimo 0,1. Caso contrário, fica SPEAKER_XX: um rótulo honesto é melhor do que nomear com confiança a pessoa errada. A voz de cada pessoa é cadastrada na galeria uma única vez, a partir de uma gravação já rotulada. Se o número de participantes for conhecido, ele pode ser informado à diarização.

Da transcrição às decisões e tarefas

Uma transcrição bruta ainda não é uma ata. Antes de tirar conclusões, marcamos quem entrou e quem saiu e separamos a fala confiável do silêncio, das falas sobrepostas e das repetições do reconhecimento. Cada conclusão mantém sua marcação de tempo para ser conferida na gravação. Um trecho reconhecido com baixa confiança pode virar uma pergunta de esclarecimento, mas não a base de uma tarefa atribuída a uma pessoa específica.

O erro mais comum é registrar como decisão qualquer frase no futuro. Distinguimos vários níveis: uma ideia foi mencionada, uma proposta sem acordo, um próximo passo aceito com responsável e prazo, uma ação condicionada e uma decisão final. Por exemplo, «se o orçamento for aprovado, registramos» é uma meta condicionada, não uma decisão.

Onde guardar o resultado

Transcrições e impressões de voz são dados sensíveis. Na nossa ferramenta, os dados, acessos e resultados de cada projeto ficam separados, e o processamento só roda com um perfil de projeto informado explicitamente. O portal interno é montado a partir de registros revisados — decisões, tarefas, reuniões —, e não de transcrições brutas.

Se for implantar algo assim, defina antes onde as gravações ficam e por quanto tempo, quem vê a transcrição completa e quem vê apenas as tarefas resultantes, e quem revisa a ata antes do envio.