Recebi a notícia do Sapo.pt sobre a nova função de ditado nativo do WhatsApp e a primeira coisa que pensei foi: “finalmente”. Há anos a Meta dependia de soluções terceiras para transcrever áudio — e quem programa sabe o quão frustrante é depender de Gboard ou SwiftKey quando o que se quer é velocidade. Mas o detalhe técnico mais importante não está no botão em si. Está no facto de todo o processamento ser feito localmente. E isso muda completamente o jogo, tanto para o utilizador comum como para quem constrói produtos de comunicação.
O que está realmente a mudar no WhatsApp
A funcionalidade, descoberta pelo WABetaInfo no canal beta do Android, introduz um mecanismo de ditado que dispensa o envio de ficheiros de áudio. Tu falas, a aplicação converte em texto, tu revês e envias. Simples assim — e é exactamente a simplicidade que torna isto relevante.
Segundo o Sapo.pt, a Meta adicionou um novo atalho dedicado na barra de escrita do chat, compatível com mensagens privadas, grupos e canais. No primeiro uso, o utilizador escolhe o idioma e recebe instruções. Aparece um indicador visual de escuta, o sistema capta a fala, gera um rascunho e abre um ecrã de revisão antes do envio. Nada sai do dispositivo sem confirmação explícita.
O detalhe que me chamou a atenção: processamento 100% local
Isto é o ponto. A Meta optou por descarregar pacotes de idiomas para a memória interna do smartphone, garantindo que o reconhecimento de voz acontece on-device. Na minha experiência a construir apps com integração de voz, isso significa três coisas concretas:
- Latência próxima de zero. Sem round-trip para servidores, a transcrição aparece quase em tempo real.
- Funciona offline. Estás num túnel, num avião ou num café com Wi-Fi miserável? Ditas na mesma.
- Privacidade real. Nenhum áudio sai do telefone. A encriptação ponto a ponto continua intacta porque, tecnicamente, nunca há áudio a circular — só texto já gerado localmente.
Este modelo é o oposto do que a Apple faz com o Siri clássico ou do que muitas aplicações Android ainda fazem ao delegar reconhecimento para a Google Cloud Speech. A Meta está claramente a posicionar-se no mesmo campo da Apple com o seu Dictation offline introduzido no iOS 17.
Na Prática: como replicar esta abordagem no teu próprio projeto
Se estás a construir uma aplicação e queres oferecer ditado offline, o caminho do WhatsApp é um excelente blueprint. Vou mostrar-te como implementar algo semelhante em Android usando a API nativa SpeechRecognizer com o extra de reconhecimento offline.
class OfflineDictationManager(private val context: Context) {
private val speechRecognizer: SpeechRecognizer by lazy {
SpeechRecognizer.createSpeechRecognizer(context).apply {
setRecognitionListener(dictationListener)
}
}
fun startDictation(language: Locale = Locale("pt", "PT")) {
val intent = Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH).apply {
putExtra(
RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM
)
putExtra(RecognizerIntent.EXTRA_LANGUAGE, language.toLanguageTag())
// A chave: forçar uso do pacote local
putExtra(
RecognizerIntent.EXTRA_PREFER_OFFLINE,
true
)
putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 1)
putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS, true)
}
speechRecognizer.startListening(intent)
}
private val dictationListener = object : RecognitionListener {
override fun onResults(results: Bundle?) {
val matches = results
?.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION)
val transcript = matches?.firstOrNull().orEmpty()
// Aqui entregas o rascunho para revisão antes do envio
onTranscriptReady(transcript)
}
override fun onPartialResults(partial: Bundle?) {
val partialText = partial
?.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION)
?.firstOrNull()
onPartialTranscript(partialText.orEmpty())
}
// restantes callbacks omitidos para brevidade
override fun onError(error: Int) { /* tratar */ }
override fun onReadyForSpeech(params: Bundle?) {}
override fun onBeginningOfSpeech() {}
override fun onRmsChanged(rmsdB: Float) {}
override fun onBufferReceived(buffer: ByteArray?) {}
override fun onEndOfSpeech() {}
override fun onEvent(eventType: Int, params: Bundle?) {}
}
}
O EXTRA_PREFER_OFFLINE é o detalhe que replica o comportamento da Meta. Sem ele, o Android usa automaticamente a cloud e o teu “offline” deixa de ser offline. Cuidado com isto — vejo programadores a assumirem que basta não ter rede para o reconhecimento funcionar localmente. Não funciona. Tens de pedir explicitamente.
Comparação honesta: alternativas que já existem
| Solução | Offline? | Privacidade | Latência | Custo de integração |
|---|---|---|---|---|
| WhatsApp (beta) | Sim (pacotes locais) | Alta | Baixa | Nativo |
| Google Speech-to-Text | Parcial | Média | Média | Gratuito até quota |
| Whisper.cpp (OpenAI) | Sim | Alta | Variável | Modelo + tuning |
| Vosk | Sim | Alta | Baixa | Modelo leve (~50MB) |
| Apple Dictation | Sim (iOS 17+) | Alta | Baixa | Nativo iOS |
Na minha experiência, o Vosk é a melhor escolha se precisas de uma alternativa open-source ao que a Meta está a fazer. Suporta português europeu, corre em Android com modelos a partir de 50MB e tem integração nativa com Kotlin. Já implementei em dois projetos de chatbot e o resultado é surpreendentemente bom para ditado contínuo.
Erros comuns que devs cometem ao implementar ditado
Esta é a parte que a maioria dos artigos ignora e onde eu vejo mais bugs em produção:
- Não verificar se o pacote de idioma está instalado. Antes de iniciar o reconhecimento, tens de confirmar com
SpeechRecognizer.isRecognitionAvailable()e pedir ao utilizador para instalar o pacote viaSpeechRecognizer.getRecognitionLanguages(). Caso contrário, o sistema cai silenciosamente para a cloud. - Confundir
EXTRA_PREFER_OFFLINEcom modo totalmente offline. É uma preferência, não uma imposição. Em alguns dispositivos, o sistema ignora se o pacote local não suportar o idioma pedido. - Não tratar o cancelamento. O utilizador pode querer parar o ditado a meio. Sem um timeout ou botão de cancelamento, a sessão fica pendurada e consome bateria.
- Subestimar o tamanho dos modelos. Os pacotes de idioma ocupam entre 20MB e 100MB. Em mercados com dispositivos low-end, isto é um problema real. A Meta vai ter de gerir isto com cuidado.
- Esquecer o feedback visual. O utilizador precisa de saber que está a ser ouvido. O WhatsApp mostra um indicador — tu também deves.
O que isto significa para devs e produtos de comunicação
Quando uma app com 2 mil milhões de utilizadores normaliza ditado offline nativo, o padrão da indústria muda. Apps rivais — Telegram, Signal, Discord — vão sentir pressão para oferecer o mesmo. E quem está a construir ferramentas internas (chat corporativo, CRMs com voz, apps de campo) precisa de repensar a UX.
Já não é aceitável ter um botão de “gravar áudio” como única opção. A expectativa do utilizador em 2026 é: posso falar E posso editar antes de enviar. Esse é o novo baseline.
Outro ponto: a Meta está a sinalizar que on-device AI é a direção. Depois do Llama a correr localmente, dos modelos de tradução nativos, agora ditado offline. O argumento da “cloud é inevitável para IA” está a cair. Para nós, devs, isso significa que os nossos apps podem ser mais rápidos, mais privados e mais baratos de operar.
FAQ — Perguntas que um dev realmente faz
O WhatsApp vai mesmo manter tudo offline ou pode mudar para cloud no futuro?
Olhando para a implementação atual, os pacotes locais são descarregados uma vez e o reconhecimento nunca toca em servidores externos. É estrutural, não cosmético. Duvido que revertam isto — seria um retrocesso de privacidade monumental.
Posso usar esta API noutras apps Android?
Sim, a android.speech.SpeechRecognizer está disponível desde a API 8. O que mudou com esta abordagem da Meta foi a integração nativa no fluxo de chat, não a tecnologia subjacente.
Quanto pesa um pacote de idioma do Whisper ou Vosk?
Depende do modelo. O Vosk small tem ~50MB e já dá resultados razoáveis para português europeu. O Whisper tiny ronda os 75MB e o base ultrapassa os 140MB. Para mobile, recomendo começar pelo Vosk small e evoluir se a precisão não chegar.
Vale a pena implementar ditado offline num projeto pequeno?
Se o teu público é técnico ou productivity-focused, sim. Se é casual, provavelmente o esforço de UX (ensinar o utilizador a instalar o pacote, gerir permissões, tratar erros) não compensa. Usa cloud speech nesse caso.
Quando esta função chega à versão estável do WhatsApp?
Historicamente, a Meta demora entre 4 a 8 semanas entre descoberta em beta e rollout em produção. Mas com funcionalidades que dependem de pacotes locais e múltiplos idiomas, pode demorar mais. O meu palpite: verão de 2026 em Portugal, com suporte inicial em inglês e português europeu.
O meu veredito
Esta é daquelas funcionalidades que parece pequena mas revela uma estratégia clara: a Meta quer que o WhatsApp seja a primeira app de comunicação onde a voz é tão fluida quanto o texto, sem os trade-offs habituais. Para nós, devs, é também um sinal de que o futuro da UX conversacional passa por modelos locais, baixa latência e zero dependência de servidores externos.
Vou acompanhar a evolução disto de perto — especialmente a forma como a Meta vai gerir o tamanho dos pacotes em mercados com restrições de armazenamento. Se quiseres discutir implementações semelhantes ou partilhar a tua experiência com Vosk ou Whisper em mobile, fala comigo nos comentários.
Gostou? Me segue no GitHub e deixa um comentário se tiver dúvida ou quiser aprofundar algum ponto.