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:
34
homeai-voice/scripts/launchd/com.homeai.wakeword.plist
Normal file
34
homeai-voice/scripts/launchd/com.homeai.wakeword.plist
Normal file
@@ -0,0 +1,34 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
|
||||
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>Label</key>
|
||||
<string>com.homeai.wakeword</string>
|
||||
|
||||
<key>ProgramArguments</key>
|
||||
<array>
|
||||
<string>/Users/aodhan/homeai-voice-env/bin/python3</string>
|
||||
<string>/Users/aodhan/gitea/homeai/homeai-voice/wyoming/wakeword_daemon.py</string>
|
||||
<string>--wake-word</string>
|
||||
<string>hey_jarvis</string>
|
||||
<string>--notify-url</string>
|
||||
<string>http://localhost:8080/wake</string>
|
||||
</array>
|
||||
|
||||
<key>RunAtLoad</key>
|
||||
<true/>
|
||||
|
||||
<key>KeepAlive</key>
|
||||
<true/>
|
||||
|
||||
<key>StandardOutPath</key>
|
||||
<string>/tmp/homeai-wakeword.log</string>
|
||||
|
||||
<key>StandardErrorPath</key>
|
||||
<string>/tmp/homeai-wakeword-error.log</string>
|
||||
|
||||
<key>ThrottleInterval</key>
|
||||
<integer>10</integer>
|
||||
</dict>
|
||||
</plist>
|
||||
43
homeai-voice/scripts/launchd/com.homeai.wyoming-stt.plist
Normal file
43
homeai-voice/scripts/launchd/com.homeai.wyoming-stt.plist
Normal file
@@ -0,0 +1,43 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
|
||||
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>Label</key>
|
||||
<string>com.homeai.wyoming-stt</string>
|
||||
|
||||
<key>ProgramArguments</key>
|
||||
<array>
|
||||
<string>/Users/aodhan/homeai-voice-env/bin/wyoming-faster-whisper</string>
|
||||
<string>--uri</string>
|
||||
<string>tcp://0.0.0.0:10300</string>
|
||||
<string>--model</string>
|
||||
<string>large-v3</string>
|
||||
<string>--language</string>
|
||||
<string>en</string>
|
||||
<string>--device</string>
|
||||
<string>cpu</string>
|
||||
<string>--compute-type</string>
|
||||
<string>int8</string>
|
||||
<string>--data-dir</string>
|
||||
<string>/Users/aodhan/models/whisper</string>
|
||||
<string>--download-dir</string>
|
||||
<string>/Users/aodhan/models/whisper</string>
|
||||
</array>
|
||||
|
||||
<key>RunAtLoad</key>
|
||||
<true/>
|
||||
|
||||
<key>KeepAlive</key>
|
||||
<true/>
|
||||
|
||||
<key>StandardOutPath</key>
|
||||
<string>/tmp/homeai-wyoming-stt.log</string>
|
||||
|
||||
<key>StandardErrorPath</key>
|
||||
<string>/tmp/homeai-wyoming-stt-error.log</string>
|
||||
|
||||
<key>ThrottleInterval</key>
|
||||
<integer>10</integer>
|
||||
</dict>
|
||||
</plist>
|
||||
36
homeai-voice/scripts/launchd/com.homeai.wyoming-tts.plist
Normal file
36
homeai-voice/scripts/launchd/com.homeai.wyoming-tts.plist
Normal file
@@ -0,0 +1,36 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
|
||||
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>Label</key>
|
||||
<string>com.homeai.wyoming-tts</string>
|
||||
|
||||
<key>ProgramArguments</key>
|
||||
<array>
|
||||
<string>/Users/aodhan/homeai-voice-env/bin/python3</string>
|
||||
<string>/Users/aodhan/gitea/homeai/homeai-voice/tts/wyoming_kokoro_server.py</string>
|
||||
<string>--uri</string>
|
||||
<string>tcp://0.0.0.0:10301</string>
|
||||
<string>--voice</string>
|
||||
<string>af_heart</string>
|
||||
<string>--speed</string>
|
||||
<string>1.0</string>
|
||||
</array>
|
||||
|
||||
<key>RunAtLoad</key>
|
||||
<true/>
|
||||
|
||||
<key>KeepAlive</key>
|
||||
<true/>
|
||||
|
||||
<key>StandardOutPath</key>
|
||||
<string>/tmp/homeai-wyoming-tts.log</string>
|
||||
|
||||
<key>StandardErrorPath</key>
|
||||
<string>/tmp/homeai-wyoming-tts-error.log</string>
|
||||
|
||||
<key>ThrottleInterval</key>
|
||||
<integer>10</integer>
|
||||
</dict>
|
||||
</plist>
|
||||
35
homeai-voice/scripts/load-all-launchd.sh
Executable file
35
homeai-voice/scripts/load-all-launchd.sh
Executable 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
|
||||
Reference in New Issue
Block a user