OSS · CLI en Python + Streamlit
speech-habit-lens
Reescribimos el guion. Ignoramos la voz.
Un discurso de 1 minuto, tres capas de análisis: los 20 parámetros ESAS del AmiVoice en el tiempo, el texto reconocido y la capa cruzada que señala dónde la voz y las palabras se desincronizan. Toda observación tiene que citar tiempo, parámetro y fragmento.
Ver en GitHub Informe de muestra (Stallman 60s) →
- Hábitos en un minuto Análisis en 3 capas con un comando
- Robusto al ruido de reconocimiento ESAS es independiente del idioma: la capa acústica corta igual
- Desincronía voz × palabras a la vista La capa cruzada la nombra: "la energía cae justo antes de la conclusión"
- Alucinaciones contenidas Toda afirmación tiene que citar tiempo + parámetro + fragmento
- Open Source · MIT
- CLI + Streamlit UI
- 20 parámetros ESAS, todos verificados
- Creado por Ken Imoto
Dos comandos
-
shl analyze speech.wav --out report.mdReconoce el audio, extrae ESAS, corre tres capas de Claude y escribe un informe Markdown con evidencia: 3-4 minutos de punta a punta. -
shl serveLanza la UI de Streamlit en localhost:8501 con grabación desde el micrófono del navegador, series temporales en Plotly y tarjetas de la capa cruzada. -
--model claude-opus-4-7Cambia el modelo por ejecución: Sonnet 4.6 (por defecto), Opus 4.7 para los patrones cruzados más difíciles, Haiku 4.5 para bajar el costo.
Para quién es
- Ponentes y fundadores auditan el pitch que van a dar antes de que la sala mire
- Product managers encuentran la frase donde la actualización deja de aterrizar y ajustan solo esa
- Coaches y educadores sustentan el feedback con evidencia medida en lugar de "sonaste un poco plano"
- Ingenieros curiosos ven sus propios hábitos de habla como los ve un instrumento, con un minuto de audio
Cuándo usarlo
- Al ensayar un pitch o una charla: oye el hábito de apertura antes del directo
- Después de una demo que cayó: encuentra el momento en que la voz se quedó atrás de las palabras
- Al entrenar a un ponente: cambia impresión por informe con timestamp y cita de parámetro
- Al auditar tu propia habla: lectura mensual de los hábitos que no sabías que tenías
Instalación
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 Necesita una clave de la API AmiVoice (gratis hasta 60 minutos al mes) y una clave de la API Anthropic. Un análisis cuesta unos ¥18 de uso de Claude Sonnet — cerca de 60 ejecuciones al mes por ¥1.080.
Las tres capas
- Capa acústica: series temporales de los 20 parámetros ESAS — curva de tensión, sesgo de entonación, energía de apertura, caída del cierre
- Capa de texto: muletillas, posición de la conclusión, palabras repetidas, flujo lógico del transcript reconocido
- Capa cruzada: correlaciones cuerpo–lenguaje, como "la energía vocal cae justo antes de la conclusión"
- Regla de grounding: toda afirmación tiene que citar tiempo, parámetro y fragmento, lo que suprime observaciones alucinadas
- ESAS no depende del idioma: los hábitos acústicos salen nítidos aunque el reconocimiento venga lleno de errores
- Los 20 nombres de campo del ESAS fueron medidos contra la API real (la doc oficial lista solo 5 ejemplos)
- UI en Streamlit: grabación con micrófono en el navegador, series temporales interactivas en Plotly, tarjetas de la capa cruzada, descarga del informe Markdown
Medido en 4 pitches
| métrica | Jobs (cierre) | Son (apertura) | Nishino (apertura) | Ochiai (apertura) |
|---|---|---|---|---|
| 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 |
| posición de la conclusión | back | front | middle | back |
| muletillas | "ne" ×1 | "ne" ×1 | "chotto" ×5 | "ano" ×1 |
| confidence del reconocimiento | 0,74–0,89 | 0,99–1,00 | 0,93–1,00 | 0,70–0,82 |
Un solo indicador no decide si hablas bien: el pico de energy de Jobs es 21, el de Son es 44, y los dos aterrizan. Lo que la herramienta muestra es dónde vive el hábito de cada uno: los cinco "chotto" de Nishino, el pitch de Son entregado por completo en la apertura, la confidence de Ochiai cayendo a 0,70 mientras el patrón acústico sigue intenso. No es la nota; es el hábito específico nombrado en la línea de tiempo.
Las dos cosas que la impresión pierde
Estos son los dos puntos que la herramienta saca a la luz cada vez y que la impresión no atrapa.
Desincronía en la apertura
anticipation 65 × energy 2
Apertura de Stallman: anticipación máxima, energía vocal mínima. La cabeza ya avanzó; la voz todavía no despega del suelo. La impresión llama a esto "parecía nervioso" — la herramienta nombra el segundo específico.
passionate se queda plana
pico de passionate ≤ 11 en los 4 pitches
En Jobs, Son, Nishino y Ochiai, el pico de passionate del ESAS nunca pasa de 11. La emoción que aterriza no sale como "pasión". Sale como anticipation, concentration y balanceo de entonación — que es donde mira la capa cruzada.
Uso
# análisis: reconocimiento → ESAS → Claude × 3 capas → informe Markdown
shl analyze examples/sample.wav --out report.md
# elegir el modelo Claude por ejecución
shl analyze examples/sample.wav --model claude-opus-4-7 --out report.md
# UI en el navegador con grabación por micrófono en localhost:8501
shl serve Interfaz web
shl serve levanta una UI en Streamlit en localhost:8501: graba con el micrófono del navegador o arrastra un .wav, explora la serie temporal ESAS de forma interactiva en Plotly, abre las tarjetas de la capa cruzada y descarga el informe en Markdown. Las claves de API se leen del .env en el lado del servidor y nunca llegan al navegador.
Qué devuelven las ejecuciones reales
Tres patrones que la herramienta atrapó en discursos reales. Cada línea viene con tiempo + parámetro + fragmento.
- Apertura de Stallman (0.0s, anticipation=65, energy=2, confidence=15): anticipación máxima con energía vocal mínima. Una carrera que no despega — el segundo específico que la impresión traduce por "sonó fuera de lugar"
- intensive_thinking=62 × energy=3: los momentos de pensamiento más denso coinciden con la menor salida vocal. Presente en toda charla larga que la herramienta corrió hasta ahora
- passionate=0 fluente: las palabras no paran, el passionate del ESAS se queda en cero. Fluente pero plano — falla común de pitches muy ensayados, solo visible en la capa cruzada
La herramienta es espejo, no coach. Nombra el hábito en la línea de tiempo; qué hacer con eso es tuyo.
v0.2, construido para el Zennfes Spring 2026. Duración recomendada 30-90 segundos (el tier gratuito de AmiVoice es de 60 minutos/mes). El análisis toma cerca de 3-4 minutos de punta a punta. La semántica de los parámetros ESAS viene de mediciones más la lista oficial de parámetros; trata los hallazgos de la capa cruzada como pistas de coaching, sin valor de medición clínica.
Por qué existe esta herramienta
Casi todo feedback sobre habla vive al nivel de la impresión: "parecías nervioso", "el cierre estuvo débil", "te perdí en el medio". Cuando la impresión se vuelve palabra, el segundo específico que la produjo ya se perdió. Las tres capas de aquí existen para retener ese segundo: la acústica lo mide sin depender de si reconociste las palabras, la de texto registra lo que se dijo de verdad, y la cruzada las alinea para que un hábito se vuelva cita, no vibe. Depura la entrega como depuras código.
Junto a Whisper y pyAudioAnalysis
Trabajos distintos. Whisper transcribe; pyAudioAnalysis clasifica frames acústicos. speech-habit-lens queda en la capa de arriba: alinea una serie temporal emocional por parámetro con el transcript y le pide al LLM que nombre el hábito, bajo una regla estricta de cita.
| speech-habit-lens | Whisper | pyAudioAnalysis | |
|---|---|---|---|
| Qué responde | ¿Cuál es mi hábito de entrega, segundo a segundo? | ¿Qué dijo el ponente? | ¿A qué clase acústica pertenece este frame? |
| Serie temporal emocional | ✓ 20 parámetros ESAS alineados a los segundos | — | Features acústicas hechas a mano |
| Capa cruzada voz × palabras | ✓ LLM con citas fundamentadas | — | — |
| Guardia contra alucinaciones | ✓ Regla de grounding (tiempo + param + fragmento) | n/a (solo transcript) | n/a (solo clasificador) |
| UI web | ✓ Streamlit + micrófono del navegador | — | — |
| Licencia | MIT | MIT | Apache-2.0 |
La raya indica que la herramienta no ofrece esa superficie por defecto. speech-habit-lens vive encima de un motor de transcript y de una señal acústica (AmiVoice ESAS en este build); cambia cualquier capa de arriba y el análisis cruzado sigue corriendo.
FAQ
¿Qué claves de API necesito?
Clave de la API AmiVoice (gratis hasta 60 minutos al mes) para reconocimiento y ESAS, más clave de la API Anthropic para el análisis LLM en 3 capas. Un análisis cuesta unos ¥18 de uso de Claude Sonnet 4.6; cuenta con ~¥1.080 al mes si corres unos 60 clips.
¿De cuánto puede ser el clip?
Entre 30 y 90 segundos es el punto dulce. Clips arriba de 120 segundos se rechazan y clips arriba de 60 disparan aviso, para proteger el tier gratuito de AmiVoice. La herramienta está hecha para la ventana de observación tamaño pitch, no para charlas completas.
¿Con qué idiomas funciona?
La capa de texto usa el motor japonés de AmiVoice por defecto, así que el análisis textual es más fuerte en japonés. ESAS no depende del idioma, entonces la capa acústica y la capa cruzada corren en cualquier idioma — el reconocimiento ruidoso no las afecta.
¿Los 20 parámetros ESAS son reales? ¿Cómo se verificaron?
La doc oficial de AmiVoice lista solo 5 ejemplos. Los 20 nombres de campo se midieron contra la API real en mayo y se re-verificaron contra el endpoint de la lista de parámetros en junio de 2026. Cada rango de valores está documentado en los templates de prompt, así que el LLM no puede inferir valores fuera de rango.
¿Cómo frena la alucinación la regla de grounding?
El prompt de cada capa exige que toda afirmación cite tiempo, parámetro y fragmento. La evidencia de tres piezas sigue como JSON estructurado a la capa siguiente, y la cruzada hereda la misma regla: sin cita, sin afirmación. Los hallazgos sin evidencia se descartan en el parser.
¿Qué modelo Claude debería usar?
Sonnet 4.6 es el default y aterriza los estudios de caso. Opus 4.7 vale para los patrones cruzados más duros, con costo cerca de 3× mayor. Haiku 4.5 es la opción de recorte de costo cuando solo quieres triage rápido — elige por ejecución con --model.
¿Y los modelos locales o el reconocimiento on-device?
La v0.2 es cloud-first (AmiVoice + Anthropic). Cambiar la señal acústica por un ESAS local equivalente o la capa de texto por un Whisper local no viene en el paquete, pero es la extensión natural: la capa cruzada es agnóstica de modelo.
¿Es medida clínica?
No. Trata los hallazgos de la capa cruzada como pistas de coaching, sin valor de medición clínica. La semántica de los parámetros viene de mediciones más la lista de parámetros del proveedor, y el contexto de coaching (qué hábito vale la pena arreglar) queda contigo — la herramienta nombra el hábito y cita el segundo.
Sobre el autor
Creado por Ken Imoto: más de 300 artículos técnicos en Zenn, Qiita, Dev.to y este sitio, más de 40 libros en 4 idiomas, más de 400 mil páginas vistas en Zenn y Qiita, 4 artículos de investigación en Zenodo y creador del LLMO Framework.
Herramientas 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 maneja OpenCut classic desde cualquier cliente MCP. Playwright mantiene la sesión del editor; doce herramientas exponen la línea de tiempo, assets y pipeline de export. Corre contra un fork de OpenCut classic.
- mcp-scorecard Pre-flight checks for MCP servers: passive token footprint, use-case scoping, security, and name safety. LLM-facing quality scorecard.