Blog

Ditado contextual no Mac: como o app sabe onde você digita

O TalkTalkType lê o app e o campo em foco com uma classificação determinística e adapta seu ditado durante o refinamento por voz, sem seleção de modo.

Por tsuvicPublicado 10 min de leitura

O TalkTalkType atualmente transcreve apenas inglês e japonês. Esta tradução explica o produto, mas não indica suporte a ditado em português.

Você está no meio de uma resposta no Mail. Segura Option-Espaço, fala por dez segundos e solta. A frase já limpa cai no corpo do e-mail, não em um editor separado, nem na área de transferência esperando você levar até lá.

E você não disse em lugar nenhum para onde o texto deveria ir.

A maioria das ferramentas de voz trata o destino ao contrário. Antes de falar, elas entregam um seletor: um modo bruto, um modo de pontuação, um modo de prompt, um estilo de chat, um estilo de e-mail. Você anuncia o destino, e a ferramenta confia no seu anúncio. O TalkTalkType não tem esse seletor. Ele lê o destino. Ele olha o aplicativo em que você estava e o campo específico sob o cursor, classifica os dois com uma tabela de correspondência fixa e adapta o resultado durante uma etapa de refinamento por voz que você mesmo aciona.

Este artigo trata de como essa leitura funciona, o que ela muda e onde ela para.

O destino é capturado no instante em que você aperta a tecla

A gravação começa ao apertar a tecla. Nesse instante, o app de Mac captura o aplicativo em foco como destino de entrega: o ID do processo, o identificador de bundle e o nome localizado do app. Quando o resultado fica pronto, a entrega devolve o texto exatamente para esse app.

Existem dois caminhos de entrega. No modo Paste, o app usa a API de Acessibilidade do macOS para inserir o texto no campo em que você estava, depois de salvar a área de transferência e restaurá-la em seguida. No modo Copy, o resultado simplesmente espera na área de transferência até você colar manualmente. Nos dois casos, o destino é o app que você usava ao apertar a tecla, capturado antes da primeira palavra.

Capturar ao apertar é o detalhe que faz tudo parecer automático. Se o app esperasse o texto ficar pronto, talvez você já tivesse trocado de janela, e o resultado cairia no lugar errado. Em vez disso, o campo em que você começa é o campo em que você termina. A mecânica dessa entrega, e as permissões do macOS por trás dela, estão em ditado que funciona em qualquer app no Mac.

A classificação é uma tabela, não um palpite

Quando o app de destino é conhecido, o classificador decide que tipo de superfície você está usando. E faz isso sem consultar um modelo de linguagem.

O primeiro passo associa o identificador de bundle a uma família de apps usando uma tabela fixa de prefixos. Terminal, iTerm2, Warp, WezTerm e kitty viram terminal. VS Code, Xcode, as IDEs da JetBrains, Sublime Text e Zed viram editor de código. Mail e Outlook viram e-mail. Slack, Discord, LINE e Telegram viram chat. TextEdit, Notes, Pages, Word e Obsidian viram documento. Safari, Chrome, Firefox e Arc viram navegador.

O segundo passo refina a superfície usando o papel e o subpapel de Acessibilidade do campo. Um campo de busca (AXSearchField) vira uma consulta de busca. No Mail, uma área de texto vira o corpo do e-mail e um campo de texto vira o assunto. Em um app de chat, uma área ou campo de texto vira uma mensagem. Em um app de documentos, uma área de texto vira um documento e um campo de texto vira um campo curto de formulário. Em um editor de código, uma área de texto vira a superfície de editor.

Aqui não há inferência, só uma tabela e algumas verificações de papel. O ganho é que toda classificação carrega uma string de motivo auditável. Um corpo de Mail se classifica como app_family:email role:AXTextArea subrole:-. Dá para ler exatamente por que o app chegou a uma conclusão, porque a conclusão deriva de dois fatos visíveis, não da confiança de um modelo.

Quando a tabela falha, ela falha para o lado seguro. Um app com identificador de bundle desconhecido se classifica como desconhecido, com o motivo unknown_app. Um app conhecido com um papel de campo desconhecido também vira desconhecido, com o motivo unknown_role. Desconhecido significa que o app não faz nada de especial. É o padrão seguro: quando o TalkTalkType não consegue dizer o que um campo é, ele trata suas palavras sem cerimônia, em vez de chutar errado.

O que muda conforme a superfície

A classificação da superfície determina a que a etapa de refinamento pode se adaptar. A correspondência é esta.

App e campo Superfície detectada O que muda
Mail ou Outlook, área de texto principal Corpo de e-mail Tratado como o corpo de um e-mail
Mail ou Outlook, campo de assunto Assunto de e-mail Tratado como uma linha de assunto
Slack, Discord, LINE, Telegram Mensagem de chat Tratado como uma mensagem de chat
VS Code, Xcode, JetBrains, Sublime, Zed Editor de código Nomes de arquivo, caminhos e comandos com barra permanecem texto puro, nunca executados
Terminal, iTerm2, Warp, WezTerm, kitty Terminal O mesmo tratamento de tokens técnicos dos editores de código
TextEdit, Notes, Pages, Word, Obsidian, área de texto Documento Tratado como um documento
TextEdit, Notes, Pages, Word, Obsidian, campo de texto Campo curto de formulário Tratado como um campo de uma linha
Qualquer app conhecido, campo de busca Consulta de busca Tratada como uma consulta de busca
Safari, Chrome, Firefox, Arc Desconhecida Sem adaptação; campos web não são estruturalmente confiáveis
App ou papel de campo não reconhecido Desconhecida Sem adaptação, o padrão seguro

Duas linhas merecem comentário. A linha do navegador é sempre desconhecida, de propósito. Uma página web pode desenhar qualquer campo que quiser, e os sinais estruturais que tornam um campo nativo do Mail ou do Slack legível não se sustentam dentro de uma aba de navegador, então o TalkTalkType não finge classificar campos web. Ele os deixa em paz.

As linhas de editor de código e terminal carregam uma garantia específica sobre tokens técnicos. Nessas superfícies, um nome de arquivo, caminho ou comando com barra falado em voz alta é preservado como texto comum. Ele nunca é tratado como algo que existe, que se resolve ou que executa. Ditar um comando em um terminal produz a string literal, nada além disso.

A adaptação é uma etapa de refinamento, não uma reescrita silenciosa

Esta é a parte mais fácil de exagerar, então o limite importa.

O resultado limpo chega primeiro como um rascunho no HUD da barra de menus. Essa primeira colagem é uma saída Clean fiel. O Clean mantém cada palavra falada, na ordem em que você a disse, com o registro e a brevidade que você pretendia. Remove apenas hesitações inequívocas, junta tudo em uma única linha e nunca parafraseia, expande ou dá polimento. O modo Raw dispensa qualquer limpeza. O que você vê primeiro é o que você disse.

A adaptação contextual acontece depois, no fluxo do Voice Patch. A partir do rascunho, você pode falar um refinamento antes de o texto ser inserido, ou confirmá-lo, copiá-lo ou descartá-lo como está. Quando um refinamento pede ao app para se adaptar à superfície, a instrução ao modelo é literalmente "Adapt only to the supplied deterministic desktop-app and field classification" (adapte-se apenas à classificação determinística fornecida do app de desktop e do campo). O mesmo fluxo preserva o sentido e cada fato protegido, faz a menor edição necessária e trata tudo o que recebe sobre a tela como dados, nunca como uma instrução.

Então o app não reescreve em silêncio a sua primeira colagem para "estilo de e-mail" no momento em que vê o Mail. Ele mostra um rascunho fiel, e a adaptação é algo que você pede por voz, condicionada à superfície que já detectou.

A pergunta que este design responde é por que outras ferramentas ainda entregam um seletor. O TalkTalkType não tem nenhuma seleção de modo de saída em suas configurações. O único interruptor é Clean ligado ou desligado: uma limpeza leve e fiel, ou nada. Tudo o que depende do destino vem de ler o campo, não de um modo que você mantém. Essa é a força pela qual ele deve ser julgado: uma coisa a menos para configurar antes de falar, e nada para configurar errado.

Seu contexto cruza um limite de consentimento, ou não sai

Ler o campo levanta uma pergunta óbvia: e todo o resto que está na tela?

O instantâneo de contexto que o app pode montar inclui a identidade do app, o título da janela, a estrutura do campo (papel, subpapel, se é multilinha ou um campo de senha seguro), o texto logo antes e depois do cursor, a seleção atual, uma captura opcional da janela ativa, um carimbo de tempo da captura e o estado das permissões. Isso cobre muita área, então os limites são aplicados no servidor, e não deixados ao bom comportamento do cliente.

Duas regras importam mais. Primeiro, rótulos e placeholders de campos nunca são enviados ao provedor de IA. Essas strings são texto arbitrário fornecido por outro app, e a classificação precisa apenas de atributos estruturais, então o servidor rejeita de imediato qualquer requisição que contenha um rótulo ou placeholder. Segundo, cada canal de contexto (contexto de texto, captura de tela e memória de preferências) fica atrás de uma flag de recurso controlada pelo servidor. As três vêm ativadas por padrão em produção e podem ser sobrescritas por implantação. Se um canal não estiver habilitado para uma requisição, o servidor rejeita o contexto em vez de removê-lo em silêncio. Uma requisição rejeitada avisa ao cliente que seu estado de consentimento está desatualizado, algo que uma remoção silenciosa esconderia.

O registro de dados completo, cobrindo o que o Mac, o serviço e o provedor retêm, está em ditado privado no Mac.

As preferências são aprendidas localmente, por app

A última peça do contexto é a memória de preferências, e ela fica no Mac.

As preferências vivem em um banco SQLite local em ~/Library/Application Support/TalkTalkType/PreferenceMemory/preferences.sqlite. Não há sincronização em nuvem. As chaves armazenadas são deliberadamente estreitas: tom de resposta (conciso, neutro, formal ou amigável), se usa a vírgula de Oxford, um nível de detalhe de 0 a 2 e uma lista de termos preferidos. Cada preferência vale para todos os apps ou para um app por identificador de bundle, e uma preferência por app vence uma global.

Nada disso é usado até ser explicitamente aprovado e habilitado. Apenas valores abstraídos viajam em uma requisição de refinamento; fala bruta, texto de rascunho e candidatos rejeitados nunca são gravados nesse armazenamento. Se você corrige o app repetidamente em um app, ele pode propor uma preferência, mas uma proposta não faz nada até você aprovar.

Onde isso fica aquém

As limitações honestas são parte do design, não notas de rodapé.

Navegadores se classificam como desconhecidos, então não há adaptação de superfície para formulários web; o app não confia na estrutura de campos web. A adaptação se aplica durante o fluxo de refinamento por voz, não como uma reescrita silenciosa da primeira colagem, que permanece fiel por concepção. A adaptação nunca parafraseia suas palavras até sumir com elas: o sentido e os fatos protegidos são preservados, e a edição é a menor que satisfaz a instrução.

A plataforma é somente Mac e exige macOS 26 (Tahoe) ou posterior. A transcrição roda na nuvem, então o áudio sai do Mac para ser processado; o serviço não armazena áudio nem texto transcrito por padrão. Os idiomas de reconhecimento são japonês e inglês. Comandos de voz como "copiar" ou "abrir o Safari" são outra expressão da mesma ideia: eles rodam como ações de Mac contra o app capturado, em vez de serem digitados como texto.

Julgando para o seu próprio fluxo de trabalho

O argumento deste design é que o destino é um fato que o app pode ler, não um ajuste que você precise manter. Um seletor de modo terceiriza esse trabalho para você, e um seletor é uma promessa que a ferramenta pode quebrar no instante em que você esquece de trocá-lo. Uma tabela de correspondência sobre identificadores de bundle e papéis de campo é mais sem graça e mais honesta: ela conhece com precisão um conjunto pequeno de apps e admite quando não conhece um.

O TalkTalkType conta o uso em ditados por semana mais uma reserva semanal de tempo de voz, e não em palavras. Em 30 de julho de 2026, os planos são Free a US$ 0 (30 ditados e 15 minutos por semana), Plus a US$ 1 (80 e 30 minutos), Pro a US$ 7 (500 e 250 minutos, com gravações de dois minutos) e Max a US$ 18 (1.200 e 600 minutos). Os números atuais e a disponibilidade dos planos estão na página de preços.

Você pode baixar o TalkTalkType e testar a detecção nos campos que realmente usa. Segure a tecla no Mail, depois em um terminal, depois em um formulário web, e observe onde o resultado cai e o que ele se recusa a tocar. O app já sabe onde você está digitando. O interessante é com que franqueza ele avisa quando não sabe.

Blog