Artigo
Transcrição de reuniões sem a nuvem: Whisper e separação de falantes
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.
- ffmpeg: qualquer formato de gravação → WAV de 16 kHz.
- mlx-whisper com o modelo whisper-large-v3: texto com marcações de tempo.
- pyannote speaker-diarization-3.1: trechos por falante.
- Resultado: transcript.md para leitura e transcript.json para processamento posterior.
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.
- Limite de similaridade: 0,5 por padrão.
- Margem sobre o segundo candidato: no mínimo 0,1.
- Uma voz não reconhecida mantém o rótulo técnico.
- A diarização pode ser refeita sem reconhecer o texto de novo.
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.
- Discussão: «poderíamos…», sem responsável nem prazo.
- Proposta: «eu sugeriria…», ainda não aceita.
- Próximo passo: há responsável, resultado e data.
- Condição: ação somente após um evento definido.
- Decisão: escolha final sem condições em aberto.
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.