- Add openclaw-http-bridge.py: HTTP server translating POST requests to OpenClaw CLI calls - Add launchd plist for HTTP bridge (port 8081, auto-start) - Add install-to-docker-ha.sh: deploy custom component to Docker HA via SSH - Add package-for-ha.sh: create distributable tarball of custom component - Add test-services.sh: comprehensive voice pipeline service checker Fixes from code review: - Use OpenClawAgent (HTTP) in async_setup_entry instead of OpenClawCLIAgent (CLI agent fails inside Docker HA where openclaw binary doesn't exist) - Update all port references from 8080 to 8081 (HTTP bridge port) - Remove overly permissive CORS headers from HTTP bridge - Fix zombie process leak: kill child process on CLI timeout - Remove unused subprocess import in conversation.py - Add version field to Kokoro TTS Wyoming info - Update TODO.md with voice pipeline progress
11 KiB
Voice Pipeline Setup Guide
Complete guide to setting up the end-to-end voice pipeline with OpenClaw integration
Network Configuration
Important: Services are split across two machines:
| Service | Port | Location |
|---|---|---|
| Wyoming STT (Whisper large-v3) | 10300 | Mac Mini (10.0.0.101) |
| Wyoming TTS (Kokoro ONNX) | 10301 | Mac Mini (10.0.0.101) |
| Wyoming Satellite | 10700 | Mac Mini (10.0.0.101) |
| openWakeWord | - | Mac Mini (10.0.0.101) |
| OpenClaw Gateway | 8080 | Mac Mini (10.0.0.101) |
| Ollama | 11434 | Mac Mini (10.0.0.101) |
| Home Assistant (Docker) | 8123 | Server (10.0.0.199) |
All integrations must point to 10.0.0.101 (Mac Mini), not 10.0.0.199 (HA server).
Current Status
✅ Services Running on Mac Mini (10.0.0.101)
| Service | Port | Status |
|---|---|---|
| Wyoming STT | 10300 | ✅ Running |
| Wyoming TTS | 10301 | ✅ Running |
| Wyoming Satellite | 10700 | ✅ Running |
| openWakeWord | - | ✅ Running |
| OpenClaw Gateway | 8080 | ✅ Running |
| Ollama | 11434 | ✅ Running |
✅ Completed
- Wyoming STT/TTS services installed and running
- Wyoming Satellite installed and running
- OpenClaw agent configured with home-assistant skill
- Custom OpenClaw conversation component created
🔄 Next Steps
- Install OpenClaw conversation component in Home Assistant
- Configure Wyoming integrations in HA
- Create voice assistant pipeline with OpenClaw
- Test the full voice loop
Step 1: Install OpenClaw Conversation Component
Home Assistant is running in Docker on server 10.0.0.199. Use the automated installation script.
Option A: Automated Installation (Recommended)
# From Mac Mini, run the installation script
cd ~/gitea/homeai/homeai-agent/custom_components
./install-to-docker-ha.sh
# The script will:
# 1. Create a tarball of the component
# 2. Copy it to the HA server via SCP
# 3. Extract it into the HA Docker container
# 4. Provide next steps
Requirements:
- SSH access to 10.0.0.199
- SSH keys configured (or password access)
Option B: Manual Installation via SSH
# 1. Create tarball
cd ~/gitea/homeai/homeai-agent/custom_components
tar -czf openclaw_conversation.tar.gz openclaw_conversation/
# 2. Copy to HA server
scp openclaw_conversation.tar.gz 10.0.0.199:/tmp/
# 3. SSH to HA server and install
ssh 10.0.0.199
CONTAINER=$(docker ps --filter "name=homeassistant" --format "{{.Names}}" | head -n 1)
docker cp /tmp/openclaw_conversation.tar.gz $CONTAINER:/tmp/
docker exec $CONTAINER sh -c 'cd /config/custom_components && tar -xzf /tmp/openclaw_conversation.tar.gz'
docker restart $CONTAINER
Option D: Using Home Assistant File Editor (Manual)
- Open Home Assistant UI at http://10.0.0.199:8123
- Install the File Editor add-on if not already installed
- Create directory:
/config/custom_components/openclaw_conversation/ - Copy each file from
homeai-agent/custom_components/openclaw_conversation/:__init__.pyconfig_flow.pyconst.pyconversation.pymanifest.jsonstrings.json
Verify Installation
After installation, restart Home Assistant:
# Via SSH
ssh 10.0.0.199 'docker restart homeassistant'
# Or via HA UI
# Settings → System → Restart
Check logs for any errors:
- Settings → System → Logs
- Look for "OpenClaw Conversation" in the logs
Step 2: Configure Wyoming Integrations
Add Wyoming STT (Speech-to-Text)
- Go to Settings → Devices & Services → Add Integration
- Search for "Wyoming Protocol"
- Configure:
- Host:
10.0.0.101⚠️ Mac Mini IP, not HA server IP (10.0.0.199) - Port:
10300 - Name:
Mac Mini STT
- Host:
- Click Submit
Add Wyoming TTS (Text-to-Speech)
- Click Add Integration again
- Search for "Wyoming Protocol"
- Configure:
- Host:
10.0.0.101⚠️ Mac Mini IP - Port:
10301 - Name:
Mac Mini TTS
- Host:
- Click Submit
Add Wyoming Satellite
- Click Add Integration again
- Search for "Wyoming Protocol"
- Configure:
- Host:
10.0.0.101⚠️ Mac Mini IP - Port:
10700 - Name:
Mac Mini Living Room
- Host:
- Click Submit
Verify Integrations
All three Wyoming integrations should appear in Settings → Devices & Services.
Step 3: Add OpenClaw Conversation Agent
Via UI (Recommended)
- Go to Settings → Devices & Services → Add Integration
- Search for "OpenClaw Conversation"
- Configure:
- OpenClaw Host:
10.0.0.101⚠️ Mac Mini IP, not HA server IP (10.0.0.199) - OpenClaw Port:
8080 - Agent Name:
main - Timeout:
30seconds
- OpenClaw Host:
- Click Submit
Via YAML (Alternative)
Add to /config/configuration.yaml:
openclaw_conversation:
openclaw_host: 10.0.0.101 # Mac Mini IP
openclaw_port: 8080
agent_name: main
timeout: 30
Then restart Home Assistant.
Step 4: Create Voice Assistant Pipeline
- Go to Settings → Voice Assistants
- Click Add Assistant
- Configure:
- Name:
HomeAI with OpenClaw - Language:
English - Speech-to-Text: Select
Mac Mini STT(Wyoming) - Conversation Agent: Select
OpenClaw Conversation - Text-to-Speech: Select
Mac Mini TTS(Wyoming)
- Name:
- Click Create
Set as Default
- In Settings → Voice Assistants
- Click the three dots next to "HomeAI with OpenClaw"
- Select Set as preferred
Step 5: Test the Pipeline
Test 1: Text Input → TTS Output
- Open Home Assistant UI
- Click the Assist icon (microphone) in the top-right corner
- Type:
"What time is it?" - Press Enter
Expected Result: You should hear a spoken response via Kokoro TTS
Test 2: Voice Input → OpenClaw → TTS Output
-
Ensure Wyoming Satellite is running on Mac Mini:
launchctl list | grep wyoming-satellite -
Say the wake word: "Hey Jarvis"
-
Wait for the beep/acknowledgment
-
Speak: "What time is it?"
Expected Result: You should hear a spoken response
Test 3: Home Assistant Control via Voice
- Say: "Hey Jarvis"
- Speak: "Turn on the reading lamp"
Expected Result:
- OpenClaw processes the request
- Home Assistant skill executes the action
- Light turns on
- You hear a confirmation via TTS
Troubleshooting
Issue: OpenClaw Conversation not appearing in integrations
Solution:
- Verify files are in
/config/custom_components/openclaw_conversation/ - Check Home Assistant logs for errors
- Ensure
manifest.jsonis valid JSON - Restart Home Assistant
Issue: Wyoming services not connecting
Solution:
-
Verify services are running on Mac Mini:
launchctl list | grep wyoming nc -z 10.0.0.199 10300 # Test STT nc -z 10.0.0.199 10301 # Test TTS nc -z 10.0.0.199 10700 # Test Satellite -
Check firewall rules on Mac Mini
-
Verify Home Assistant can reach Mac Mini network
Issue: OpenClaw not responding
Solution:
-
Verify OpenClaw is running:
launchctl list | grep openclaw pgrep -f openclaw -
Test OpenClaw CLI directly:
openclaw agent --message "Hello" --agent main -
Check OpenClaw logs:
tail -f /tmp/homeai-openclaw.log -
Verify OpenClaw can reach Home Assistant:
curl http://10.0.0.199:8123/api/
Issue: No audio output from satellite
Solution:
-
Check satellite logs:
tail -f /tmp/homeai-wyoming-satellite.log -
Test audio output:
afplay /System/Library/Sounds/Glass.aiff -
Verify SoX is installed:
which play brew install sox
Issue: Wake word not detected
Solution:
-
Check wakeword service:
launchctl list | grep wakeword -
Test microphone input:
# Record a test rec -r 16000 -c 1 test.wav trim 0 5 -
Adjust wake word threshold in satellite config
Voice Pipeline Flow
┌─────────────────┐
│ USB Mic │
│ (Mac Mini) │
└────────┬────────┘
│
▼
┌─────────────────┐
│ Wake Word │
│ Detection │
│ (hey_jarvis) │
└────────┬────────┘
│ wake detected
▼
┌─────────────────┐
│ Wyoming │
│ Satellite │
│ :10700 │
└────────┬────────┘
│ audio stream
▼
┌─────────────────┐
│ Wyoming STT │
│ (Whisper) │
│ :10300 │
└────────┬────────┘
│ transcript
▼
┌─────────────────┐
│ Home Assistant │
│ Voice Pipeline │
└────────┬────────┘
│ text
▼
┌─────────────────┐
│ OpenClaw │
│ Conversation │
│ Agent │
└────────┬────────┘
│ message
▼
┌─────────────────┐
│ OpenClaw │
│ Gateway │
│ :8080 │
└────────┬────────┘
│
▼
┌─────────────────┐
│ Ollama LLM │
│ + Skills │
│ :11434 │
└────────┬────────┘
│ response
▼
┌─────────────────┐
│ Wyoming TTS │
│ (Kokoro) │
│ :10301 │
└────────┬────────┘
│ audio
▼
┌─────────────────┐
│ Speaker │
│ (Mac Mini) │
└─────────────────┘
Next Steps After Setup
- Install Chatterbox TTS for voice cloning
- Set up mem0 for long-term memory
- Configure n8n workflows for automation
- Add Uptime Kuma monitors for all services
- Begin ESP32 satellite setup (Phase 4)
Files Reference
| File | Purpose |
|---|---|
homeai-agent/custom_components/openclaw_conversation/ |
Custom HA component |
homeai-agent/skills/home-assistant/openclaw_bridge.py |
Bridge script |
homeai-voice/scripts/launchd/ |
Service plists |
plans/ha-voice-pipeline-implementation.md |
Detailed implementation plan |
plans/voice-loop-integration.md |
Architecture options |
Success Criteria
- Wyoming STT/TTS/Satellite appear in HA integrations
- OpenClaw Conversation agent appears in HA integrations
- Voice assistant pipeline created with OpenClaw
- Typed query in Assist returns spoken response
- Voice query via satellite returns spoken response
- "Turn on the reading lamp" command works end-to-end
- Latency under 5 seconds from wake to response
- All services survive Mac Mini reboot