Aurora
Um estúdio de treino vocal para mulheres trans, na web e no iOS.
- Expo
- React Native
- Swift
- TanStack Start
- Web Audio (AudioWorklet)
- Fastify
- Drizzle
- PostgreSQL
- Better Auth
- OpenAI
Visão geral
Pitch em tempo real, leitura guiada com feedback ao vivo, check-ins de voz comparados a uma linha de base e conversas faladas com IA para levar a voz treinada a situações do dia a dia. Um único motor de áudio em TypeScript, testado, roda no navegador e no iPhone.
Contexto
Para muitas mulheres trans, o treino vocal é parte importante da transição, e a maior parte dele acontece sozinha: um app de afinador, gravações e muita dúvida sobre se está funcionando.
Aurora é um estúdio de prática em português: mede o pitch ao vivo, guia sessões de leitura, compara check-ins com uma linha de base pessoal e permite ensaiar situações reais, como pedir um café ou atender uma ligação, numa conversa falada com IA.
O que construí
- Um motor de captura de voz em TypeScript puro: energia, suavização de pitch, correção de saltos de oitava, contorno da sessão, tempo de voz e segmentação de trechos. O detector de pitch é injetado, então o pacote não tem dependências.
- O navegador alimenta o motor por um AudioWorklet e o iPhone pelo gravador nativo. O app web é um PWA instalável com shell offline.
- Extras de iOS em Swift: uma Live Activity na Dynamic Island que mostra o pitch e áudio em segundo plano com um pequeno módulo Expo.
- Conversa falada: segurar para falar, transcrição preparada com o vocabulário da cena e resposta em streaming.
- Privacidade por padrão: as gravações ficam no aparelho, o áudio só sai com consentimento explícito e a conta pode ser excluída no próprio app.
Decisões principais
01Toda a matemática de voz num pacote puro
Web e mobile só fornecem os frames de áudio; todo o resto é compartilhado. Roda no CI sem microfone e concentra a maior parte dos testes.
02De curso para estúdio
A primeira versão era uma trilha de aulas com XP. Depois de escrever design docs e pesquisar o mercado, mudei para ferramentas de prática que dá para usar todo dia, e cortei o que não servia a isso.
03Voz por turnos em vez de fala em tempo real
Transcrição seguida de resposta em texto por streaming é mais barata e muito mais controlável do que um modelo de voz em tempo real.
04Expo com módulos nativos pontuais
Fiz um protótipo em SwiftUI e depois mantive o Expo, escrevendo Swift só onde a plataforma exigia: a Live Activity e o áudio em segundo plano.
05Um rate limit que não dá para burlar
A camada de autenticação reescreve o header de IP com o endereço que o servidor de fato resolveu, então forjar o X-Forwarded-For não zera o limite. Tem teste para isso.
O que foi difícil
Vozes reais são bagunçadas. Respiração, silêncio e o detector pulando uma oitava parecem dado. A maior parte do trabalho do motor é decidir em que não confiar, e os testes registram esses casos.
Projetar para um público sensível: sequências que podem ser pausadas sem culpa, gravações que ficam no aparelho por padrão e consentimento explícito antes de qualquer áudio sair dele.