I made it work with the egg, it will go around the speaker and has holes to run the wiring through.
If you look at the speaker plate. you can see the holes and how it the it fit in. I mad a model of the ring to design with and placement.
I made it work with the egg, it will go around the speaker and has holes to run the wiring through.
If you look at the speaker plate. you can see the holes and how it the it fit in. I mad a model of the ring to design with and placement.
Yes, still working on a few details, one is the ring to hold the cloth on, Part printed and coat hanger wire.
I did not use any glue. I ad to force the top onto the bottom, which it stays on by friction. I am working on Version 2 which is a little easier to connect.
Mainly extended the top lip and make the bottom a little wider for thicker clothe.
will do, when I get home from work.
Have one with this, like how it defuses the light better.
https://www.amazon.com/gp/product/B09R6CD8NN/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&th=1
This is the one in the video and image, like the look of it better
https://www.amazon.com/gp/product/B0874KZ3JH/ref=ppx_yo_dt_b_asin_image_o01_s00?ie=UTF8&th=1
Going to see how both works together.
here is the config file.
esphome:
name: YouNameIt
friendly_name: Voice Assist 001
on_boot:
- priority: -100
then:
- wait_until: api.connected
- delay: 1s
- if:
condition:
switch.is_on: use_wake_word
then:
- voice_assistant.start_continuous:
esp32:
board: esp32dev
framework:
type: arduino
# Enable logging
logger:
# Enable Home Assistant API
api:
encryption:
key: "B6ancbFLU5aqGUISdyGYrBXrcvC2yudC1AGjCZcGLLA="
ota:
password: "5af7aa7e92f0511d7c88b5acfed240a8"
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
manual_ip:
static_ip: 000.000.000.000
gateway: 000.000.000.000
subnet: 000.000.000.000
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: "ssidName"
password: "ssidPWD"
captive_portal:
i2s_audio:
- id: i2s_in
i2s_lrclk_pin: GPIO26 #WS
i2s_bclk_pin: GPIO25 #SCK
microphone:
- platform: i2s_audio
adc_type: external
pdm: false
id: mic_i2s
channel: right
bits_per_sample: 32bit
i2s_audio_id: i2s_in
i2s_din_pin: GPIO33 #SD Pin from the INMP441 Microphone
media_player:
- platform: i2s_audio
name: "esp_speaker"
id: media_player_speaker
i2s_audio_id: i2s_in
dac_type: external
i2s_dout_pin: GPIO27 #DIN Pin of the MAX98357A Audio Amplifier
mode: mono
voice_assistant:
microphone: mic_i2s
id: va
noise_suppression_level: 2
auto_gain: 31dBFS
volume_multiplier: 2.0
use_wake_word: false
media_player: media_player_speaker
on_wake_word_detected:
- light.turn_on:
id: led_light
on_listening:
- light.turn_on:
id: led_light
effect: "Rainbow Spinner"
# red: 71%
# green: 0%
# blue: 71%
on_stt_end:
- light.turn_on:
id: led_light
effect: "None"
red: 0%
green: 100%
blue: 0%
on_error:
- light.turn_on:
id: led_light
effect: "None"
red: 100%
green: 0%
blue: 0%
- if:
condition:
switch.is_on: use_wake_word
then:
- switch.turn_off: use_wake_word
- delay: 1sec
- switch.turn_on: use_wake_word
on_tts_start: # this is required to play the output on a media player
- homeassistant.service:
service: tts.speak
data:
media_player_entity_id: media_player.YouNameIt_esp_speaker #replace this with your media player entity id
message: !lambda 'return x;'
entity_id: tts.piper_2 #replace this with your piper tts id.
on_client_connected:
- if:
condition:
switch.is_on: use_wake_word
then:
- voice_assistant.start_continuous:
on_client_disconnected:
- if:
condition:
switch.is_on: use_wake_word
then:
- voice_assistant.stop:
on_end:
- light.turn_off:
id: led_light
binary_sensor:
- platform: status
name: API Connection
id: api_connection
filters:
- delayed_on: 1s
on_press:
- if:
condition:
switch.is_on: use_wake_word
then:
- voice_assistant.start_continuous:
on_release:
- if:
condition:
switch.is_on: use_wake_word
then:
- voice_assistant.stop:
switch:
- platform: template
name: Use wake word
id: use_wake_word
optimistic: true
restore_mode: RESTORE_DEFAULT_ON
entity_category: config
on_turn_on:
- lambda: id(va).set_use_wake_word(true);
- if:
condition:
not:
- voice_assistant.is_running
then:
- voice_assistant.start_continuous
on_turn_off:
- voice_assistant.stop
- lambda: id(va).set_use_wake_word(false);
light:
- platform: neopixelbus
id: led_light
type: grb
pin: GPIO32 # DIN pin of the LED Strip
num_leds: 24 # change the Number of LEDS according to your LED Strip.
name: "Light"
variant: ws2812x
default_transition_length: 0.5s
effects:
- addressable_scan:
name: Scan Effect With Custom Values
move_interval: 50ms
scan_width: 2
- addressable_rainbow:
name: Rainbow Spinner
speed: 50
width: 24
- addressable_rainbow:
name: Rainbow Fader
speed: 50
- addressable_random_twinkle:
name: Random Twinkle Effect With Custom Values
twinkle_probability: 50%
progress_interval: 32ms
- addressable_flicker:
name: Flicker Effect With Custom Values
update_interval: 16ms
intensity: 100%
I wound up buying a cheap bluetooth speaker for parts. I use the speaker and diffuser from it. It cost about $5.00
Plus you get some extra parts.
Here is the led ring mounted in the led/speaker plate. The speaker can be mounted in the ring or on top of the diffuser (v.2 - work in progress). in the plate there are holes to run the wires though.
OK wow. The reason for my original question is purely because in this photo:
…it honestly looks like there is practically an LED for each segment of the diffuser. So it does an amazing job from that single ring of LED’s!
Waou! this is really a beautiful project !!
Thank you for sharing it
I’m not sure to understand where you installed the microphone and the speaker.
For the speaker, the picture you posted here helps a lot, I understand that it is in the middle of the led circle, right ?
What kind of 50~51mm speaker would you recommend? A big one like this:
Or a thiner one:
And about the microphone, where did you install it?
I would imagine it on the top of the egg, but I can’t see a dedicated space on your thingiverse model.
Thanks for the precisions
Just asking is there a site to buy already built. Not the tinkering type lol
I designed a small hole in the base for the mike. You can see it in the attached image. I also ran an old usb cable in, which is hard wired to the board.
Do not have a site to buy. Still playing with it in my free time, which I do not have right now. Future versions have a printed ring backed by a trimmed wire hanger to lock the outer screen on.
OK nice!
So the power cable come from this hole and the mic is positioned close to that hole.
And about the speaker, do you have a recommandation?
I’m about to buy the big one on the picture posted above.
THanks
There is a hole for the mic and a hole for the cable, opposite one another. The mic hole as a lip on the inside to place it and melt a little filament to keep it in place.
The speaker I used is close to the larger one. I wound up buying a bluetooth speaker and pulled the speaker out of that. I also used the diffuser from it. I put silver duct tape (the actual metal type) on the inside of the diffuser. It cost about $5.00. Plus you have an extra rgbw and battery to play with.
The speaker can be on top or it can be below.
I have a 10 second delay in any responses. I’ve tried changing models and settings in esphome/whisper/piper.
Any suggestions?
I do not at this moment. I get a quick responses and sometimes some lag. Not sure if it could be a network thing or a cheaper ESP32.
I spent all day trying to speed up recognition and improve detection. I ended up offloading whisper and piper to docker compose in a VM on my server and used linxuserver faster whisper to enable GPU support… it’s seemless speed between any other off the shelf device now.
The link above is a good example. I’ve tried larger models such as turbo but need to improve my graphics card. If the assist pipeline fails with an sst message it’s most likely due to hardware limitations running models locally.
Can you post your docker-compose.yaml file? Mainly for open-wakeword, piper, whisper, and GPU setup.
Thanks!
whisper:
container_name: whisper
image: lscr.io/linuxserver/faster-whisper:latest
### GPU uncomment to use GPU prefer tensor core capable unit
# runtime: nvidia
# deploy:
# resources:
# reservations:
# devices:
# - driver: nvidia
# count: 1
# capabilities: [gpu]
environment:
- PUID=1000
- PGID=1000
- TZ=Etc/UTC
- WHISPER_MODEL=tiny.int8 #base.int8
# - NVIDIA_VISIBLE_DEVICES=all # Allows all GPUs; adjust as needed
# - NVIDIA_DRIVER_CAPABILITIES=all
volumes:
- /share/whisper-piper/whisper-data:/data
ports:
- 10300:10300
restart: unless-stopped
piper:
container_name: piper
image: rhasspy/wyoming-piper:latest
command:
--voice en-us-ryan-high
volumes:
- /share/whisper-piper/piper-data:/data
environment:
- TZ=UTC
restart: unless-stopped
ports:
- 10200:10200
# openwakeword:
# container_name: openwakeword
# image: rhasspy/wyoming-openwakeword:latest
# volumes:
# - /share/whisper-piper/openwakeword:/data
# - /share/whisper-piper/openwakeword/custom:/custom
# runtime: nvidia
# deploy:
# resources:
# reservations:
# devices:
# - driver: nvidia
# count: 1
# capabilities: [gpu]
# environment:
# - NVIDIA_VISIBLE_DEVICES=all
# - NVIDIA_DRIVER_CAPABILITIES=all
# - TZ=UTC
# - PROBABILITY_THRESHOLD=0.2 # Adjust this value
# - MINIMUM_MATCHES=1 # Adjust this value
# - MODEL_PATH=/custom/lambda.tflite
# - MODEL_TYPE=tflite
# command:
# - --preload-model=lambda # Specify your custom wake word name
# - --custom-model-dir=/custom # Directory inside the container for custom models
# restart: unless-stopped
# ports:
# - 10400:10400
WORD OF CAUTION!!! IF YOU HAVE OPENWAKEWORD ADD-ON AND AN EXTERNAL OPENWAKEWORD INSTANCE VIA WYOMING IT WILL CAUSE ISSUES WITH HOME ASSISTANT. VOICE ASSISTANT WILL TRY TO CONNECT TO BOTH AND SINCE IT DISCONNETS AND CONNECTS OFTEN IT WILL CAUSE VOICE TO BE UNUSABLE.
It took me a while to figure ouw that was going on above just fyi.
Training custom wakewords can be done via searching “automatic model training simple google colab”. I’d highly recommend google colab and purchasing 100 credits for 10 dollars. Use the A100 instance and you should be able to train 5-6 models for 10 dollars. I trained 2 and still had 60+ credits left… note to pay attention though because if you keep the instance spun up it will drain your credits even though it is not doing anything.