STT nativo vs Deepgram: qual motor de voz escolher?
Quando lancei o TAMSIV, todo o reconhecimento de voz passava pelo Deepgram. Um serviço em nuvem excelente, preciso e rápido. O português? Impecável. Os sotaques regionais? Gerenciados. A pontuação automática? Perfeita. Havia apenas um detalhe: cada segundo de áudio transcrito tinha um preço. E quando o teu aplicativo depende inteiramente da voz, esse preço sobe rapidamente.
Então, tive que fazer uma escolha estratégica: ou eu mantinha o Deepgram para todos e repassava o custo para as assinaturas, ou encontrava uma alternativa gratuita para o plano Free e reservava o Deepgram para os usuários pagantes. Escolhi a segunda opção. Veja como construí uma arquitetura dual STT nativo + Deepgram, e o que aprendi comparando os dois em condições reais.
Pontos-chave a reter:
- O STT nativo (Google/Apple) é gratuito, local e suficiente para ditados curtos
- O Deepgram continua superior em precisão, especialmente em ambientes ruidosos e com sotaques
- Uma arquitetura dual permite oferecer um plano gratuito viável sem sacrificar a qualidade premium
- A abstração do frontend faz com que os componentes ignorem qual motor está em execução
- A escolha STT nativo vs. nuvem é configurável pelo administrador sem atualização do aplicativo
Por que o reconhecimento de voz é tão central em um aplicativo de produtividade?
TAMSIV não é um aplicativo de produtividade clássico onde tu digitas listas. É um aplicativo onde tu falas. Tu ditas uma tarefa, um memorando, um evento. O assistente de voz entende o que tu dizes, cria o item e te responde. Tudo passa pela voz.
Isso significa que a qualidade da transcrição impacta diretamente a experiência. Se o STT entender mal "comprar pão" e transcrever "comprar banho", o usuário perde a confiança. Se a pontuação estiver ausente, o memorando se torna um bloco de texto ilegível. O STT não é um gadget — é a base de toda a experiência do usuário.
É por isso que dediquei tempo para construir o pipeline vocal completo com cuidado. O STT é a primeira etapa da cadeia: Áudio → STT → Texto → LLM → Function Calling → TTS → Áudio. Se a primeira etapa falhar, todo o resto desmorona.
Como funciona o STT nativo no Android e iOS?
Todo smartphone moderno possui um motor de reconhecimento de voz. No Android, é o SpeechRecognizer do Google. No iOS, é o Speech framework da Apple. Esses motores são integrados ao sistema operacional e funcionam localmente — nenhum dado sai do telefone.
As vantagens são claras:
- Gratuito: Sem custo por segundo, sem limite de requisições, sem surpresas na fatura.
- Local: Os dados de voz permanecem no dispositivo. Perfeito para a privacidade.
- Rápido: Sem latência de rede. A transcrição começa quase instantaneamente.
- Offline: Funciona mesmo sem conexão com a internet (com os modelos baixados).
Mas há limites. O STT nativo não foi projetado para casos de uso profissionais. A pontuação é frequentemente ausente ou aproximada. A precisão diminui significativamente em um ambiente ruidoso. E para o português com sotaques (brasileiro, africano, etc.), os resultados variam muito.
O que o Deepgram oferece a mais?
Deepgram é um serviço de STT em nuvem especializado. Seu modelo Nova-2 é treinado em bilhões de horas de áudio e oferece uma precisão notável. Veja o que o distingue do STT nativo:
- Pontuação automática: As frases são pontuadas corretamente, o que torna os memorandos imediatamente legíveis.
- VAD (Voice Activity Detection): O Deepgram detecta quando tu falas e quando fazes uma pausa. Sem transcrição de ruído ambiente.
- Streaming WebSocket: O áudio é transcrito em tempo real via WebSocket, palavra por palavra. O usuário vê o seu ditado aparecer progressivamente.
- Multi-idiomas nativo: O português, inclusive com sotaques, é bem suportado.
- Endpointing inteligente: O Deepgram sabe quando tu terminaste de falar, o que aciona o processamento LLM no momento certo.
O custo? Cerca de $0.0043 por minuto de áudio em streaming. Parece pouco, mas para um aplicativo de voz onde cada interação dura de 10 a 30 segundos, isso se soma rapidamente com centenas de usuários ativos.
Como projetei a arquitetura dual no TAMSIV?
O objetivo era claro: oferecer dois motores STT intercambiáveis, sem que o código da interface precisasse saber qual estava em execução. O padrão é o da abstração — uma interface comum, duas implementações.
No frontend (React Native), exponho uma interface unificada:
// Interface comum
interface STTEngine {
start(): void;
stop(): void;
onResult(callback: (text: string) => void): void;
onError(callback: (error: Error) => void): void;
}
// Duas implementações
class NativeSTTEngine implements STTEngine { ... }
class DeepgramSTTEngine implements STTEngine { ... }
A escolha do motor é determinada por dois fatores:
- O plano do usuário: Free → nativo, Pro/Team → Deepgram (configurável).
- A configuração do administrador: Via a tabela
app_configno Supabase, posso forçar um motor para todos os usuários. Útil para testes A/B ou em caso de problema com um provedor.
Os componentes da UI (o Gravador de Voz, a tela de conversação) não sabem qual motor está em execução. Eles chamam start(), stop() e recebem texto. Este é o princípio de responsabilidade única aplicado ao pipeline de voz.
Quais são os resultados da comparação em condições reais?
Testei os dois motores em três cenários concretos, com o mesmo conteúdo ditado em português:
| Cenário | STT nativo | Deepgram |
|---|---|---|
| Ambiente calmo | ~92% | ~98% |
| Ruído de fundo (café, rua) | ~75% | ~94% |
| Português com sotaques | ~80% | ~95% |
| Ditado rápido (>150 palavras/min) | ~70% | ~93% |
O veredito é claro: o Deepgram é objetivamente superior em todos os cenários. A diferença é particularmente acentuada em ambientes ruidosos e com sotaques. A pontuação automática do Deepgram é uma enorme vantagem para os memorandos de voz — um memorando sem pontuação é um bloco de texto difícil de reler.
Mas — e esta é a nuance importante — para ditar uma tarefa curta ("Comprar leite amanhã de manhã"), o STT nativo é suficiente. Em um ambiente calmo, 92% de precisão em uma frase de 5 palavras funciona. O usuário sempre pode editar o texto após a criação por voz.
Como esta arquitetura serve ao modelo econômico?
A arquitetura dual não é apenas uma proeza técnica — é uma escolha de negócios. Ela permite três coisas:
- Um plano Free viável: O usuário gratuito pode usar a voz sem que isso me custe nada em STT. O custo é zero porque o processamento é local.
- Um argumento para o premium: "Tu queres maior precisão, especialmente no ruído? Torna-te Pro." O usuário que experimentou o nativo e quer algo melhor tem uma razão concreta para pagar. É o mesmo princípio que aplico às assinaturas RevenueCat.
- Um fallback de segurança: Se o Deepgram tiver uma falha (o que acontece), posso alternar todos os usuários para o nativo alterando um valor em
app_config. Nenhuma atualização do aplicativo é necessária. É o mesmo padrão de fallback que uso para o LLM via OpenRouter.
Quais são as dificuldades técnicas da integração do STT nativo no React Native?
Integrar o STT nativo no React Native não é trivial. Aqui estão os problemas que encontrei:
- APIs diferentes Android/iOS: O SpeechRecognizer do Android e o Speech framework do iOS têm APIs completamente diferentes. A biblioteca React Native que uso abstrai algumas dessas diferenças, mas não todas.
- Gerenciamento do ciclo de vida: No Android, o SpeechRecognizer deve ser limpo corretamente quando o aplicativo vai para o segundo plano. Caso contrário, ele continua a ouvir e consome bateria. Tive que adicionar listeners no AppState para gerenciar isso.
- Timeout de segurança: O STT nativo pode ficar preso no estado "listening" indefinidamente. Adicionei um timeout de 30 segundos (o mesmo padrão que no AudioPlayerService) com limpeza automática.
- Sem streaming confiável: Ao contrário do Deepgram, que envia as palavras progressivamente, o STT nativo retorna resultados parciais que podem ser contraditórios. Tive que implementar um debounce para evitar o "flickering" do texto exibido.
Como configurar a escolha do STT remotamente sem implantar?
Uma das vantagens desta arquitetura é a configurabilidade remota. No Supabase, tenho uma tabela app_config que armazena parâmetros globais do aplicativo. A escolha do motor STT é um deles.
Quando o aplicativo inicia, ele lê a configuração do Supabase (ou do cache, graças ao ContentCacheService). Se a configuração disser "nativo para todos", mesmo os usuários Pro usam o nativo. Isso é útil em vários casos:
- Falha do Deepgram: Alternar instantaneamente sem atualização.
- Testes A/B: Comparar as métricas de retenção entre os dois motores em um painel de usuários.
- Redução temporária de custos: Se o orçamento da nuvem estiver apertado em um determinado mês, posso desativar o Deepgram temporariamente.
O painel de administração exibe as métricas de uso por motor STT, o que permite tomar decisões informadas.
Qual é o futuro do STT em aplicativos móveis?
O cenário do STT está evoluindo rapidamente. O Whisper da OpenAI democratizou os modelos STT de código aberto de alta qualidade. Projetos como whisper.cpp permitem executar o Whisper diretamente no celular, com uma qualidade próxima ao Deepgram e custo zero na nuvem.
Estou acompanhando de perto essa evolução. No dia em que um modelo Whisper rodar bem o suficiente em um smartphone padrão com suporte para português em tempo real, o STT em nuvem se tornará opcional para todos. Enquanto isso, a arquitetura dual que implementei está perfeitamente posicionada para integrar um terceiro motor sem tocar nos componentes da UI.
FAQ
O STT nativo funciona offline?
Sim, desde que o modelo de idioma esteja baixado no dispositivo. No Android, o Google oferece o download de modelos de voz nas configurações. No iOS, os modelos geralmente já estão presentes. A qualidade offline é ligeiramente inferior à versão online.
O Deepgram é o melhor serviço de STT em nuvem?
O Deepgram Nova-2 está entre os melhores em termos de custo-benefício. O Google Cloud Speech-to-Text e o AWS Transcribe são alternativas sérias. Escolhi o Deepgram pela sua API WebSocket nativa e sua cobrança por segundo (não por minuto).
O usuário pode escolher o seu motor STT?
Atualmente, a escolha está ligada ao plano (Free = nativo, Pro = Deepgram). Futuramente, pretendo adicionar um botão nas configurações para que o usuário Pro possa escolher o nativo se preferir a privacidade local.
Como gerenciar idiomas além do português?
TAMSIV suporta 6 idiomas. O STT nativo e o Deepgram suportam ambos esses idiomas. A detecção do idioma é baseada nas configurações do aplicativo (sem detecção automática), o que evita confusões entre idiomas próximos.
O STT nativo consome muita bateria?
Menos do que o STT em nuvem, pois não há transferência de rede. Mas o processamento local usa o processador do telefone. Em um ditado curto (30 segundos), o impacto é insignificante. Em um ditado longo (mais de 5 minutos), o STT nativo pode consumir mais bateria do que o da nuvem, pois o processador funciona continuamente.