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
Dois comandos
-
shl analyze speech.wav --out report.mdReconhece 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. -
shl serveSobe a UI Streamlit em localhost:8501 com gravação por microfone no navegador, séries temporais Plotly e cartões da camada cruzada. -
--model claude-opus-4-7Troca 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
| métrica | Jobs (fecho) | Son (abertura) | Nishino (abertura) | Ochiai (abertura) |
|---|---|---|---|---|
| pico de energy | 21 | 44 | 32 | 39 |
| pico de concentration | 100 | 100 | 90 | 100 |
| pico de anticipation | 68 | 100 | 35 | 91 |
| pico de emo_cog | 207 | 136 | 276 | 244 |
| pico de passionate | 6 | 4 | 11 | 8 |
| posição da conclusão | back | front | middle | back |
| preenchimentos | "ne" ×1 | "ne" ×1 | "chotto" ×5 | "ano" ×1 |
| confidence do reconhecimento | 0,74–0,89 | 0,99–1,00 | 0,93–1,00 | 0,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.
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-lens | Whisper | pyAudioAnalysis | |
|---|---|---|---|
| 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
- rhythm-lens Measures the rhythm of Japanese, English and Portuguese Markdown (sentence-length burstiness, paragraph structure) against measured human/AI distributions from two published papers. A writing feedback instrument, not an AI detector.
- claude-shift Multi-account Claude Code manager. Switch the active login, sync the two-file auth Claude Code actually reads (~/.claude/.credentials.json + ~/.claude.json), and watch 5-hour and weekly usage across all accounts. CLI + local API + Chrome extension.
- opencut-mcp Servidor MCP que controla o OpenCut classic a partir de qualquer cliente MCP. Playwright mantém a sessão do editor; doze ferramentas expõem timeline, assets e pipeline de export. Roda contra um fork do OpenCut classic.
- mcp-scorecard Pre-flight checks for MCP servers: passive token footprint, use-case scoping, security, and name safety. LLM-facing quality scorecard.