OSS · CLI em Python + Streamlit

speech-habit-lens

Reescrevemos o roteiro. Ignoramos a voz.

Um discurso de 1 minuto, três camadas de análise: os 20 parâmetros ESAS do AmiVoice no tempo, o texto reconhecido e a camada cruzada que aponta onde voz e palavras se descolam. Toda observação precisa citar tempo, parâmetro e trecho.

Ver no GitHub Relatório de amostra (Stallman 60s) →

  • Hábitos em um minuto Análise em 3 camadas com um comando
  • Robusto a ruído de reconhecimento ESAS independe do idioma: a camada acústica corta mesmo assim
  • Descolamento voz × palavra à mostra A camada cruzada nomeia: "a energia cai logo antes da conclusão"
  • Alucinações contidas Toda alegação precisa citar tempo + parâmetro + trecho
  • Open Source · MIT
  • CLI + Streamlit UI
  • 20 parâmetros ESAS, todos verificados
  • Criado por Ken Imoto
Demo no terminal: saída de ajuda do shl, seguida do relatório em Markdown de uma análise real de um discurso de 60 segundos do Stallman com padrões de correlação voz × palavras citando tempo, parâmetro e trecho

Dois comandos

  1. shl analyze speech.wav --out report.md Reconhece o áudio, extrai ESAS, roda três camadas Claude e escreve um relatório Markdown com evidência: 3-4 minutos de ponta a ponta.
  2. shl serve Sobe a UI Streamlit em localhost:8501 com gravação por microfone no navegador, séries temporais Plotly e cartões da camada cruzada.
  3. --model claude-opus-4-7 Troca o modelo por execução: Sonnet 4.6 (padrão), Opus 4.7 para os padrões cruzados mais difíceis, Haiku 4.5 para cortar custo.

Para quem é

  • Palestrantes e fundadores auditam o pitch que vão dar — antes de a plateia estar olhando
  • Product managers acham a frase em que a atualização deixa de aterrissar e ajustam só ela
  • Coaches e educadores sustentam o feedback com evidência medida em vez de "você soou meio apagado"
  • Engenheiros curiosos veem os próprios hábitos de fala como um instrumento os vê, em um minuto de áudio

Quando usar

  • Ao ensaiar um pitch ou uma talk: ouça o hábito de abertura antes de ir ao ar
  • Depois de uma demo que caiu: ache o momento em que a voz ficou para trás das palavras
  • Ao treinar um palestrante: troque impressão por relatório com timestamp e citação de parâmetro
  • Ao auditar a própria fala: leitura mensal dos hábitos que você não sabia que tinha

Instalação

git clone https://github.com/kenimo49/speech-habit-lens
cd speech-habit-lens
pip install -e .

cp .env.example .env   # AMIVOICE_API_KEY + ANTHROPIC_API_KEY

Precisa de uma chave da API AmiVoice (grátis até 60 minutos por mês) e de uma chave da API Anthropic. Uma análise custa cerca de ¥18 de uso do Claude Sonnet — algo como 60 execuções por mês por ¥1.080.

As três camadas

  • Camada acústica: séries temporais dos 20 parâmetros ESAS — curva de tensão, viés de entonação, energia de abertura, queda no encerramento
  • Camada de texto: preenchimentos, posição da conclusão, palavras repetidas, fluxo lógico do transcript reconhecido
  • Camada cruzada: correlações corpo–linguagem, como "a energia vocal cai logo antes da conclusão"
  • Regra de grounding: toda alegação precisa citar tempo, parâmetro e trecho, o que suprime observações alucinadas
  • ESAS independe do idioma: os hábitos acústicos aparecem nítidos mesmo com reconhecimento de texto cheio de erros
  • Os 20 nomes de campo do ESAS foram medidos contra a API real (a doc oficial lista só 5 exemplos)
  • UI Streamlit: gravação por microfone no navegador, séries temporais interativas em Plotly, cartões da camada cruzada, download do relatório Markdown

Medido em 4 pitches

A mesma ferramenta em quatro clipes de 60 segundos: Jobs, Son (SoftBank), Nishino e Ochiai. Os números abaixo são os picos que a própria ferramenta imprimiu.

métricaJobs (fecho)Son (abertura)Nishino (abertura)Ochiai (abertura)
pico de energy21443239
pico de concentration10010090100
pico de anticipation681003591
pico de emo_cog207136276244
pico de passionate64118
posição da conclusãobackfrontmiddleback
preenchimentos"ne" ×1"ne" ×1"chotto" ×5"ano" ×1
confidence do reconhecimento0,74–0,890,99–1,000,93–1,000,70–0,82

Um único indicador não decide se você fala bem: o pico de energy do Jobs é 21, o do Son é 44, e os dois aterrissam. O que a ferramenta mostra é onde mora o hábito de cada um: os cinco "chotto" do Nishino, o pitch do Son totalmente na abertura, a confidence do Ochiai caindo a 0.70 enquanto o padrão acústico segue intenso. Não é a nota; é o hábito específico nomeado na linha do tempo.

As duas coisas que a impressão perde

Estes são os dois pontos que a ferramenta traz à tona toda vez e que a impressão não pega.

Descolamento na abertura

anticipation 65 × energy 2

Abertura do Stallman: antecipação máxima, energia vocal mínima. A cabeça já avançou; a voz ainda não saiu do chão. A impressão chama isso de "ele parecia nervoso" — a ferramenta nomeia o segundo específico.

passionate fica plana

pico de passionate ≤ 11 nos 4 pitches

Em Jobs, Son, Nishino e Ochiai, o pico de passionate no ESAS nunca passa de 11. Emoção que aterrissa não sai como "paixão". Sai como anticipation, concentration e balanço de entonação — que é onde a camada cruzada olha.

Uso

# análise: reconhecimento → ESAS → Claude × 3 camadas → relatório Markdown
shl analyze examples/sample.wav --out report.md

# escolher o modelo Claude por execução
shl analyze examples/sample.wav --model claude-opus-4-7 --out report.md

# UI no navegador com gravação por microfone em localhost:8501
shl serve

Interface web

shl serve sobe uma UI em Streamlit em localhost:8501: grave pelo microfone do navegador ou arraste um .wav, explore a série temporal ESAS de forma interativa no Plotly, abra os cartões da camada cruzada e baixe o relatório em Markdown. As chaves de API são lidas do .env no lado do servidor e nunca chegam ao navegador.

UI web em Streamlit após uma análise real do discurso de amostra de 60 segundos: gráfico interativo da série temporal ESAS com parâmetros selecionáveis ao lado do transcript reconhecido

O que execuções reais retornam

Três padrões que a ferramenta pegou em discursos reais. Toda linha vem com tempo + parâmetro + trecho.

  • Abertura do Stallman (0.0s, anticipation=65, energy=2, confidence=15): antecipação máxima com energia vocal mínima. Uma arrancada que não sai do chão — o segundo específico que a impressão traduz por "ele estava meio fora do lugar"
  • intensive_thinking=62 × energy=3: os momentos de pensamento mais denso coincidem com a menor saída vocal. Presente em toda talk longa que a ferramenta já rodou
  • passionate=0 fluente: as palavras não param, o passionate do ESAS fica em zero. Fluente porém apagado — falha comum de pitches muito ensaiados, só visível na camada cruzada

A ferramenta é espelho, não coach. Ela nomeia o hábito na linha do tempo; o que fazer com isso é seu.

v0.2, construído para o Zennfes Spring 2026. Duração recomendada 30-90 segundos (o tier gratuito do AmiVoice é de 60 minutos/mês). A análise leva cerca de 3-4 minutos de ponta a ponta. A semântica dos parâmetros ESAS vem de medições mais a lista oficial de parâmetros; trate os achados da camada cruzada como dicas de coaching, sem valor de medição clínica.

Por que esta ferramenta existe

Quase todo feedback sobre fala fica no plano da impressão: "você pareceu nervoso", "o fecho ficou fraco", "perdi você no meio". Quando a impressão vira palavra, o segundo específico que a produziu já se perdeu. As três camadas aqui existem para segurar esse segundo: a acústica mede independente de você ter reconhecido as palavras, a de texto registra o que foi de fato dito e a cruzada alinha as duas para que um hábito vire citação, não vibe. Debugue a entrega do jeito que você debuga código.

Ao lado do Whisper e do pyAudioAnalysis

Trabalhos diferentes. O Whisper transcreve; o pyAudioAnalysis classifica frames acústicos. speech-habit-lens fica na camada de cima: alinha uma série temporal emocional por parâmetro com o transcript e pede ao LLM que nomeie o hábito, sob uma regra estrita de citação.

speech-habit-lensWhisperpyAudioAnalysis
O que responde Qual é o meu hábito de entrega, segundo a segundo? O que o palestrante disse? A que classe acústica pertence este frame?
Série temporal emocional ✓ 20 parâmetros ESAS alinhados aos segundos Features acústicas construídas à mão
Camada cruzada voz × palavras ✓ LLM com citações fundamentadas
Guarda contra alucinações ✓ Regra de grounding (tempo + param + trecho) n/a (só transcript) n/a (só classificador)
UI web ✓ Streamlit + microfone do navegador
Licença MIT MIT Apache-2.0

O travessão indica que a ferramenta não oferece aquela superfície fora da caixa. speech-habit-lens fica em cima de um motor de transcript e de um sinal acústico (AmiVoice ESAS neste build); troque qualquer camada de cima e a análise cruzada continua rodando.

FAQ

Quais chaves de API preciso?

Chave da API AmiVoice (grátis até 60 minutos por mês) para reconhecimento e ESAS, mais chave da API Anthropic para a análise LLM em 3 camadas. Uma análise custa cerca de ¥18 de uso do Claude Sonnet 4.6; conte com ~¥1.080 por mês se você rodar cerca de 60 clipes.

De quanto tempo o clipe pode ser?

Entre 30 e 90 segundos é o ponto ideal. Clipes acima de 120 segundos são rejeitados e clipes acima de 60 disparam aviso, tudo para proteger o tier gratuito do AmiVoice. A ferramenta foi feita para a janela de observação de tamanho de pitch, não para talks completas.

Com quais idiomas funciona?

A camada de texto usa o motor japonês do AmiVoice por padrão, então a análise textual é mais forte em japonês. O ESAS independe do idioma, então a camada acústica e a camada cruzada rodam em qualquer idioma — reconhecimento ruidoso não estraga elas.

Os 20 parâmetros ESAS são reais? Como foram verificados?

A doc oficial do AmiVoice lista só 5 exemplos. Os 20 nomes de campo foram medidos contra a API real em maio e re-verificados contra o endpoint da lista de parâmetros em junho de 2026. Cada faixa de valores está documentada nos templates de prompt, então o LLM não consegue inferir valores fora de faixa.

Como a regra de grounding barra alucinação?

O prompt de cada camada exige que toda alegação cite tempo, parâmetro e trecho. A evidência de três pontos segue como JSON estruturado para a próxima camada, e a cruzada herda a mesma regra: sem citação, sem alegação. Achados sem evidência são descartados pelo parser.

Qual modelo Claude devo usar?

Sonnet 4.6 é o padrão e sustenta os estudos de caso. Opus 4.7 vale a pena para os padrões cruzados mais duros, com custo cerca de 3× maior. Haiku 4.5 é a opção de corte de custo quando você só quer triagem rápida — escolha por execução com --model.

E modelos locais ou reconhecimento on-device?

A v0.2 é cloud-first (AmiVoice + Anthropic). Trocar o sinal acústico por um ESAS local equivalente ou a camada de texto por um Whisper local não vem no pacote, mas é a extensão natural: a camada cruzada é agnóstica de modelo.

É medida clínica?

Não. Trate os achados da camada cruzada como dicas de coaching, sem valor de medição clínica. A semântica dos parâmetros veio de medições mais a lista de parâmetros do fornecedor, e o contexto de coaching (qual hábito vale a pena consertar) fica com você — a ferramenta nomeia o hábito e cita o segundo.

Sobre o autor

Criado por Ken Imoto: mais de 300 artigos técnicos em Zenn, Qiita, Dev.to e neste site, mais de 40 livros em 4 idiomas, mais de 400 mil pageviews em Zenn e Qiita, 4 artigos de pesquisa no Zenodo e criador do LLMO Framework.

Ferramentas relacionadas para devs

Todos os produtos →

← Todos os produtos