Home Assistant Voice PE - Custom Wake Words Please!

Hey @TaterTotterson I’m hoping you can clarify where to drop in the code for the custom models.

I’ve taken control of my VoicePE, but get 5 seperate blocks: substitutions, packages, esphome, api, and wifi.

Am I understanding correctly that I can drop your wake word model and wake word sensitivity blocks into that same substituions block?

Also, does this make my VPE require outside internet access? Or is the address of the github model only used during compile? I keep mine fully local.

Disregard this, I took a closer look at your example yaml and figured out how to get these lines in place. Excellent tool here!

Excellent work.
Thank you, I was looking for something like this.
My daughter has a high pitch voice, and she can’t trigger the VA with any of the wake-words, I’m going to try to train a model using her voice to see if I can make her happy.

2 Likes

Hi , I created a custom wake word for myself, and it works fine. However, whenever I say the wake word, there’s always a delay of about 0.5 seconds before the assistant starts. If I use “okay_nabu,” the assistant starts almost instantly with no noticeable delay. I trained it using my own voice samples—how can I make my assistant launch as quickly as “okay_nabu”?

Hi guys

Any idea why the following wake word config bails out on compilation / install:

substitutions:
  name: home-assistant-voice-094bce
  friendly_name: Home Assistant Voice 094bce
packages:
  Nabu Casa.Home Assistant Voice PE: github://esphome/home-assistant-voice-pe/home-assistant-voice.yaml
esphome:
  name: ${name}
  name_add_mac_suffix: false
  friendly_name: ${friendly_name}
api:
  encryption:
    key: .........


wifi:
  ssid: !secret wifi_ssid 
  password: !secret wifi_password

micro_wake_word:
  models:
    - model: https://github.com/TaterTotterson/microWakeWords/blob/628bc036208883bdb725b2eda606a47f7f41bb85/microWakeWords/hey_sarah.json
      id: hey_sarah
      internal: true
    - id: !remove hey_mycroft
    - id: !remove hey_jarvis      

It always throws the following error

INFO ESPHome 2026.2.4
INFO Reading configuration /config/esphome/home-assistant-voice-094bce.yaml...
INFO Updating https://github.com/esphome/home-assistant-voice-pe@dev
INFO Updating https://github.com/esphome/esphome@b49b09b6ae56502aa3ce51be86f90d732d019b2c
WARNING GPIO0 is a strapping PIN and should only be used for I/O with care.
Attaching external pullup/down resistors to strapping pins can cause unexpected failures.
See https://esphome.io/guides/faq/#why-am-i-getting-a-warning-about-strapping-pins
WARNING GPIO3 is a strapping PIN and should only be used for I/O with care.
Attaching external pullup/down resistors to strapping pins can cause unexpected failures.
See https://esphome.io/guides/faq/#why-am-i-getting-a-warning-about-strapping-pins
WARNING GPIO45 is a strapping PIN and should only be used for I/O with care.
Attaching external pullup/down resistors to strapping pins can cause unexpected failures.
See https://esphome.io/guides/faq/#why-am-i-getting-a-warning-about-strapping-pins
Failed config

micro_wake_word: [source /data/packages/dc43710d/home-assistant-voice.yaml:1706]
  id: mww
  microphone: 
    microphone: i2s_mics
    channels: 1
    gain_factor: 4
  stop_after_detection: False
  models: 
    - model: |-
        https://github.com/kahrendt/microWakeWord/releases/download/okay_nabu_20241226.3/okay_nabu.json
      id: okay_nabu
    - model: https://github.com/kahrendt/microWakeWord/releases/download/stop/stop.json
      id: stop
      internal: True
    - 
      Not a valid model name, local path, http(s) url, or github shorthand.
      model: |-
        https://github.com/TaterTotterson/microWakeWords/blob/628bc036208883bdb725b2eda606a47f7f41bb85/microWakeWords/hey_sarah.json
      id: hey_sarah

I mean, this was copy paste from your samples. Just replacing the URL to the JSON file and the “id” to hey_sarah

No idea what’s wrong

Any help appreciated.

Regards,
Oliver

that web address is wrong.
try below weblink


  model: https://raw.githubusercontent.com/TaterTotterson/microWakeWords/628bc036208883bdb725b2eda606a47f7f41bb85/microWakeWords/hey_sarah.json
1 Like

Okaaayyyyy… Thanks for that one. It did the trick; compiled and installed on PE device.
The device is back online and listens to “Okay NABU” So far so good. It’s not bricked at least :slight_smile:

But my 4th MWW “Hey Sarah” does not appear in the dropdown of the ESPHhome device.
Only the standard ones. Nabu, Jarvis & Mycroft.

Strange… Ideas

Regards
Oliver

check logs, maybe there was an error.
i still have doubts about the link i provided but couldnt confirm better

Found it. My fault.

internal: true

was uncool. Removed the line and everything rocks.

Thanks so much for helping.

Now I wait for the moment when HA will integrate all these manual steps into GUI.
Something like

  • Add Micro Wakeword
  • Enter URL for Micro Wake Word JSON File

Then it compiles and does OTA automatically. And it should handle future updates of PE device including the new wake word.

Regards,
Oliver

Hi,

but remember, it makes no difference when you set another sensitivity

beacuse its hardcoded.

If you want it, i use this “workaround” as example…

select:
  - platform: template
    name: "Wake word sensitivity Sarah"    
    optimistic: true
    initial_option: Slightly sensitive
    restore_value: true
    entity_category: config
    options:
      - Slightly sensitive
      - Moderately sensitive
      - Very sensitive
    on_value:
      lambda: |-
        if (x == "Slightly sensitive") {
          id(hey_sarah).set_probability_cutoff(247);   // 0.97 -> 0.563 FAPH on DipCo (Manifest's default)
        } else if (x == "Moderately sensitive") {
          id(hey_sarah).set_probability_cutoff(235);   // 0.92 -> 0.939 FAPH on DipCo
        } else if (x == "Very sensitive") {
          id(hey_sarah).set_probability_cutoff(212);   // 0.83 -> 1.502 FAPH on DipCo
        }

after compiling you have a second dropdown called “Wake word sensitivity Sarah”. Maybe there is a better solution…

Best regards

Add this to the existing dropdown options.

I use two wake words so separate is better in that instance.

As far as I know, I have to insert the entire YAML code into esphome. However, this is problematic if something has changed. Then you have to search for your changes again. The above workaround leaves everything at default.

1 Like

Hello everyone! I’d love to get some help setting up custom wake words, I’ve tried all the YAML configurations in this thread and even tried training my own model, however no mater what I do I really cannot get any of them to work.

This is the last YAML configuration I’ve used:

substitutions:
  name: home-assistant-voice-numbers
  friendly_name: Home Assistant Voice Kitchen

packages:
  Nabu Casa.Home Assistant Voice PE: github://esphome/home-assistant-voice-pe/home-assistant-voice.yaml

esphome:
  name: ${name}
  name_add_mac_suffix: false
  friendly_name: ${friendly_name}

api:
  encryption:
    key: ""

wifi:
  ssid: !secret wifi_ssid 
  password: !secret wifi_password
  fast_connect: true #Added because of multiple AP interference


micro_wake_word:
  models:
    - model: https://raw.githubusercontent.com/Mr-ConQueso/CheesyLabs/refs/heads/main/nero.json
      id: nero
      internal: true
    - model: https://raw.githubusercontent.com/TaterTotterson/microWakeWords/refs/heads/main/microWakeWords/alexa.json
      id: alexa
      internal: true

logger:
  level: VERY_VERBOSE

I have cleared the cache and build files before every build and reset the VPE as described in the documentation; I’d love to at least get Alexa to work as I’m not English and the initial wake words are quite awkward in any other language.

I also tried referencing the Alexa model directly through microWakeWord, along with the internal stop model, as suggested earlier in the thread but alas to no avail.

stop_after_detection: false
  models:
    - model: alexa
      id: alexa
    - model: https://github.com/kahrendt/microWakeWord/releases/download/stop/stop.json
      id: stop
      internal: true

Any help would be greatly appreciated!

here’s what mine (working) looks like:

substitutions:
  name: home-assistant-voice-0a0dfd
  friendly_name: Home Assistant Voice 0a0dfd
packages:
  Nabu Casa.Home Assistant Voice PE: github://esphome/home-assistant-voice-pe/home-assistant-voice.yaml
esphome:
  name: ${name}
  name_add_mac_suffix: false
  friendly_name: ${friendly_name}
api:
  encryption:
    key: a key would be here



wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

micro_wake_word:
  models:
    - model: https://raw.githubusercontent.com/TaterTotterson/microWakeWords/main/microWakeWords/poopy_face.json
    - model: https://raw.githubusercontent.com/1liminal1/xiaozhi-esphome/main/MicroWakeWords/models/BMO/hey_beemo.json
    - model: https://raw.githubusercontent.com/peteh/micro-wake-word-custom-models/refs/heads/main/models/yo_bitch.json
    - model: https://raw.githubusercontent.com/TaterTotterson/microWakeWords/refs/heads/main/microWakeWords/hello_computer.json

So i’d try formatting like that, remove the id: sections etc

    - model: https://raw.githubusercontent.com/Mr-ConQueso/CheesyLabs/refs/heads/main/nero.json
      id: nero

Don’t use the “internal” key for the main models, as it will prevent you from seeing them in the interface and assigning them to a satellite.
“Stop” is a service ww, and its activation and deactivation occurs automatically, so we’re removing it from the visible list.

1 Like

I’ve been using the stock “Hey Jarvis” but it struggles to pickup my wife and daughter. Before I realized I couldn’t perhaps easily replace the stock Hey Jarvis wake word I custom trained on our family’s voices for Hey Jarvis. Now when I adopt the Home Assistant Preview Edition into ESPHome it shows two Hey Jarvis wake words. In the ESPHome integration for the Voice Preview Edition it shows just one Hey Jarvis wake word. I’m not sure if that means both models will be used at the same time and what problems that might cause. Is there a way for me to remove the stock Hey Jarvis and just use my custom one?

How are you guys even taking control of the PE box? I pulled down ESPHome Device builder and it just won’t see it.

It’s not visible by default, but there should be an option to see the device and adopt it.

You mean “Show Discovered Devices”? That doesn’t show anything.

It may be easier faster to just plug it into your computer and flash it with the yaml you want. After that it will be accessible OTA.

Is there like a default yaml for these devices? I tried just adding one via USB and it bricked it. I had to reload it from the website.