Skip to content

feat: vocabulario de dominio, reconhecimento on-device e captura de debug#2

Open
jcelos wants to merge 1 commit intoDeveloperParana:mainfrom
jcelos:feat/on-device-and-vocabulary
Open

feat: vocabulario de dominio, reconhecimento on-device e captura de debug#2
jcelos wants to merge 1 commit intoDeveloperParana:mainfrom
jcelos:feat/on-device-and-vocabulary

Conversation

@jcelos
Copy link
Copy Markdown
Contributor

@jcelos jcelos commented Apr 18, 2026

Resumo

Três melhorias entrelaçadas pra qualidade da transcrição:

  • Vocabulário por sala + correção fuzzy. Dicionário de termos técnicos (IA, LLM, Claude, Next.js, etc.) editável via modal por sala. Engine pede N alternativas ao Web Speech, ranqueia por hits no vocabulário, e aplica correção fuzzy (Levenshtein) pós-reconhecimento. Filtro de ruído descarta finais curtos de baixa confidence (lista de fillers).
  • Reconhecimento on-device (Chrome 139+). Detecta SR.available e dispara SR.install dentro do callstack do click do usuário pra preservar transient activation — sem isso o Chrome lança SecurityError ("Requires handling a user gesture when availability is downloadable") e o install nunca acontece. Quando install resolve, troca cloud→local sem perder áudio. UI mostra badge On-device/Cloud e botão manual de retry quando o gesture expira.
  • Captura de debug. Botão na barra de controle grava áudio (.webm) + log estruturado de eventos do engine (alternativas, picked, corrigido, emitido, processLocally) em JSON. scripts/analyze-debug.mts cospe métricas de latência interim→final, hits do vocab, distribuição de confidence, drops por filtro de ruído, duplicação entre sessões.

Speech engine modularizado em lib/speech/{types,web-speech,index,debug-capture} pra permitir engines alternativos (Whisper, Deepgram, Vosk) no futuro sem mexer no chamador. Cursor rule (.cursor/rules/realtime-transcription.mdc) documenta caveats descobertos do API on-device e como rodar os probes E2E pra regredir mudanças no fluxo.

Validação

  • tsc --noEmit limpo, npm run build ok (176 kB no /sala/[code]/mestre).
  • Probe E2E contra Chrome 147 headless cobre 4 cenários do on-device, todos passando:
    • downloadable + install OK → badge On-device
    • available imediato → badge On-device sem chamar install
    • install rejeitado (gesture expirou) → botão Baixar modelo on-device
    • Chrome <139 sem SR.available → sem badge, sem crash
  • Debug captures reais (palestra, Chrome 135 cloud) confirmam latência p50 5.4s e p90 30s — alvo on-device <500ms.

Test plan

  • Em Chrome 139+: abrir sala, clicar no microfone, verificar badge Baixando modelo...On-device.
  • Falar termos técnicos do vocab base (Claude, LLM, Next.js) e conferir correção.
  • Editar vocabulário da sala via modal, recarregar, validar persistência via localStorage.
  • Clicar no botão de debug (alvo), gravar trecho, parar, conferir download do .webm + .json, rodar npx tsx scripts/analyze-debug.mts arquivo.json.
  • Em Chrome 135 (cloud): badge mostra Cloud; transcrição segue funcionando sem regressão.

…ebug

Tres melhorias entrelacadas pra qualidade da transcricao:

* Vocabulario por sala + correcao fuzzy: dicionario de termos tecnicos
  (IA, LLM, Claude, Next.js, etc.) editavel via modal por sala. Engine
  pede N alternativas ao Web Speech, ranqueia por hits no vocabulario,
  e aplica correcao fuzzy (Levenshtein) pos-reconhecimento. Filtro de
  ruido descarta finais curtos de baixa confidence (lista de fillers).

* Reconhecimento on-device (Chrome 139+): detecta SR.available e
  dispara SR.install dentro do callstack do click do usuario pra
  preservar transient activation. Sem isso o Chrome lanca SecurityError
  ("Requires handling a user gesture when availability is downloadable")
  e o install nunca acontece. Quando install resolve, troca cloud->local
  sem perder audio. Validado contra Chrome 147 headless via probe CDP
  com 4 cenarios (downloadable+OK, available, install-rejected, Chrome
  antigo). UI mostra badge "On-device"/"Cloud" e botao manual de retry
  quando o gesture expira.

* Captura de debug: botao na barra de controle grava audio (.webm) +
  log estruturado de eventos do engine (alternativas, picked, corrigido,
  emitido, processLocally) em JSON. scripts/analyze-debug.mts cospe
  metricas de latencia interim->final, hits do vocab, distribuicao de
  confidence, drops por filtro de ruido, duplicacao entre sessoes.
  Usado pra diagnosticar bugs de vocabulario e medir latencia real do
  cloud STT (~5s p50) vs alvo on-device (~500ms).

Speech engine modularizado em lib/speech/{types,web-speech,index,debug-capture}
pra permitir engines alternativos (Whisper, Deepgram, Vosk) sem mexer
no chamador. Cursor rule documenta caveats descobertos do API on-device
e como rodar os probes E2E pra regredir mudancas no fluxo.
@vercel
Copy link
Copy Markdown

vercel Bot commented Apr 18, 2026

@jcelos is attempting to deploy a commit to the sschonss' projects Team on Vercel.

A member of the Team first needs to authorize it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant