Egg Voice Assistant

This my voice assistant design. I have posted the STL file on Thingiverse and the wiring diagram


Great design on the egg! Both retro and futuristic.
Should fit right in to just about any room design.

Thank You!

This is a nice alternative to the usual look of a voice assistant device.

This is fantastic! Thanks for sharing the files. My next project is building some of these voice satellites and was in need of a housing. Never thought one this cool existed!

Will you be posting build instructions and parts list?

2 Likes

The results of the contest are out!
They may be of interest to you :wink:
Have a look!

I’m curious about the LED lighting in this egg, it looks awesome. You listed a part number on the Thingyverse post but that’s a flat ring. You did you make that work with the shape of the egg? and did you use a few of them?

Dear Todd, thanks a lot! I built one as well but I struggled a lot with getting the mesh fixed in the groove. The outer shell helped a lot :slight_smile:
Do you have any recommendations on how to attach it? I used the outer shell and superglue plus activator spray and squeezed it into the groove. But it is neither easy nor perfect as your pictures show.

Thanks again for the great design!
Hubert

Holy moly, this is gorgeous! I’ve wanted to make a smart speaker with integrated LED like this for some time.

Would you be willing to share the configuration file you used?

Can you share where you purchased the mesh fabric?

This would be cool if you could also have a diffuser. “Hey Nabu, make my house smell nice.”

You could do that pretty easily if your diffuser starts when powered on. If that’s the case, add a controlable plug and write a custom sentence with the action to turn that plug on and you are done.

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.

1 Like

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.

1 Like

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

Glo portable wireless speaker

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.

2 Likes