Skip to content

mcquaas/ai-watcher

Repository files navigation

SenseCAP Watcher - Asistente AI Local Privado

Asistente de IA 100% privado con visión y voz usando SenseCAP Watcher + servidor local Python + OpenAI GPT-4o.

Platform Language LLM Vision

📋 Índice


🎯 Resumen

Este proyecto convierte un SenseCAP Watcher 1A en un asistente de IA que:

  • Escucha comandos de voz en español
  • Responde con TTS en español (voz Elvira)
  • Ve a través de su cámara y describe imágenes
  • Busca información en tiempo real en la web
  • Retroalimentación sonora inmediata (beeps, "Te escucho")

Stack Tecnológico

Componente Tecnología Proveedor
LLM GPT-4o-mini OpenAI
Vision (VLLM) GPT-4o OpenAI
ASR (Voz→Texto) Whisper OpenAI
TTS (Texto→Voz) EdgeTTS Microsoft (es-ES-ElviraNeural)
Web Search Tavily API Tavily
Firmware XiaoZhi ESP32 Personalizado

🏗️ Arquitectura

┌─────────────────────┐         ┌─────────────────────────────────────┐
│  SenseCAP Watcher   │   WiFi  │          Servidor Local             │
│  (ESP32-S3)         │◄───────►│  (minis.local / 192.168.0.65)       │
│                     │         │                                     │
│  • Micrófono        │         │  xiaozhi-server (Python)            │
│  • Cámara 2MP       │         │  ├── ASR: OpenAI Whisper            │
│  • Parlante         │         │  ├── LLM: GPT-4o-mini               │
│  • Pantalla LCD     │         │  ├── TTS: EdgeTTS (español)         │
│  • Botón (knob)     │         │  ├── VLLM: GPT-4o (visión)          │
└─────────────────────┘         │  └── Web Search: Tavily             │
                                └─────────────────────────────────────┘

Flujo de Datos

  1. Usuario habla → Micrófono captura audio
  2. Audio enviado → WebSocket al servidor (ws://192.168.0.65:8000)
  3. ASR (Whisper) → Convierte audio a texto
  4. LLM (GPT-4o-mini) → Procesa texto y genera respuesta
  5. TTS (EdgeTTS) → Convierte respuesta a audio español
  6. Audio devuelto → Parlante del Watcher reproduce

📦 Requisitos

Hardware

  • SenseCAP Watcher 1A (ESP32-S3 + Himax AI)
  • Servidor: PC con Python 3.10+ (probado en Ubuntu 24.04)
  • Red WiFi 2.4GHz (5GHz no soportado por ESP32)

Software (Servidor)

# Dependencias del sistema
sudo apt install python3 python3-pip python3-venv ffmpeg

# ESP-IDF 5.5.2 (para compilar firmware)
# Ver: https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/get-started/

🚀 Instalación Rápida

1. Clonar repositorio

git clone https://github.com/TU_USUARIO/esp32-local-llm-assistant.git
cd esp32-local-llm-assistant

2. Crear entorno virtual e instalar dependencias

python3 -m venv venv
source venv/bin/activate
pip install -r server-bridge/main/xiaozhi-server/requirements.txt

3. Configurar API Keys

Editar server-bridge/main/xiaozhi-server/data/.config.yaml:

# Ver sección "API Keys y Secretos" para los valores

4. Iniciar servidor

cd server-bridge/main/xiaozhi-server
python app.py

5. Flashear firmware al Watcher

# Ver sección "Comandos de Flasheo"

⚙️ Configuración Actual

Archivo Principal: server-bridge/main/xiaozhi-server/data/.config.yaml

server:
  ip: 0.0.0.0
  port: 8000
  websocket: ws://192.168.0.65:8000/xiaozhi/v1/
  vision_explain: http://192.168.0.65:8003/mcp/vision/explain

selected_module:
  VAD: SileroVAD
  ASR: OpenaiASR
  LLM: OpenAILLM
  TTS: EdgeTTS
  VLLM: OpenAIVLLM

ASR:
  OpenaiASR:
    type: openai
    api_key: sk-proj-XXXXXXX  # Tu API Key de OpenAI
    base_url: https://api.openai.com/v1/audio/transcriptions
    model_name: whisper-1
    output_dir: tmp/
  enable_asr_start_notify: true
  asr_start_notify_voice: "config/assets/tts_notify.mp3"

LLM:
  OpenAILLM:
    type: openai
    model_name: gpt-4o-mini
    api_key: sk-proj-XXXXXXX  # Tu API Key de OpenAI
    base_url: https://api.openai.com/v1

TTS:
  EdgeTTS:
    type: edge
    voice: es-ES-ElviraNeural  # Voz española femenina

VLLM:
  OpenAIVLLM:
    type: openai
    model_name: gpt-4o
    api_key: sk-proj-XXXXXXX  # Tu API Key de OpenAI
    base_url: https://api.openai.com/v1

prompt: |
  Eres un asistente de IA amable llamado Watcher. 
  Respondes siempre en español de forma muy breve (1-2 oraciones máximo).
  Tienes una cámara. Cuando te pregunten "¿Qué ves?", usa la herramienta `self.camera.take_photo`.
  También puedes buscar información en la web usando la herramienta `web_search`.

Intent:
  function_call:
    functions:
      - change_role
      - get_weather
      - get_news_from_newsnow
      - play_music
      - web_search

Configuración del Firmware (sdkconfig)

# Idioma: Español
CONFIG_LANGUAGE_ES_ES=y

# Board: SenseCAP Watcher
CONFIG_BOARD_TYPE_SEEED_STUDIO_SENSECAP_WATCHER=y

# OTA URL (servidor local)
CONFIG_OTA_URL="http://192.168.0.65:8003/xiaozhi/ota/"

✨ Funcionalidades Implementadas

1. Retroalimentación de Escucha ("Te escucho")

Cuando el usuario presiona el botón para hablar, el Watcher dice "Te escucho" antes de comenzar a escuchar.

Archivos modificados:

  • firmware-src/main/assets/locales/es-ES/listening.ogg (audio generado con EdgeTTS)
  • firmware-src/main/assets/lang_config.h (registro del nuevo sonido)
  • firmware-src/main/application.cc (SetListeningMode reproduce el audio)

2. Beep al Terminar de Escuchar

Cuando el usuario deja de hablar, suena un beep para indicar que se está procesando.

Configuración:

ASR:
  enable_asr_start_notify: true
  asr_start_notify_voice: "config/assets/tts_notify.mp3"

3. Doble Clic = Captura de Foto

Al hacer doble clic en el knob del Watcher:

  1. 📸 Captura foto de la cámara
  2. 🔔 Suena beep de "obturador"
  3. 🔁 Beeps cada segundo mientras espera respuesta
  4. 🗣️ Habla la descripción de la imagen (GPT-4o Vision)
  5. 👂 Queda escuchando para preguntas adicionales sobre la foto

Archivos modificados:

  • firmware-src/main/boards/sensecap-watcher/sensecap_watcher.cc (handler de doble clic)
  • firmware-src/main/protocols/protocol.cc (nuevo método SendSpeak)
  • firmware-src/main/application.cc (nuevo método Application::SendSpeak)
  • server-bridge/main/xiaozhi-server/core/handle/textHandler/speakMessageHandler.py (nuevo handler)

4. Búsqueda Web en Tiempo Real

El asistente puede buscar información actual en internet usando Tavily API.

Ejemplo de uso:

  • "¿Cuál es el precio del dólar hoy?"
  • "¿Qué noticias hay de México?"

Archivo:

  • server-bridge/main/xiaozhi-server/plugins_func/functions/web_search.py

5. Visión con GPT-4o

Cuando el usuario pregunta "¿Qué ves?", el asistente:

  1. Toma una foto con la cámara
  2. Envía al endpoint de visión
  3. GPT-4o describe la imagen en español
  4. TTS habla la descripción

Archivo modificado:

  • server-bridge/main/xiaozhi-server/core/providers/vllm/openai.py (respuesta en español)

🔧 Comandos de Flasheo

Entrar en Modo Bootloader

  1. Mantener presionado BOOT
  2. Presionar y soltar RESET
  3. Soltar BOOT
  4. El LED debería parpadear indicando modo download

Detectar Puerto

ls /dev/ttyACM*
# Usualmente: /dev/ttyACM0 o /dev/ttyACM1

Compilar Firmware

source ~/esp/esp-idf/export.sh
cd firmware-src
idf.py build

Flashear (Velocidad Óptima: 460800 baud)

# ~43 segundos de flasheo
sudo ~/.espressif/python_env/idf5.5_py3.12_env/bin/python -m esptool \
  --chip esp32s3 \
  -p /dev/ttyACM1 \
  -b 460800 \
  --before default_reset \
  --after hard_reset \
  write_flash \
  --flash_mode dio \
  --flash_size 16MB \
  --flash_freq 80m \
  0x20000 build/xiaozhi.bin

Velocidades de Flasheo Probadas

Velocidad Tiempo Estabilidad
115200 ~155s ✅ Muy estable
230400 ~78s ✅ Estable
460800 ~43s ✅ Recomendada
921600 - ❌ Falla conexión

Flasheo Completo (incluye bootloader)

python -m esptool --chip esp32s3 -b 460800 \
  --before default_reset --after hard_reset \
  write_flash --flash_mode dio --flash_size 16MB --flash_freq 80m \
  0x0 build/bootloader/bootloader.bin \
  0x8000 build/partition_table/partition-table.bin \
  0xd000 build/ota_data_initial.bin \
  0x20000 build/xiaozhi.bin \
  0x800000 build/generated_assets.bin

📁 Archivos Modificados

Firmware (firmware-src/)

Archivo Descripción
main/boards/sensecap-watcher/sensecap_watcher.cc Handler doble clic para cámara
main/application.cc Método SendSpeak(), sonido "Te escucho"
main/application.h Declaración SendSpeak()
main/protocols/protocol.cc Implementación SendSpeak()
main/protocols/protocol.h Declaración SendSpeak()
main/assets/lang_config.h Registro sonido OGG_LISTENING
main/assets/locales/es-ES/listening.ogg Audio "Te escucho"
build/sdkconfig Idioma español, board type, OTA URL

Servidor (server-bridge/main/xiaozhi-server/)

Archivo Descripción
data/.config.yaml Configuración principal (API keys, módulos)
core/handle/textMessageType.py Nuevo tipo SPEAK
core/handle/textHandler/speakMessageHandler.py Handler para TTS directo
core/handle/textMessageHandlerRegistry.py Registro del handler SPEAK
core/providers/vllm/openai.py Respuestas de visión en español
plugins_func/functions/web_search.py Búsqueda web con Tavily

🔐 API Keys y Secretos

OpenAI API Key

Ubicación: server-bridge/main/xiaozhi-server/data/.config.yaml

api_key: sk-proj-XXXXXXXXX

Usado para: ASR (Whisper), LLM (GPT-4o-mini), VLLM (GPT-4o)

Tavily API Key

Ubicación: server-bridge/main/xiaozhi-server/plugins_func/functions/web_search.py

TAVILY_API_KEY = "tvly-dev-XXXXXXXXX"

Usado para: Búsqueda web en tiempo real

IP del Servidor

Ubicación: server-bridge/main/xiaozhi-server/data/.config.yaml

websocket: ws://192.168.0.65:8000/xiaozhi/v1/
vision_explain: http://192.168.0.65:8003/mcp/vision/explain

🐛 Troubleshooting

El Watcher no se conecta al WiFi

  • Verificar que es red 2.4GHz (no 5GHz)
  • Contraseña correcta
  • Reiniciar el Watcher

Error de flasheo "No serial data received"

  1. Asegurar modo bootloader (BOOT + RESET)
  2. Probar otro puerto USB
  3. Reducir velocidad a 115200

El servidor no inicia

# Verificar dependencias
pip install -r requirements.txt

# Ver logs
tail -f /tmp/xiaozhi-server.log

No responde en español

  • Verificar CONFIG_LANGUAGE_ES_ES=y en sdkconfig
  • Verificar voice: es-ES-ElviraNeural en config.yaml

Respuestas lentas

  • ASR local (Vosk) es lento → usar OpenAI Whisper
  • LLM local (Ollama) es lento → usar OpenAI GPT-4o-mini

📄 Licencia

MIT License - Ver LICENSE

🙏 Créditos

  • Seeed Studio: Hardware SenseCAP Watcher
  • XiaoZhi Team: Firmware base ESP32
  • OpenAI: GPT-4o, Whisper
  • Microsoft: EdgeTTS
  • Tavily: API de búsqueda web

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors