Unfortunately, I am fairly new to Linux, so I set up my server using ZimaOS, which made it easy to get started with a file server, but presents many challenges when attempting anything remotely custom. I have Wyoming Protocol and Home Assistant installed as dockers and have been trying out the HA Voice Assistant Preview to move away from Google. I got everything working using Whisper for STT and Piper for TTS, but Whisper takes roughly 6 seconds to process any voice command. This is definitely not ideal when I just want to turn on and off the lights for the most part.
I heard Speech-to-Phrase was much faster for simple commands, so my plan was to set up one Voice Assistant using that to control HA devices, but have Whisper run on a separate VA if I still want to ask more complex questions. However, I cannot for the life of me get Speech-to-Phrase added to the Wyoming Protocol integration in HA. Every configuration I’ve tried has just resulted in “Failed to connect”, yet Whisper and Piper have connected with absolutely no issues. Here is my YAML for the Wyoming Protocol:
networks:
default:
name: renewed_dennis_default
ipam: {}
external: false
services:
piper:
command:
- --voice
- fr-siwis-medium
container_name: piper
entrypoint: null
image: rhasspy/wyoming-piper
networks:
- default
ports:
- mode: ingress
target: 10200
published: "10200"
protocol: tcp
restart: unless-stopped
volumes:
- type: bind
source: /tmp/casaos-compose-app-3570447042/piper-data
target: /data
bind:
create_host_path: true
speech-to-phrase:
command:
- --hass-websocket-uri
- ws://192.168.0.236:8123/api/websocket
- --hass-token
- eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJiZWZkOGE4MmZkMmE0NDM4OTBiZjMzYzUyZmUyYmI5MyIsImlhdCI6MTc4OTk2NDU3OSwiZXhwIjoyMTA1MzI0NTc5fQ.LDqcR81EvJybi4N4xXryr_h7J-4T_6NJW6KmtSS_juw
- --retrain-on-start
container_name: speech-to-phrase
deploy:
resources:
limits:
cpus: "1.00"
memory: 7.68GB
reservations:
cpus: "0.00"
memory: 512MB
placement: {}
entrypoint: null
image: rhasspy/wyoming-speech-to-phrase:latest
networks:
- default
ports:
- mode: ingress
target: 10400
published: "10400"
protocol: tcp
restart: unless-stopped
volumes:
- type: bind
source: /tmp/casaos-compose-app-2921235997/models
target: /models
bind:
create_host_path: true
- type: bind
source: /tmp/casaos-compose-app-2921235997/train
target: /train
bind:
create_host_path: true
whisper:
command:
- --model
- medium-int8
- --language
- en
container_name: whisper
entrypoint: null
image: rhasspy/wyoming-whisper
networks:
- default
ports:
- mode: ingress
target: 10300
published: "10300"
protocol: tcp
restart: unless-stopped
volumes:
- type: bind
source: /tmp/casaos-compose-app-3570447042/whisper-data
target: /data
bind:
create_host_path: true
x-casaos:
hostname: 192.168.0.236
index: /
is_uncontrolled: false
main: whisper
port_map: "10300"
scheme: http
store_app_id: renewed_dennis
title:
custom: Wyoming Integration
I looked at the logs generated when I started up the docker instance, but I don’t see anything that jumps out to me as a failure. It seems like Speech-to-Phrase runs fine and is able to connect to my HA instance and trains its model just fine.
speech-to-phrase | 2026-09-21 04:25:30,794 - INFO:root: Ready
speech-to-phrase | 2026-09-21 04:25:37,192 - INFO:speech_to_phrase.train: Started training: en_US-rhasspy
speech-to-phrase | 2026-09-21 04:25:38,861 - WARNING:speech_to_phrase.train_kaldi: Guessing pronunciation for subwoofer
speech-to-phrase | 2026-09-21 04:25:41,096 - INFO:speech_to_phrase.train: Finished training: en_US-rhasspy
speech-to-phrase | Traceback (most recent call last):
speech-to-phrase | File "<frozen runpy>", line 198, in _run_module_as_main
speech-to-phrase | File "<frozen runpy>", line 88, in _run_code
speech-to-phrase | File "/usr/src/.venv/lib/python3.11/site-packages/speech_to_phrase/__main__.py", line 191, in <module>
speech-to-phrase | asyncio.run(main())
speech-to-phrase | File "/usr/lib/python3.11/asyncio/runners.py", line 190, in run
speech-to-phrase | return runner.run(main)
speech-to-phrase | ^^^^^^^^^^^^^^^^
speech-to-phrase | File "/usr/lib/python3.11/asyncio/runners.py", line 118, in run
speech-to-phrase | return self._loop.run_until_complete(task)
speech-to-phrase | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
speech-to-phrase | File "/usr/lib/python3.11/asyncio/base_events.py", line 653, in run_until_complete
speech-to-phrase | return future.result()
speech-to-phrase | ^^^^^^^^^^^^^^^
speech-to-phrase | File "/usr/src/.venv/lib/python3.11/site-packages/speech_to_phrase/__main__.py", line 96, in main
speech-to-phrase | await _retrain_once(state, force_retrain=True)
speech-to-phrase | File "/usr/src/.venv/lib/python3.11/site-packages/speech_to_phrase/__main__.py", line 131, in _retrain_once
speech-to-phrase | hass_info = await get_hass_info(
speech-to-phrase | ^^^^^^^^^^^^^^^^^^^^
speech-to-phrase | File "/usr/src/.venv/lib/python3.11/site-packages/speech_to_phrase/hass_api.py", line 279, in get_hass_info
speech-to-phrase | assert msg["success"], msg
speech-to-phrase | AssertionError: {'id': 2, 'type': 'result', 'success': False, 'error': {'code': 'unknown_command', 'message': 'Unknown command.'}}
speech-to-phrase | 2026-09-21 04:25:49,579 - INFO:root: Ready
speech-to-phrase | 2026-09-21 04:25:49,579 - INFO:speech_to_phrase.train: Started training: en_US-rhasspy
speech-to-phrase | 2026-09-21 04:25:51,225 - WARNING:speech_to_phrase.train_kaldi: Guessing pronunciation for subwoofer
speech-to-phrase | 2026-09-21 04:25:53,255 - INFO:speech_to_phrase.train: Finished training: en_US-rhasspy
Any help would be appreciated, and let me know if there is any additional information I can provide. I am just at a loss for what to check next.