1

[PITCH] Abri como API a avaliação de pronúncia do meu app: nota por som, e um campo para dizer quando NÃO corrigir

Oi! Sou o Nik, faço o TonePerfect, um app de pronúncia (então sim, é um projeto meu). Abri a parte que avalia a pronúncia como uma API e queria mostrar como ela funciona por dentro e ouvir a opinião de vocês.

Demo ao vivo, sem cadastro: https://api.toneperfect.app (aperta "Record yourself", lê a frase e vê o JSON).

O que ela faz

Só fala lida (scripted speech): você manda o áudio e o texto que a pessoa deveria ler. Não é speech-to-text e não avalia fala livre. Saber o texto de antemão é o que permite comparar som por som o que era esperado com o que foi ouvido.

curl https://api.toneperfect.app/v1/assess \
  -H "Authorization: Bearer $TONEPERFECT_API_KEY" \
  -H "Idempotency-Key: licao-42-tentativa-1" \
  -F "audio=@ola.wav" \
  -F "text=Olá, tudo bem?" \
  -F "language=pt-BR"

A resposta vem em três níveis já ligados entre si: nota da frase, nota de cada palavra (com start_ms/end_ms para tocar de novo só aquele trecho) e cada som com expected, heard e uma nota. Em mandarim cada sílaba é avaliada em inicial, final e tom separados, e o sandhi do 3º tom (3-3 vira 2-3) é levado em conta, para não marcar como erro algo que está certo.

Decisões técnicas que talvez interessem

  • Nota não é decisão. A nota de 0 a 100 é para mostrar ao usuário. Para corrigir ou não, cada palavra (e cada inicial/final/tom no mandarim) vem com decision: review, uncertain ou no_correction. Corrigir errado quem falou certo irrita muito, então o padrão é ficar quieto quando a dúvida é grande.
  • Retry seguro com Idempotency-Key. Upload de áudio em celular falha muito. Com a mesma chave você reenvia sem pagar duas vezes; o resultado fica guardado no máximo 24 h só para isso.
  • Áudio é apagado depois da avaliação e não é usado para treino.
  • Chaves de teste (tp_test_) devolvem um resultado fixo de exemplo, não gastam crédito e podem ficar no código do navegador para montar a interface.
  • Cobrança por 15 s de áudio iniciados; requisições que falham ou que não dá para avaliar não custam nada.
  • Especificação em OpenAPI 3.1: https://api.toneperfect.app/openapi.json

Limites (para ser honesto)

São 10 idiomas (mandarim, inglês, francês, espanhol, alemão, italiano, português, russo, coreano, japonês) e todos os pacotes estão marcados como experimentais; coreano e japonês ainda em beta. No japonês o acento de altura (pitch accent) não é avaliado, só os sons. O português é pt-BR.

Preço

Toda conta nova ganha 50 créditos grátis, sem cartão. Depois: US$ 10/mês (2.500 créditos), US$ 50 (15.000) ou US$ 150 (50.000).

Se alguém aqui faz app de idiomas, leitura para crianças ou treino de fala, queria muito saber o que falta, e se a nota discordar do seu ouvido na demo, me conta em qual frase 🙏

Carregando publicação patrocinada...
1

Uma dúvida sobre a Idempotency-Key: o que acontece se o cliente reaproveitar a mesma chave com outro áudio? Com chave montada pelo app, tipo licao-42-tentativa-1, é fácil um bug repetir a chave na tentativa seguinte, e aí a pessoa grava de novo e recebe a nota da gravação anterior. O Stripe compara os parâmetros e devolve erro quando a chave chega com corpo diferente. Pra áudio dava pra guardar um hash do arquivo junto da chave e fazer a mesma checagem.

Também ajudaria a doc dizer se requisição que falhou fica presa na chave ou se o reenvio processa de novo.