尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗Un asistente de voz que aprende a entenderte: cuanto más lo usás, mejor te entiende, y habla por vos.
Voz Clara es un agente de voz para personas con habla atípica (disartria por ELA, Parkinson, ACV y otras enfermedades neurológicas). La persona habla, el sistema transcribe, interpreta lo que quiso decir y lo dice con voz clara. Un agente con memoria recuerda a la persona, sus contactos y sus correcciones, así que mejora con cada uso.
Proyecto para un hackatón de IA, construido sobre el dataset S-DiverSe.
Los asistentes de voz y los sistemas de reconocimiento del habla se entrenan con habla típica y fallan con personas con disartria. Con habla disártrica, Whisper corriendo por cuenta propia además inventa texto: entra en bucles ("no, no, no, no...") y agrega cientos de palabras que nadie dijo. Aun sin esos bucles, se equivoca en casi 1 de cada 3 palabras. Estas personas no pueden usar asistentes ni hacerse entender por teléfono o en un comercio sin depender de un familiar. Las pocas soluciones especializadas que existen están pensadas sobre todo para el inglés.
Muchas pueden escribir, pero no es lo mismo. Escribir es lento, saca a la persona del ritmo de la conversación y la convierte en alguien a quien hay que leer en vez de escuchar. Hablar es parte de quién somos: es como le decimos "te quiero" a una hija o contamos un chiste. No queremos que dejen de hablar: queremos que sigan hablando y que se las entienda.
Flujo de un turno, como funciona hoy en la app:
whisper-large-v3-turbo y, en paralelo, con whisper-large-v3 como segunda hipótesis.gpt-4.1-mini) corrige errores de reconocimiento con sus contactos, vocabulario y correcciones ("kero ablar co maia" → "Quiero hablar con María"). Con confianza baja no adivina.La idea es preguntar antes que equivocarse en silencio, con respuestas cortas y voz pausada. La parte de decidir entre decir, confirmar u ofrecer opciones según la confianza está programada en agente/ pero todavía no conectada (ver Estado).
Memoria por persona, persistente (JSON o SQLite alcanza para el hackatón):
Mejora con el uso, sin reentrenar. En cada turno se buscan las correcciones validadas más parecidas y se le pasan al LLM como ejemplos, junto con los contactos y el vocabulario. Funciona desde la primera validación.
Demo clave: la misma frase sale mal al principio y bien después de una validación.
Hay dos versiones de la memoria:
voz/memoria.py): JSON por persona. Si una transcripción se parece a una corrección validada (WER ≤ 0,25), se usa la corrección; si no, el LLM recibe los contactos, el vocabulario y las últimas correcciones.agente/, ver AGENTE.md): busca los ejemplos más parecidos, detecta la intención ("mandale a María…"), calcula la acción (decir, confirmar u ofrecer opciones) y propone aprender contactos nuevos. Falta conectarla al backend.Los contactos y el vocabulario no se le pasan a Whisper como pista: con habla difícil, Whisper copiaba la pista ("María, Juan, Riluzol...") en lugar de transcribir.
Funciona: la persona valida lo que dijo, la app pregunta "¿Lo mando como audio por WhatsApp?" y, si dice que sí, el backend genera la nota de voz con la voz de la app y la manda por Kapso (voz/kapso.py).
KAPSO_DESTINO)..ogg con códec OPUS: el backend convierte la voz con ffmpeg.WER (tasa de error por palabra, en %; menor es mejor) sobre los hablantes de test de S-DiverSe: 6 personas que ningún modelo vio al entrenar, 98 segmentos, 2.430 palabras. El split es por hablante, no por segmento.
| Condición | Qué es | Total | High | High/Medium | Medium | Medium/Low | Low |
|---|---|---|---|---|---|---|---|
| segmentos / hablantes | 98 / 6 | 26 / 1 | 7 / 1 | 7 / 2 | 12 / 1 | 46 / 2 | |
| A | whisper-small sin entrenar | 88,4 | 47,7 | 27,0 | 24,0 | 14,2 | 167,1 |
| A + reglas | A + las 3 reglas anti-alucinación del paper | 43,6 | 28,6 | 27,0 | 24,0 | 14,2 | 71,0 |
| B | A + reglas + LLM | 41,4 | 26,8 | 22,7 | 21,2 | 10,1 | 69,3 |
| C | whisper-small + LoRA | 55,8 | 29,5 | 7,8 | 16,1 | 18,2 | 105,8 |
| C + reglas | C + reglas | 38,5 | 29,0 | 8,5 | 16,1 | 18,2 | 61,4 |
| D | C + reglas + LLM | 36,9 | 26,0 | 12,8 | 16,6 | 15,5 | 60,0 |
| Turbo | whisper-large-v3-turbo sin entrenar | 73,0 | 19,0 | 12,1 | 13,8 | 12,2 | 162,2 |
| Turbo + reglas | turbo + reglas | 31,1 | 18,7 | 10,6 | 11,1 | 12,2 | 54,9 |
| Turbo + reglas + LLM | pipeline final | 30,7 | 18,6 | 10,6 | 11,5 | 11,5 | 54,1 |
| B + contexto | B con contexto simulado de la persona | 41,0 | 26,2 | 24,1 | 19,4 | 10,1 | 69,1 |
| D + contexto | D con contexto simulado de la persona | 35,1 | 24,8 | 9,2 | 14,3 | 14,9 |
El mejor pipeline es turbo + reglas + LLM (30,7 %). Casi toda la mejora viene de las reglas: turbo baja de 73,0 a 31,1 solo con ellas, y el LLM agrega 0,4 puntos (IC 95 % por hablantes: 0,0 a 1,2). Contra D, con el mismo LLM, el pipeline final es 5,3 puntos mejor (IC 2,3 a 6,6).
Whisper por API (Groq), el que usa la demo en vivo. El mismo modelo servido por Groq ya evita casi todas las alucinaciones, así que la mejora es menor:
| Condición | Total | ELA | Parkinson | ACV |
|---|---|---|---|---|
| 98 seg. / 6 hab. | 47 / 3 | 27 / 1 | 24 / 2 | |
| Groq (whisper-large-v3-turbo por API) | 32,7 | 43,1 | 19,5 | 35,0 |
| Groq + reglas | 31,4 | 42,5 | 18,6 | 24,4 |
| Groq + reglas + LLM | 31,0 | 42,5 | 18,3 | 21,9 |
Sobre Groq, el sistema mejora 1,6 puntos (IC 95 %: 0,6 a 5,5). Dos lecturas:
Notas para leer la tabla:
openai/gpt-oss-120b (Groq). Contexto y turbo + reglas + LLM, gpt-4.1-mini (OpenAI). Con gpt-4.1-mini, B da 41,1 y D da 36,0: el contexto no cambia B (41,1 → 41,0, IC −0,5 a 0,4) y mejora D en 0,9 puntos (IC 0,3 a 1,3).Tablas por enfermedad y por hablante en reconocimiento-voz/resultados/; métricas e intervalos de confianza explicados en reconocimiento-voz/GUIA.md.
.
├── README.md este archivo
├── frontend/ la app web (Next.js, publicada en Vercel)
│ └── public/audios-prueba/ 20 audios de test de S-DiverSe para probar la app
├── voz/ backend (FastAPI, publicado en Easypanel): transcripción, confianza,
│ interpretación, memoria simple, voz, WhatsApp. Ver voz/README.md
├── agente/ agente con memoria (decir / confirmar / opciones). Falta conectarlo
├── reconocimiento-voz/
│ ├── README.md, GUIA.md documentación de la evaluación
│ ├── notebooks/ los 3 notebooks de Colab
│ └── resultados/ tablas de WER y transcripciones de test (solo texto)
├── video/ comparacion_finetuning.html: pantalla de "Whisper antes y después" para el video
└── recursos adicionales/ borradores y documentos de trabajo
| Notebook | Qué hace | GPU | Tiempo |
|---|---|---|---|
notebook_sdiverse_whisper.ipynb | Experimento completo: split por hablante, A, reglas, B, alineación forzada, entrenamiento LoRA, C, D, referencia turbo, tablas de WER, audios de demo y app de Gradio (sección 11) | T4 | ~1–1,5 h |
notebook_contexto_llm.ipynb | Mide si el LLM corrige mejor con contexto de la persona (B vs B+ctx, D vs D+ctx). Incluye corregir_con_perfil(texto, perfil) | No | 10–30 min |
notebook_demo_turbo.ipynb | Mide turbo + reglas + LLM, elige audios de demo y levanta la app de Gradio con perfil opcional | No | ~5 min |
Mi unidad/Shippear/sdiverse_hackathon/)| Archivo o carpeta | Lo genera | Qué tiene |
|---|---|---|
splits.csv | principal | Split train/val/test por hablante y folds de la validación cruzada |
trozos_entrenamiento.csv | principal | Cortes de la alineación forzada de los segmentos largos |
resultados/pred_A.csv, pred_C.csv, pred_ref_turbo.csv | principal | Transcripciones de A, C y turbo |
resultados/tabla_total.csv, tabla_por_enfermedad.csv, tabla_por_inteligibilidad.csv, tabla_por_hablante.csv | principal | WER en test |
resultados/wer_por_segmento_A.csv | principal | WER de A por segmento, de peor a mejor |
resultados/transcripciones_val_test.csv | principal | Todas las transcripciones de val y test, lado a lado |
resultados/transcripciones_contexto.csv | contexto | Resultados con y sin contexto |
resultados/transcripciones_turbo_llm.csv | demo | Resultados del pipeline final |
resultados/cache_llm.json, cache_llm_contexto.json, cache_llm_demo.json | cada notebook | Caché de respuestas del LLM |
lora/principal/ | principal | Checkpoints, historial.csv, LISTO.json y adaptador_final/ (adaptador LoRA, ~25 MB) |
demo/ | principal | 5 audios de test con demo.csv |
demo_turbo/ | demo | Audios de test donde turbo solo falla y el pipeline acierta, con demo_turbo.csv |
reconocimiento-voz/resultados/)| Archivo | Qué tiene |
|---|---|
splits.csv | Split por hablante de los 444 segmentos |
transcripciones_test.csv | Los 98 segmentos de test: referencia y la salida de cada condición |
wer_total.csv, wer_por_enfermedad.csv, wer_por_inteligibilidad.csv, wer_por_hablante.csv | WER de cada condición |
wer_contexto.csv | WER con y sin contexto |
El corpus de audio no está en el repo; solo los 20 audios de prueba de la app (ver Cuidados).
Backend (voz/, ver voz/README.md): necesita Python 3.10+ y ffmpeg.
cd voz
python -m venv .venv
.venv/Scripts/python -m pip install -r requirements.txt # Mac/Linux: .venv/bin/python
cp .env.example .env # completar las claves
.venv/Scripts/python -m uvicorn servidor:app --port 8000
Variables de voz/.env: GROQ_API_KEY (transcripción), OPENAI_API_KEY (interpretación y voz de respaldo), ELEVENLABS_API_KEY (voz), KAPSO_API_KEY y KAPSO_DESTINO (WhatsApp) y, publicado, URL_PUBLICA (la dirección https del backend). GET /salud muestra qué claves faltan.
Frontend (frontend/): NEXT_PUBLIC_API_URL=http://localhost:8000 en frontend/.env.local, después npm install y npm run dev. Sin esa variable, la interfaz funciona sola contra el navegador, para probar el diseño.
Publicado: el front en Vercel (NEXT_PUBLIC_API_URL apunta al backend; hay que redesplegar si cambia) y el backend en Easypanel, con las mismas variables de voz/.env en su pestaña Environment.
Medido en la app: el texto aparece en ~2,3 s (transcripción ~1 s + interpretación ~1 s) y la voz empieza a sonar ~0,4 s después. El primer turno después de un deploy tarda un poco más.
Los autores de S-DiverSe publican solo anotaciones y links de YouTube. Cloná su repositorio y corré su script de descarga (necesita yt-dlp, Deno y ffmpeg). Armá un zip con s-diverse.tsv y la carpeta audio/ (adentro: sdiverse/audio/<Enfermedad>/<ID>.wav) y subilo a Mi unidad/Shippear/. El resultado esperado son 444 segmentos en WAV de 16 kHz, unos 293 MB.
Mi unidad/Shippear/. El nombre no importa: el notebook busca el .zip que contiene s-diverse.tsv..ipynb.GROQ_API_KEY (de console.groq.com) y activá "Acceso al notebook". Sin clave, corre igual pero salta B y D.Correlo completo de entrada, sin una "corrida de prueba" con menos épocas: al terminar, el entrenamiento marca LISTO.json y una segunda corrida lo saltaría.
El notebook también corre en Kaggle (acelerador GPU T4 x2; usa una sola GPU).
Son estimaciones, no medidas en GPU.
| Etapa | Tiempo |
|---|---|
| Instalación + descompresión | 3–5 min |
| A: whisper-small sobre los 444 segmentos (+5 hipótesis por segmento corto) | 10–20 min |
| B: LLM sobre val+test (~120 llamadas en paralelo) | 2–5 min |
| Alineación forzada de segmentos largos | 5–10 min |
| Entrenamiento LoRA (hasta 8 épocas con early stopping) | 15–30 min |
| C y D sobre val+test | 5–8 min |
| Referencia whisper-large-v3-turbo sobre val+test | 3–6 min |
| Total | ~1–1,5 h |
Validación cruzada opcional (CFG["ejecutar_cv"]=True) | +1–1,5 h, no recomendada en Colab gratis |
En la corrida real, el entrenamiento LoRA tardó 6,5 min y el early stopping lo frenó en la época 5.
Colab gratis tiene un cupo de GPU que no es público y varía. Si después de varias horas de uso te niega la T4, hay que esperar o usar otra cuenta de Google.
Reconectá, elegí T4 de nuevo si hace falta y Ejecutar todas. Cada etapa reutiliza lo que guardó en Drive:
resultados/pred_A.csv, pred_C.csv, pred_ref_turbo.csv: si existen, no se recalculan.resultados/cache_llm.json: las respuestas del LLM no se pagan dos veces.trozos_entrenamiento.csv: la alineación forzada.lora/principal/checkpoint-*: un checkpoint por época. El entrenamiento retoma desde el último (pierde a lo sumo la época en curso).lora/principal/LISTO.json: si existe, el entrenamiento se salta.Para reentrenar (por ejemplo, si cambiaste un hiperparámetro): borrá en Drive la carpeta lora/principal/ y el archivo resultados/pred_C.csv. Si cambiaste el LLM o el prompt, no hace falta borrar nada: la caché distingue por modelo y prompt.
Todo se cambia en la celda de configuración (CFG).
GROQ_API_KEY en los Secrets. Si Groq deja de ofrecer el modelo de llm_modelo, cambialo por otro de console.groq.com/docs/models. El plan gratuito limita las llamadas por minuto: el notebook espera y reintenta. Si al final avisa que algunas llamadas fallaron, volvé a correr la celda (las exitosas salen de la caché).claude-haiku-5-5, secreto ANTHROPIC_API_KEY). Más potente: llm_modelo="claude-opus-5-5".llm_proveedor="openai_compatible", llm_modelo="...", llm_base_url= la URL del proveedor (None para OpenAI), clave en OPENAI_API_KEY.llm_proveedor="ninguno" (salta B y D).notebook_contexto_llm.ipynb)Mide si el LLM corrige mejor cuando sabe quién es la persona. El contexto se simula con hasta ~350 palabras de lo que esa persona dijo en sus otros segmentos, nunca con el evaluado.
resultados/pred_A.csv y splits.csv (los primeros ~20–30 min). Si además existe pred_C.csv, compara también D contra D+contexto.CFG (activá "Acceso al notebook").corregir_con_perfil(texto, perfil) para probar con un perfil escrito a mano.notebook_demo_turbo.ipynb)El pipeline que mejor rindió: turbo + reglas + LLM.
whisper-large-v3-turbo. Usá un entorno de CPU.GROQ_API_KEY (transcripción) y OPENAI_API_KEY (LLM, gpt-4.1-mini).demo_turbo/ audios de test donde turbo solo falla y el pipeline acierta.La última celda abre una app de Gradio con link público (https://....gradio.live, activo mientras dure la sesión de Colab) que funciona desde el celular. Se graba o sube un audio, con un perfil opcional de la persona, y se ven lado a lado "Whisper grande sin corregir" y "Nuestro sistema". Tarda unos 5 a 10 segundos por audio.
El notebook principal también tiene una app de Gradio (sección 11) que compara whisper-small contra su mejor enfoque.
El guion de la demo, los audios recomendados y el plan B están en la guía del proyecto.
Hecho
voz/): transcripción con Groq, hipótesis alternativa, confianza, reglas, interpretación con LLM, voz de ElevenLabs en streaming, nota de voz .ogg OPUS y latencia medida.Falta
agente/ al backend: reemplazar la memoria simple por la del agente y usar su accion (decir, confirmar, opciones) y su intencion/destinatario para elegir a quién mandar el WhatsApp.frontend/public/audios-prueba/ se incluyen con permiso de los autores; el resto del corpus y el zip no se publican. Para uso público o comercial, consultá a los autores.voz/.env y en las variables de Easypanel, nunca en el repo.Cita: López, F., Ibañez, F., Martínez, A., Alonso, I., Gómez, P., Kesiraju, S. y Luque, J. (2026). S-DiverSe: Spanish Diverse Speech. Interspeech 2026. arXiv:2607.03207.
| 57,8 |