Blog
AI/Voice
5 de março de 202610 min

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.

Pessoa falando em um smartphone com ondas sonoras visíveis, comparação entre nuvem e processamento local
A escolha entre STT em nuvem e nativo impacta a precisão, o custo e a privacidade.

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.

Microfone profissional com visualização de ondas de áudio flutuando no ar, iluminação neon azul e roxa
O Deepgram oferece qualidade de transcrição profissional, mas a um custo por segundo de áudio.

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:

  1. O plano do usuário: Free → nativo, Pro/Team → Deepgram (configurável).
  2. A configuração do administrador: Via a tabela app_config no 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.

Pessoa usando ditado de voz em seu telefone em um café barulhento
Em um ambiente ruidoso, a diferença entre STT nativo e em nuvem torna-se significativa.

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:

  1. 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.
  2. 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.
  3. 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.