┌─────────────────────────────────────┐
│ USUARIO (Voz) │
└──────────────┬──────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ Push-to-Talk (cmd+space) │
│ Activa captura de audio │
└──────────────┬──────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ VAD (Voice Activity Detection) │
│ Detecta cuando usuario habla │
└──────────────┬──────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ STT (Whisper small) │
│ Transcribe audio → texto │
└──────────────┬──────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ Buffer de Contexto (20 msgs) │
│ Mantiene historial │
└──────────────┬──────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ LLM (Llama 3.2 3B) │
│ Genera respuesta │
└──────────────┬──────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ TTS (macOS say) │
│ Texto → voz │
│ │
│ Sistema de Interrupciones: │
│ VAD paralelo detecta habla │
│ → Cancela TTS inmediatamente │
└────────────────────────────────────┘
vad.py - Voice Activity Detection
- WebRTC VAD
- Detecta habla del usuario
- Configuración de aggressiveness (0-3)
stt.py - Speech-to-Text
- Whisper (OpenAI)
- Modelo: small
- Latencia: 0.5-1.5s
tts.py - Text-to-Speech
- macOS
saycommand - Voz: Jorge (español)
- Split en oraciones para interrupciones
push_to_talk.py - Activación por Tecla
- Pynput keyboard listener
- Default: cmd+space
- Async events
interruption.py - Sistema de Interrupciones ⭐
- Enfoque A: TTS por chunks + VAD paralelo
- Cancela TTS inmediatamente si usuario habla
- Captura nuevo input del usuario
hotword.py - Detección de Palabra Clave
- 🚧 SEMANA 3 - TODOs
- Placeholder para Porcupine
llama_client.py - Cliente Llama
- Ollama API
- 3 perfiles: testing, production, conversational
- Q4_K_M quantization (2GB RAM)
context.py - Buffer de Contexto
- FIFO deque (20 mensajes)
- System prompt siempre presente
- Export para logging
manager.py - Gestor Conversacional
- Coordina flujo completo
- Captura → Transcribe → LLM → Habla
- Maneja interrupciones
config_loader.py - Carga de Configuración
- Lee config.yaml
- Notación de punto para acceso
- Crea directorios necesarios
logging_system.py - Sistema de Logging
- Structlog
- Session logs con timestamps
- Latencias de cada componente
- Tracking de contexto
1. Usuario presiona cmd+space
2. VAD detecta inicio de habla
3. Captura audio hasta silencio
4. Whisper transcribe → texto
5. Añadir a contexto
6. Llama genera respuesta
7. Añadir respuesta a contexto
8. TTS habla (por oraciones)
9. VAD monitorea (por si interrumpe)
10. Completado
Latencia total: ~1.5-3s
1-6. [Igual que arriba]
7. TTS empieza a hablar oración 1
8. VAD detecta habla del usuario
9. ⚠️ INTERRUPCIÓN DETECTADA
10. Cancela TTS inmediatamente
11. Captura lo que usuario está diciendo
12. Whisper transcribe interrupción
13. Añadir a contexto
14. Llama genera nueva respuesta
15. TTS habla nueva respuesta
Latencia interrupción: <200ms
| Perfil | Temp | Tokens | Latencia | Uso |
|---|---|---|---|---|
| testing | 0.1 | 50 | 0.3-0.6s | Validación rápida |
| production | 0.3 | 150 | 0.8-1.5s | Balance (default) |
| conversational | 0.7 | 250 | 1.5-2.5s | Natural |
- 0: Muy sensible (más falsos positivos)
- 1: Sensible
- 2: Balanceado (default)
- 3: Agresivo (puede perder habla)
Cada sesión genera:
logs/sessions/session_YYYYMMDD_HHMMSS.log
Contiene:
- Timestamp de cada interacción
- Latencias (VAD, STT, LLM, total)
- Contexto usado (últimos N mensajes)
- Token counts
- Interrupciones con VAD confidence
- Errores con traceback
python tests/test_latency.pyMide:
- VAD: <1ms
- STT: ~1.5s
- LLM: 0.3-2.5s (según perfil)
- Pipeline total: <3s (target)
python scripts/test_counting.pyValida:
- Interrupciones funcionan
- Contexto se mantiene
- Cambios de dirección
- Cambios de reglas
❌ No soportado en Fase 0:
- Funciones/herramientas externas
- Web search
- Filesystem operations
- Email management
- Workspaces
- Task queue
- LLM Complejo (Claude API)
- Persistencia en disco (solo en RAM)
✅ Solo conversación pura con contexto en memoria
Fase 1 (Semanas 4-7):
- Dual LLM (Llama + Claude)
- Task Queue asíncrona
- Web search
- Persistencia básica (SQLite)
Fase 2 (Semanas 8-11):
- Filesystem completo
- MCP servers
- Bandeja de entrada
Ver PROYECTO_ASISTENTE_VOZ_ESPECIFICACION.md para roadmap completo.