Cómo solucionar problemas¶
El daemon no arranca¶
# Revisar el estado del servicio
systemctl --user status mirach
# Ver los logs completos
journalctl --user -u mirach --no-pager -n 50
Causas comunes:
- OpenCode no instalado o no autenticado
- Falta el archivo de voz Piper en voices/
- Micrófono no detectado
Errores de CUDA¶
# Probar la disponibilidad de CUDA
~/mirach/venv/bin/python -c "import torch; print(torch.cuda.is_available())"
# Recurrir a CPU
systemctl --user edit mirach
# Añade: Environment=MIRACH_WHISPER_DEVICE=cpu
# Añade: Environment=MIRACH_WHISPER_COMPUTE=int8
Could not load library libcudnn_ops.so.9¶
faster-whisper necesita las librerías de ejecución de CUDA 12. Se instalan vía pip pero viven dentro del venv. El script run_daemon.sh las añade a LD_LIBRARY_PATH automáticamente.
Si usas systemd, el archivo de servicio debe usar ExecStart=%h/mirach/run_daemon.sh (no python -m mirach directamente).
OpenCode no responde¶
El backend por defecto (opencode_serve) lanza y supervisa un subproceso opencode serve. Si los turnos se cuelgan, confirma que el binario opencode está en el PATH y autenticado. El proveedor y el modelo vienen de la propia config de opencode salvo que los sobrescribas con MIRACH_OPENCODE_SERVE_PROVIDER_ID / MIRACH_OPENCODE_SERVE_MODEL_ID.
Notificación "El daemon no está corriendo"¶
# Arrancar el daemon
systemctl --user start mirach
# Verificar que el socket existe
ls -la /tmp/mirach.sock
Micrófono no detectado¶
# Listar dispositivos de audio disponibles
~/mirach/venv/bin/python -c "import sounddevice as sd; print(sd.query_devices())"
# Definir MIRACH_MIC con una subcadena del nombre de tu micrófono
systemctl --user edit mirach
# Añade: Environment=MIRACH_MIC=nombre-de-tu-micro
Sin sonido del altavoz¶
# Verificar que los archivos de voz existen
ls ~/mirach/voices/
# Probar Piper directamente
~/mirach/venv/bin/python -c "
from piper import PiperVoice
voice = PiperVoice.load('voices/tu-voz.onnx')
voice.synthesize_wav('Hola mundo', open('/tmp/test.wav', 'wb'))
"
aplay /tmp/test.wav
La sesión no persiste¶
# Verificar si el ID de sesión está en caché
cat ~/.cache/mirach/session_id
# Limpiar y empezar de cero
rm ~/.cache/mirach/session_id
systemctl --user restart mirach
Uso alto de VRAM¶
# Revisar la VRAM actual
nvidia-smi
# Cambiar a un modelo más pequeño
systemctl --user edit mirach
# Añade: Environment=MIRACH_WHISPER_MODEL=small
# Añade: Environment=MIRACH_WHISPER_COMPUTE=int8
El LLM tarda demasiado¶
Elige un modelo más rápido en la config de opencode (o sobrescríbelo). Para el backend opencode_serve:
systemctl --user edit mirach
# Añade: Environment=MIRACH_OPENCODE_SERVE_MODEL_ID=deepseek-v4-flash-free
Para el backend native, el timeout de la petición es MIRACH_NATIVE_TIMEOUT (por defecto 120s):
El teléfono no se conecta al daemon¶
# El servidor hace bind a 127.0.0.1 por defecto — el teléfono no alcanza loopback.
# Haz bind a todas las interfaces en mirach.env:
echo "MIRACH_SERVER_HOST=0.0.0.0" >> ~/mirach/mirach.env
systemctl --user restart mirach
Luego verifica que el teléfono está en la misma red (LAN o Tailscale) y usa la IP de la PC, no 127.0.0.1. El código de emparejamiento se imprime en los logs del daemon al inicio. Consulta el tutorial de la app de Android.