
Для реализации проекта нам понадобится:
ESP32: https://alii.pub/6xmijf?erid=2SDnjdVYACh
Микрофон INMP441: https://alii.pub/6xmikz?erid=2SDnjdkN329
Усилитель D класса MAX98357: https://alii.pub/6xmiq8?erid=2SDnjcHs5SR
Динамик: https://alii.pub/6xmisr?erid=2SDnjchasww
Адресные светодиоды ws2812b: https://alii.pub/6xmini?erid=2SDnjbohK5s
Прежде чем приступить к материалу, я Вас попрошу, если нравится то, что я делаю и хотите следить за моей деятельностью, то рекомендую подписаться на мой телеграмм канал: https://t.me/ypavla
Там я публикую новости о вышедших видео, статьях и разные устройства для умного дома и не только показываю.
Спасибо за внимание, теперь продолжим.
В этой статье сделаем умную колонку с микрофоном на esp32, которая будет управлять умным домом Home Assistant через голосовые команды.
Для начала у Вас должен быть настроен Home Assistant для управления голосом. Как это сделать я описал в этой статье:
Управление голосом умным домом Home Assistant с помощью Whisper и Wyoming
И так-же сделал про эту настройку видео:
После этого нужно собрать по схеме все элементы на которые я оставил ссылки в начале статьи.
А именно Взять саму плату ESP32, к ней подключить микрофон INMP441 по шине i2s, так-же по этой шине подключить усилитель MAX98357. К усилителю подключить динамик. И взять еще несколько светодиодов ws2812b из ленты ну и подключить все по схеме:

| ESP32 | INMP441 Microphone | Speaker | W2812B LED Strip | 
|---|---|---|---|
| Vin (5v) | Vin | 5v pin | |
| GND | Gnd | GND | |
| GPIO 27 | DIN | ||
| GPIO 26 | WS | LRC | |
| GPIO 25 | SCK | BCLK | |
| GPIO 33 | SD | ||
| 3v3 | VDD | ||
| GND | GND & L/R | ||
| GPIO 32 | DIN | 
Когда все подключите по схеме, В ESPHome нужно подготовить код, который будет выглядеть примерно так:
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: 4.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: "Scan Effect With Custom Values"
        red: 63%
        green: 13%
        blue: 93%
  
  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"
    - if:
        condition:
          switch.is_on: use_wake_word
        then:
          - switch.turn_off: use_wake_word
          - delay: 1sec 
          - switch.turn_on: use_wake_word      
  
  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: 9      # 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
       
Так-же существует корпус для печати на 3д принтере. Его скачать можно отсюда: https://www.thingiverse.com/thing:6329167
После этого микрофон подключенный к ESP32 будет постоянно слушать “окружающую среду” и как только услышит команду активации, дальше начнет транслировать вашу голосовую команду в сам Home Assistant.
Взят пример их этой статьи: https://smarthomecircle.com/created-voice-assistant-esp32-with-wake-word-in-home-assistant