Complete P2 (LLM) and P3 (voice pipeline) implementation

P2 — homeai-llm:
- Fix ollama launchd plist path for Apple Silicon (/opt/homebrew/bin/ollama)
- Add Modelfiles for local GGUF models: llama3.3:70b, qwen3:32b, codestral:22b
  (registered via `ollama create` — no re-download needed)

P3 — homeai-voice:
- Wyoming STT: wyoming-faster-whisper, large-v3 model, port 10300
- Wyoming TTS: custom Kokoro ONNX server (wyoming_kokoro_server.py), port 10301
  Voice af_heart; models at ~/models/kokoro/
- Wake word: openWakeWord daemon (hey_jarvis), notifies OpenClaw at /wake
- launchd plists for all three services + load-all-launchd.sh helper
- Smoke test: wyoming/test-pipeline.sh — 3/3 passing

HA Wyoming integration pending manual UI config (STT 10.0.0.200:10300,
TTS 10.0.0.200:10301).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Aodhan Collins
2026-03-04 23:28:22 +00:00
parent 858d7be33c
commit c31724c92b
12 changed files with 534 additions and 27 deletions

View File

@@ -0,0 +1,35 @@
#!/usr/bin/env bash
# Load (or reload) all homeai-voice launchd services.
set -euo pipefail
LAUNCHD_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/launchd" && pwd)"
LAUNCH_AGENTS=~/Library/LaunchAgents
PLISTS=(
com.homeai.wyoming-stt.plist
com.homeai.wyoming-tts.plist
com.homeai.wakeword.plist
)
for plist in "${PLISTS[@]}"; do
src="${LAUNCHD_DIR}/${plist}"
dst="${LAUNCH_AGENTS}/${plist}"
label="${plist%.plist}"
cp "$src" "$dst"
if launchctl list "$label" &>/dev/null; then
launchctl unload "$dst" 2>/dev/null || true
fi
launchctl load "$dst"
echo "Loaded: $label"
done
echo ""
echo "Status:"
for plist in "${PLISTS[@]}"; do
label="${plist%.plist}"
pid=$(launchctl list "$label" 2>/dev/null | awk 'NR==2{print $1}')
echo " $label — PID: ${pid:--}"
done