"Failed to connect" error when adding Speech-to-Phrase to Wyoming Integration in Home Assistant Docker

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.