Engenharia

Arquitetura de digitação por voz: por dentro da stack de três modelos da Loqua

Por que separamos reconhecimento de fala, inteligência de linguagem e contexto de tela - e como pensamos com honestidade sobre os números internos.

TL;DR

Esta é uma visão em nível de blog da arquitetura de digitação por voz da Loqua — e de por que a arquitetura certa de IA por voz para ditado não é um grande modelo de ASR. A Loqua é construída como três camadas cooperantes: reconhecimento de fala, inteligência de linguagem e contexto multimodal. O motivo é simples: qualidade de ditado não é só taxa de erro de palavras. Uma stack útil de modelos de ditado precisa ouvir as palavras, entender nomes técnicos e moldar a saída para o app de destino. Nossas metas internas são responsividade na faixa de 200 ms, alto reconhecimento de vocabulário técnico e WER de um dígito baixo em condições suportadas; até publicarmos uma página de benchmark, trate isso como medições internas, não como alegações verificadas por terceiros.

Sou Shuran. Lidero uma pequena equipe de pesquisadores de algoritmos que usam digitação por voz todos os dias. Construímos a Loqua porque as ferramentas de ditado que avaliamos — a maioria bem projetada, a maioria genuinamente útil — batiam no mesmo teto quando as pressionávamos em código, mistura multilíngue e formatação ciente do app. O teto é estrutural, não um problema de ajuste fino. Esta é a arquitetura à qual chegamos depois de decidir que a estrutura precisava mudar.

Isto não é um paper. É uma explicação em nível de blog — a intuição por trás de cada camada, os números que apareceram e para que realmente usamos a stack. Se você quer o contexto acadêmico mais profundo, a seção de leituras adicionais no final aponta para os papers em que nos baseamos.

A armadilha de embrulhar o Whisper

O Whisper da OpenAI mudou o que é possível em reconhecimento de fala em inglês. É um modelo notável. O paper do Whisper mostrou que escalar treinamento de áudio com supervisão fraca produz ASR geral robusto — entre sotaques, condições e 99 idiomas — sem ajuste fino por domínio. Isso é uma vitória estrutural para o campo.

Mas o Whisper é um modelo de ASR, não um produto de ditado. A distância entre "transcreve fala com precisão" e "produz texto que eu posso colar em um email sem editar" é grande. A abordagem de embrulhar o Whisper — pegar a saída do Whisper e passá-la por uma camada de formatação — fecha parte dessa lacuna. Ela falha em três pontos que importavam para nós:

  • Vocabulário técnico. O Whisper ouve "react query" e entrega "react query." Ele não sabe que, na sua base de código, isso é @tanstack/react-query e que o import do pacote era o que você queria. NER em vocabulário técnico exige um modelo que veja o contexto ao redor, não um modelo que ouça fonemas.
  • Formatação ciente do app. O Whisper transcreve; ele não sabe se você está no Slack ou em um arquivo Python. Acoplar um formatador por cima exige uma heurística — frágil — ou uma chamada pesada a LLM por fala, que é lenta e dependente de nuvem.
  • Streaming sob orçamentos rígidos de latência. O Whisper é excelente para transcrição em lote. Whisper on-device, em streaming e com baixa latência exige concessões (modelo menor, menor precisão) ou engenharia agressiva que briga com a estrutura do modelo.

Testamos o caminho de embrulhar o Whisper em um protótipo de pesquisa. Era bom o bastante para testar ideias. Não era bom o bastante para usar como nossa ferramenta diária.

A intuição dos três modelos: um tipo diferente de stack de reconhecimento de fala

A intuição é que digitação por voz tem três trabalhos, e o mesmo modelo é ruim em fazer todos eles. Os três trabalhos:

  1. Ouvir as palavras. De acústica para tokens. É nisso que ASR é bom.
  2. Entender a intenção. Limpar vícios de fala, falsos começos e correções no meio da frase. Reconhecer entidades técnicas. Decidir o que o usuário realmente quis digitar.
  3. Colocar corretamente. Formatar a saída para o app de destino. Fazer a mesma intenção sair como código no VS Code, como mensagem no Slack, como prompt estruturado no Cursor.

Um único modelo end-to-end tentando fazer os três tem um problema estrutural difícil: a superfície de perda para "transcrever fonemas" e a superfície de perda para "formatar para Slack" apontam em direções diferentes. Treinamento conjunto compromete ambos. Confirmamos isso com nossas próprias ablações — tentamos unificar as camadas 2 e 3 em um transformer treinado com dados multitarefa, e a precisão caiu nas duas.

Dividir em três permite que cada modelo faça bem um trabalho. O custo é uma pequena quantidade de latência na passagem entre camadas, que recuperamos rodando tudo no Neural Engine em um único pipeline. Esse é o coração da arquitetura de digitação por voz da Loqua: não um transcritor monolítico, mas uma pequena stack de modelos de ditado em que cada camada é treinada para uma parte específica do problema.

Camada 1: reconhecimento de fala

Entrada acústica → sequência de tokens. Este é um reconhecedor de fala específico para a tarefa, não um wrapper direto do Whisper. As escolhas de arquitetura foram guiadas por três restrições das quais não abriríamos mão:

  • Streaming em primeiro lugar. A saída começa antes de a pessoa terminar a fala. Isso elimina atenção não causal sobre a sequência completa de áudio como padrão — usamos uma variante amigável a streaming.
  • Compatibilidade com Neural Engine on-device. O tamanho do modelo e a seleção de operadores são restringidos pelo que roda com eficiência no Core ML da Apple via Neural Engine. Essa é uma restrição real — operadores que parecem bons em um paper podem sair do caminho do Neural Engine e ficar presos à CPU.
  • Robustez a baixa amplitude. Nossos dados de treinamento incluem deliberadamente entrada em volume de sussurro (pessoas ditando baixo em cafés, tarde da noite). A maioria dos dados gerais de ASR tem volume normal; volume de sussurro exige cobertura explícita.

A saída desta camada é uma sequência de tokens com tempos e escores de confiança. Não é seu texto final — é o reconhecimento bruto que a próxima camada limpa.

Camada 2: inteligência de linguagem

Sequência de tokens → texto limpo com intenção resolvida. É aqui que fazemos o maior investimento de pesquisa, porque é onde mora a maior parte da qualidade visível para o usuário.

O trabalho desta camada: pegar o que o modelo de fala ouviu e produzir o que o usuário quis dizer. Três coisas acontecem em paralelo:

  • Remoção de vícios de fala e falsos começos. "Hum, então, basicamente, a gente deveria — na verdade espera, deixa eu começar de novo — a gente deveria cachear isso" vira "A gente deveria cachear isso." A correção no meio da frase é respeitada; o aquecimento verbal some.
  • NER para vocabulário técnico. A camada aprende nomes de bibliotecas, frameworks, famílias de modelos, extensões de arquivo, comandos de terminal e superfícies idiomáticas de API comuns. "React query" vira @tanstack/react-query quando o contexto ao redor é um arquivo JavaScript. Nossa meta interna é reconhecimento na faixa alta dos 90% em vocabulário técnico curado e de domínio, para que identificadores saiam certos sem obrigar um dicionário pessoal para cada termo comum.
  • Modelagem estrutural. Se a saída será frase, lista com bullets, tabela Markdown ou comentário de código é decidido aqui com base no que a próxima camada (contexto multimodal) diz sobre o destino.

Esta camada é o menor modelo da stack em contagem de parâmetros, mas o de maior impacto na experiência do usuário. Gastamos mais horas de equipe aqui do que nas outras duas juntas.

Camada 3: contexto multimodal

Estado do app + tela + cursor → diretiva de formato. Esta é a camada omni-modal — e é o motivo de não chamarmos isso apenas de "um app de ditado". O trabalho da Loqua não é transcrever; é escrever o que você quis dizer onde você quis dizer.

A camada de contexto lê o app ativo via Acessibilidade do macOS, o texto selecionado (se houver), o texto visível adjacente e as pistas estruturais do destino (composição no Gmail vs thread do Slack vs arquivo Python no VS Code vs painel de chat do Cursor). Ela produz uma diretiva de formato que a camada de linguagem usa para moldar o texto final.

A intuição mais profunda — por que arquiteturas omni-modais mudam a digitação por voz, e não apenas a melhoram — merece um texto próprio. Veja voz encontra visão: como modelos omni-modais liberam ditado ciente de contexto se quiser seguir esse fio.

Os números que acompanhamos

MétricaMeta interna atualPor que importa
Latência ponta a pontaFaixa de 200 ms em Apple SiliconAbaixo do ponto em que ditado começa a parecer espera
Tempo até o primeiro token (TTFT)Sub-200 ms em casos comuns de streamingAs primeiras palavras aparecem enquanto falas mais longas ainda estão sendo ditas
Precisão de NERAlta faixa dos 90% em vocabulário técnico curado de domínioIdentificadores, bibliotecas e nomes de modelos precisam sair certos
WER multilíngueUm dígito baixo em condições de teste suportadasInglês / chinês misturados e inglês com sotaque precisam funcionar em workflows reais

Esses são números de benchmark interno e dogfooding, não uma suíte de benchmark de terceiros. Os conjuntos de teste incluem nosso próprio vocabulário técnico, exemplos de code-switching, amostras de inglês com sotaque e ambientes cotidianos ruidosos. O próximo passo de conteúdo deve ser uma página pública de metodologia para que esses números possam ser citados sem aceno vago.

Como usamos internamente

A coisa mais importante que posso dizer sobre esta stack é que a escrevemos porque a usamos. Todo membro da equipe dita diariamente — para commits, PRs, Slack interno, textos técnicos mais longos e (no meu caso) a maior parte da prosa de posts como este. As decisões que moldaram a arquitetura vieram do uso real, não de uma spec de produto.

Três lugares em que a distinção arquitetura-vs-recurso aparece no uso diário:

  • Ditado de código. A qualidade de NER é a diferença entre voz como interface viável para código e voz como brinquedo. Veja o guia de ditado de código para o que isso permite.
  • Code-switching multilíngue. Metade do nosso Slack interno mistura mandarim e inglês. A camada de linguagem é treinada em dados com code-switching, não tentando contorná-los; trocas no meio da frase funcionam sem alternar modo.
  • Formatação ciente do app. A mesma frase por voz virando comentário de código no VS Code e descrição estruturada de PR no GitHub é a diferença entre digitação por voz e um produto útil.

Somos uma equipe pequena. A versão honesta dessa história é que não temos recursos para manter um produto embrulhado no Whisper E uma stack de pesquisa com três modelos. Apostamos no caminho estrutural porque precisávamos da qualidade para nós mesmos, e preferimos entregar algo mais estreito com qualidade do que algo mais amplo sem ela.

Como cada camada foi reconstruída em 2026

Camada 1 — reconhecimento de fala. O reconhecedor foi apertado em torno de streaming, fala em baixa amplitude e vocabulário técnico; a explicação mais profunda está em por dentro da nossa stack de voz omni-modal e os detalhes de pós-treinamento estão em RL na nossa stack de voz.

Camada 2 — inteligência de linguagem. A camada de linguagem agora trata limpeza, preservação de entidades e estrutura ciente do app como uma única stack de modelos de ditado, em vez de pós-processadores separados. É onde reinforcement learning mais ajuda: escolher a saída que os usuários menos editam.

Camada 3 — contexto multimodal. A camada de contexto foi reconstruída em torno de evidência local da tela: app ativo, texto selecionado, identificadores visíveis e arredores do cursor. Veja construindo um ouvinte que vê o que você vê para a arquitetura.

A próxima fronteira é áudio não verbal: AED e legendagem de áudio como contexto opcional e local-first. Cobrimos esse trabalho em estágio de protótipo em sons com significado.

Leituras adicionais

Se você quiser ir mais fundo do que este tratamento em nível de blog:

Se você tiver perguntas sobre a arquitetura ou quiser investigar qualquer uma dessas camadas em mais profundidade, fale com a gente. Somos uma equipe pequena e lemos todos os emails.

Perguntas frequentes

Por que três modelos em vez de um grande LLM?
Um único modelo end-to-end tem um problema estrutural: a superfície de perda para "transcrever fonemas corretamente" aponta para uma direção diferente da superfície de perda para "formatar saída para Slack". Tentamos unificar as camadas 2 e 3 em um transformer treinado com dados multitarefa, e a precisão caiu nas duas. Três modelos treinados para fins específicos, cada um fazendo bem um trabalho, vencem um modelo tentando fazer os três.
Por que não apenas embrulhar o Whisper?
O Whisper é um ótimo modelo de ASR, mas não é um produto de ditado. A abordagem de embrulhar o Whisper fica aquém em vocabulário técnico (sem NER em contexto), formatação ciente do app (exige pós-processador pesado) e streaming on-device (o Whisper é otimizado para lote). Precisávamos dos três para nosso uso diário.
Vocês treinaram modelos do zero?
Sim, para as camadas de reconhecimento de fala e inteligência de linguagem. A camada de contexto multimodal se baseia em padrões de pesquisa omni-modal (veja o post omni-modal para a linhagem), com nossos próprios dados de treinamento e ajuste fino específico para ditado.
Qual é o tamanho de cada modelo?
Não publicamos contagens exatas de parâmetros — elas são ajustadas para caber no orçamento do Neural Engine enquanto atingem nossas metas de latência e precisão. As três camadas juntas rodam dentro da parte on-device da stack. A nuvem fica reservada para casos específicos (reescritas mais longas, certas traduções) e pode ser ligada ou desligada pelo usuário.
Como vocês avaliam precisão?
Com suítes internas de benchmark para cada camada, além de dogfooding diário da equipe. Reconhecimento de fala é medido com protocolos no estilo WER em condições suportadas. NER é medido em vocabulário técnico curado. Devemos publicar metodologia antes de tratar qualquer número como alegação de benchmark externo.
Vocês vão abrir o código de alguma parte?
Não há plano atual para a stack de produção — a equipe é pequena, e o trabalho de manter um lançamento público limpo junto com o produto nos deixaria mais lentos. Publicamos notas como esta quando há algo que vale dizer. Se quiser colaborar em pesquisa, mande um email.

Experimente a Loqua hoje

Comece de graça. Nativo para Mac. Criado por pesquisadores de algoritmos que usam o produto todos os dias.

Baixar para Mac

Mais no Blog da Loqua

Engenharia
Digitação por voz omni-modal: entendimento multimodal, MoE e saída de texto em streaming
Engenharia
Reinforcement learning em digitação por voz: GRPO, DPO e destilação on-policy na nossa stack de voz
Engenharia
Reconhecimento de voz multimodal: construindo um ouvinte que vê o que você vê
Produtividade
Stack de produtividade por voz: 9 ferramentas que realmente usamos para escrever, entregar e pensar
Como fazer
Notas de reunião por voz no Mac: da fala ao trabalho concluído com notas e ações