Blog
Build in Public
28 de março de 20269 min

Personalização vocal com IA: o seu assistente finalmente conhece-o

Um assistente de voz que não te conhece é uma ferramenta. Um assistente que sabe que você tem três filhos, que gerencia uma equipe de campo e que "a coisa" significa o pedido de material de terça-feira — isso é um parceiro. A dois dias do lançamento público do TAMSIV, adicionei a personalização vocal: configure sua IA pela voz, escolha sua voz TTS entre 6 opções, e o assistente se adapta ao seu contexto. 1800 linhas de código, um bug WebSocket memorável e uma reflexão profunda sobre o que faz a diferença entre um assistente genérico e um assistente pessoal.

Pontos-chave a reter:
- A personalização por contexto vocal transforma um assistente genérico em uma ferramenta pessoal — o usuário fala naturalmente, a IA compreende as referências implícitas.
- A escolha da voz TTS é íntima: oferecer 6 opções com pré-visualização em tempo real aumenta o apego ao aplicativo.
- Quando duas telas compartilham o mesmo WebSocket, um sistema de "proprietário ativo" evita conflitos de callbacks.
- A personalização da IA é uma alavanca de monetização natural para um modelo freemium (contexto básico gratuito, completo no Pro).
Pessoa falando em um smartphone com visualização de ondas sonoras coloridas
Configurar sua IA pela voz: falar sobre si mesmo para que o assistente compreenda seu dia a dia.

Por que a personalização muda fundamentalmente a experiência de um assistente de voz?

Desde outubro, a IA do TAMSIV compreendia o que você dizia. Ela criava tarefas, memorandos, eventos de agenda. Ela respondia educadamente. Mas ela não te conhecia.

Você podia dizer a ela "lembre-me de comprar leite" e ela o fazia. Mas se você dissesse "lembre-me da coisa para as crianças", ela não sabia que você tinha filhos, nem quantos, nem o que "a coisa" significava no seu dia a dia. Essa é a diferença fundamental entre uma ferramenta de comando de voz e um assistente pessoal.

As pesquisas do Nielsen Norman Group sobre personalização mostram que interfaces personalizadas aumentam o engajamento em 40% em média. Para um assistente de voz, o impacto é ainda maior: a personalização elimina a necessidade de explicitar tudo em cada interação.

Foi essa reflexão que me levou a adicionar essa funcionalidade a dois dias do lançamento. Risco? Sim. Mas sem isso, o TAMSIV teria sido "apenas mais um assistente de voz". Com isso, ele se torna seu assistente de voz.

Como funciona a configuração da IA por voz?

Um novo botão apareceu na tela do gravador de voz: "Configurar minha IA". Você aperta, fala e explica quem você é.

"Sou pai de 3 filhos, gerencio uma equipe de 4 pessoas em uma empresa de limpeza e esqueço tudo o que me dizem depois de 30 segundos."

A IA escuta através do pipeline de voz, transcreve e depois resume seu contexto em alguns pontos estruturados. Esse resumo é armazenado em seu perfil Supabase e injetado no system prompt a cada conversa.

O processo técnico em detalhes

  1. Captura de voz: o mesmo STT nativo do gravador de voz principal (com fallback Deepgram se necessário).
  2. Extração de contexto: um LLM via OpenRouter analisa a transcrição e extrai informações estruturadas (situação familiar, profissão, hábitos, preferências).
  3. Armazenamento: o contexto é salvo no perfil do usuário via Supabase, não localmente — ele acompanha o usuário em todos os seus dispositivos.
  4. Injeção: a cada nova conversa WebSocket, o contexto é adicionado ao system prompt do LLM. A IA "sabe" quem você é desde a primeira palavra.

A partir daí, cada resposta é adaptada. Se você fala de "o pequeno", ela sabe que você está falando do seu filho. Se você diz "o canteiro de obras de terça-feira", ela sabe que você gerencia intervenções de campo. Essa é a diferença entre um assistente genérico e um assistente que te conhece.

Por que oferecer 6 vozes TTS e como escolher a certa?

Seis alto-falantes dispostos em círculo emitindo luzes de cores diferentes representando diferentes timbres de voz
Cada usuário tem uma preferência de voz — a escolha é pessoal e afeta diretamente o apego ao aplicativo.

A voz é íntima. Ouvir a mesma voz robótica 50 vezes por dia acaba irritando. Pior: uma voz que você não gosta cria uma fricção inconsciente a cada uso. Você evita usar o aplicativo, sem saber exatamente por quê.

Adicionei um seletor de voz TTS com 6 opções diferentes — masculinas, femininas, tons variados. As 6 vozes vêm do OpenAI TTS (modelo Nova por padrão), que oferece a melhor qualidade natural do mercado para síntese de voz.

A experiência de seleção

Você toca em uma voz, ouve uma pré-visualização em tempo real ("Olá, sou seu assistente TAMSIV..."), e escolhe. É armazenado em seu perfil e usado para todas as respostas de voz. A mudança é instantânea — não é necessário reiniciar o aplicativo ou reconectar o WebSocket.

Este detalhe de UX parece menor, mas tem um impacto mensurável. De acordo com pesquisas da Voicebot.ai, usuários que escolhem sua voz de assistente o utilizam 60% mais frequentemente do que aqueles que mantêm a voz padrão. A escolha cria um sentimento de apropriação.

Como resolver um conflito WebSocket entre duas telas que compartilham o mesmo canal?

Desenvolvedor depurando código em duas telas à noite com logs de conexão WebSocket
3 horas de depuração para um conflito de callbacks entre duas telas compartilhando o mesmo WebSocket.

O bug que custou 3 horas. A tela de configuração da IA e o ditafone compartilham o mesmo canal WebSocket para o backend. Quando você testa sua voz na configuração, o ditafone em segundo plano também tentava processar os callbacks de áudio. Resultado: as duas telas se atropelavam.

Concretamente, o que acontecia era o seguinte:

  1. O usuário abre a tela de configuração da IA.
  2. Ele testa uma voz TTS — o backend envia o áudio via WebSocket.
  3. O ditafone em segundo plano também recebe o callback de áudio.
  4. As duas telas tentam reproduzir o mesmo som simultaneamente.
  5. Em alguns modelos Android onde o garbage collector é agressivo, o AudioPlayerService trava silenciosamente.

A solução: sistema de "proprietário ativo"

Quando a tela de configuração é aberta, ela assume o controle exclusivo do WebSocket. O ditafone espera sua vez. O padrão é simples:

  • Um flag activeOwner: 'dictaphone' | 'setup' | null no estado global.
  • Cada callback WebSocket verifica o proprietário antes de processar a mensagem.
  • A transição de propriedade é atômica — sem janela onde as duas telas escutam.

Simples na teoria, 3 horas de depuração na prática. O conflito só se manifestava em alguns dispositivos, o que dificultava a reprodução. É o tipo de bug que você só encontra testando em dispositivos reais — não em um emulador.

Como integrar a personalização em um modelo freemium?

A personalização da IA agora faz parte das funcionalidades diferenciadoras nos planos de assinatura RevenueCat:

  • Plano gratuito: contexto básico (nome, idioma). A IA sabe seu nome, é tudo.
  • Plano Pro: contexto completo (situação pessoal, profissão, hábitos) + escolha de voz TTS. A IA realmente te conhece.
  • Plano Team: tudo do Pro + contexto de grupo (equipe, projetos, terminologia de negócios). A IA conhece sua equipe.

É uma alavanca de monetização natural. A personalização é a funcionalidade que cria o maior apego — uma vez que sua IA te conhece, você não quer mais voltar para um assistente genérico. É exatamente o tipo de feature gate que a estratégia freemium para aplicativos de produtividade recomenda.

Qual é o impacto na arquitetura de backend?

A adição da personalização exigiu 1800 linhas de código distribuídas entre o frontend e o backend. No lado do backend Node.js, as principais modificações:

  • System prompt dinâmico: o contexto do usuário é carregado do Supabase a cada conexão WebSocket e injetado no prompt. Cache em memória para evitar uma chamada de DB a cada mensagem.
  • Endpoint de pré-visualização TTS: um novo endpoint WebSocket dedicado às pré-visualizações de voz, isolado do fluxo de conversação principal.
  • Validação de contexto: o LLM que extrai o contexto filtra informações sensíveis (números, endereços) — apenas informações estruturais são mantidas.

O sistema de histórico de conversas também foi atualizado para incluir o contexto nos metadados — o que permite ver quando e como o contexto foi modificado.

Mais de 730 commits, a dois dias do lançamento: era o momento certo para esta funcionalidade?

Foi a última funcionalidade antes do lançamento público. O aplicativo agora sabe com quem está falando. Resta o polimento final, os últimos testes nos dispositivos dos beta-testers e o grande salto.

Adicionar uma funcionalidade importante a dois dias do lançamento é arriscado. Mas a personalização é o tipo de funcionalidade que transforma a experiência completa do aplicativo. Sem ela, o TAMSIV teria sido uma boa ferramenta de voz. Com ela, é um assistente que te conhece. E é isso que fará a diferença em relação a alternativas como o Todoist.

Perguntas frequentes

Os dados de personalização são seguros?

Sim. O contexto é armazenado no Supabase com as mesmas políticas RLS (Row Level Security) que todos os dados do usuário. Somente o usuário autenticado pode ler ou modificar seu contexto. O LLM que extrai o contexto filtra automaticamente as informações sensíveis (números de telefone, endereços) — apenas as informações estruturais são mantidas.

É possível modificar ou excluir o contexto após configurá-lo?

Sim, a qualquer momento. O botão "Configurar minha IA" permite regravar um novo contexto que substitui o antigo. Um botão "Redefinir" exclui completamente o contexto e retorna ao modo de assistente genérico.

Por que OpenAI TTS em vez de Google ou Azure para síntese de voz?

Depois de testar os três, o OpenAI TTS (modelo Nova) oferece a voz mais natural em francês. O Google TTS é bom, mas ligeiramente mais robótico. O Azure é excelente em inglês, mas menos convincente em francês. O custo é comparável (~0.015 EUR/1000 caracteres para OpenAI).

O conflito WebSocket pode se repetir com outras telas?

O sistema de proprietário ativo é genérico — ele protege contra qualquer conflito entre telas que compartilham o mesmo canal. Se uma futura tela precisar do WebSocket, basta adicionar um valor ao tipo activeOwner e respeitar o protocolo de aquisição/liberação.

A personalização funciona em todos os idiomas suportados?

Sim. A extração de contexto usa um LLM multilíngue via OpenRouter. Você pode configurar sua IA em francês, inglês, alemão, espanhol, italiano ou português — o contexto é armazenado no idioma em que você o ditou e usado como está no system prompt.