Uma transcrição mostra o que foi dito. Em uma entrevista, reunião ou podcast, a outra metade é saber quem disse cada trecho. Na investigação da fala, este problema chama-se diarização de falantes. Desde as versões iPhone 1.8.5, Mac App Store 1.3.2 e Mac por download direto 1.5.1, o Whisper Notes executa a diarização inteiramente no dispositivo.
Neste artigo, explicamos como funciona, apresentamos os resultados do nosso benchmark face a uma referência gerada na nuvem e descrevemos o único caso de falha que não conseguimos resolver só com engenharia — e o que fizemos em alternativa.
O que faz
Abra uma nota — uma gravação, um arquivo de áudio ou vídeo importado, ou uma gravação de reunião — e toque no botão de falantes. Alguns segundos depois, cada parágrafo mostra uma identificação do falante e uma marca de tempo.
Identificação de falantes no Mac e no iPhone. Ao tocar em uma frase, a reprodução vai até aquele momento.
Os nomes começam como Falante 1 e Falante 2. Ao renomear um deles, toda a transcrição é atualizada. Toque em qualquer frase para mover a reprodução de áudio ao momento exato; assim é simples confirmar uma citação pela voz original.
Renomear um falante atualiza todos os parágrafos da nota.
Nas gravações de reuniões, a identificação de falantes roda automaticamente quando a chamada termina; você pode desativá-la em Ajustes. Os nomes são mantidos na exportação: Copiar transcrição com falantes leva esses nomes para a área de transferência, e os arquivos SRT e VTT também os incluem nas legendas.
A diarização analisa vozes, não com palavras. Por isso, comporta-se da mesma forma nos mais de 100 idiomas que o app transcreve.
Um modelo de 19 MB no Neural Engine
A diarização responde a «quem falou e quando» em três passos. Primeiro, divide o áudio em segmentos com voz. Depois, transforma cada segmento em uma impressão vocal: um vetor compacto que descreve a voz, e não as palavras. Por fim, agrupa as impressões; os segmentos no mesmo grupo recebem a mesma identificação.
O Whisper Notes usa o pipeline community-1 da pyannote, convertido para Core ML para que ambas as fases sejam executadas no Neural Engine. O download único ocupa 19 MB, e uma conversa de 5.7 minutos leva de 2 a 4 segundos em um Mac da série M.
Áudio → segmentos com voz → impressões vocais → grupos → etiquetas
Todas as etapas rodam no aparelho.
Isso importa ainda mais na diarização do que na transcrição. Uma impressão vocal é um dado biométrico: identifica uma pessoa como uma impressão digital. Com processamento local, as impressões da sua voz, de seus colegas e das pessoas que você entrevista são calculadas, agrupadas e descartadas no aparelho. Elas nunca são enviadas para lugar nenhum.
O que medimos
Mantemos um benchmark fixo de dois arquivos para a diarização. A referência vem de um serviço na nuvem de ASR e diarização (ElevenLabs) e foi verificada manualmente. A pontuação atribui cada 10 ms de fala a um falante e escolhe a melhor correspondência entre o resultado e a referência. Dois arquivos formam uma amostra pequena: tratamos esses números como indicativos, não definitivos.
O primeiro arquivo representa o caso comum: um podcast em inglês de cinco minutos, com duas vozes claramente diferentes. A maioria das entrevistas, dos podcasts e das reuniões entre duas pessoas é assim.
| Podcast em inglês com dois falantes (5 min) | Resultado |
|---|---|
| Atribuição por frame (resolução de 10 ms) | 96.7% |
| Precisão por frase (o que você lê) | 99.1% |
| Tempo de processamento, Neural Engine da série M | 2–4 s |
Os 0.9% que restam correspondem a três oscilações nos limites das frases, totalizando 3.4 segundos — dentro da resolução da própria referência. Nesse tipo de material, o resultado no aparelho corresponde ao serviço na nuvem que produziu nossa referência.
O caso difícil
O segundo arquivo é difícil de propósito: duas vozes masculinas semelhantes em uma sala com reverberação e um apresentador que intervém 19 vezes, durante uma média de 2.3 segundos por vez. O convidado fala durante 272 segundos; o apresentador, 43. Este é o perfil acústico que faz a diarização falhar em qualquer idioma: vozes parecidas alternando falas curtas.
Aqui, o agrupamento automático colapsa. As duas impressões vocais ficam tão próximas que o algoritmo as junta e atribui quase toda a conversa a um só falante. A gravação é, por acaso, um programa de entrevistas em chinês, o que nos permitiu testar a hipótese óbvia: um modelo especializado no idioma teria desempenho melhor. Comparamos, em um pipeline de CPU, dois modelos de falante treinados especificamente com fala em chinês:
| Modelo | Podcast em inglês | Caso difícil* | Tempo (áudio de 5.7 min) |
|---|---|---|---|
| pyannote community-1 (nosso modelo, Neural Engine) | 96.7% | 81–82% | 2–4 s |
| CAM++ (treinado em chinês, CPU) | 93.9% | 81.2% | 36–103 s |
| ERes2NetV2 (treinado em chinês, CPU) | — | 80.5% | 220–290 s |
* Atribuição por frame no arquivo difícil com o número de falantes informado. Sem essa informação, todos os modelos convergem para um único falante.
Ambos colapsam da mesma forma, usando de 10 a 100 vezes mais poder de processamento. A dificuldade é acústica, não linguística — o limite está no que as representações vocais atuais conseguem distinguir, em qualquer idioma.
Isso descartou a correção óbvia e apontou para outra: dar ao pipeline um dado que não consegue deduzir — o número de pessoas na sala. Com o número indicado (uma opção do menu, de 2 a 6), o arquivo difícil passa do colapso para 89% de precisão por frase. A detecção automática continua sendo o padrão, porque acerta em gravações comuns.
Repetir a detecção com o número exato de falantes. O mesmo menu exporta SRT e VTT com a identificação de cada falante.
Corrigir intervenções curtas
Com o número definido, cerca de metade dos erros restantes estava em intervenções com menos de três segundos. Um trecho de dois segundos dá muito pouco sinal ao modelo de representação; em trocas rápidas, a sua impressão vocal também absorve parte da voz do falante ao lado.
Depois do agrupamento, o pipeline reavalia cada frase com menos de 3.5 segundos. Recalcula a impressão vocal com uma máscara exatamente sobre os frames dessa frase, compara a impressão com a âncora de cada falante — a média das suas intervenções mais longas — e só muda a etiqueta quando a diferença é decisiva. O modelo existente é reutilizado; não há outro download.
| Precisão por frase de ponta a ponta | Antes da correção | Depois |
|---|---|---|
| Caso difícil (número de falantes informado) | 89.0% | 94.8% |
| Podcast em inglês (automático) | 98.5% | 99.1% |
O critério é conservador: nos dois arquivos, a etapa de correção mudou 21 etiquetas sem introduzir novos erros.
Limitações
• As etiquetas aparecem quando a gravação termina, não durante a chamada. Se você precisar de legendas ao vivo com o nome dos falantes enquanto a reunião acontece, um serviço na nuvem como o Otter ou o Notta é mais indicado.
• Quando duas pessoas falam ao mesmo tempo, cada frase recebe apenas uma identificação.
• Vozes parecidas continuam sendo um desafio. Os 94.8% no nosso arquivo difícil são o limite atual com o número de falantes informado, não um problema resolvido.
Disponibilidade
A identificação de falantes está incluída na compra única de $6.99, juntamente com os três mecanismos de transcrição do app — Parakeet V3, Whisper Large V3 Turbo e SenseVoice — e edição local com IA. Não há um plano separado e você não precisa criar uma conta.
• iPhone: App Store, versão 1.8.5 ou posterior.
• Mac App Store: versão 1.3.2 ou posterior.
• Download direto para Mac (DMG): versão 1.5.1 ou posterior em whispernotes.app, com teste grátis.
Para saber como funciona a gravação de reuniões, veja nosso artigo sobre transcrição offline de reuniões.