Projet d'un débutant : Voice Control korvo / afficheur lcd-tactile

Tiens nous au courant :wink:

Sorry, j’ai zappé une partie de mon code :unamused:

  on_tts_end:
        - homeassistant.service:
            service: media_player.play_media
            data:
               entity_id: media_player.xxxxx
               media_content_id: !lambda 'return x;'
               media_content_type: music
               announce: "true"
        - delay : 10s
        - homeassistant.service:
           service: tts.clear_cache

Par contre, même sans le tts.clear.cache, il ne m’a jamais enchainé toutes les réponses mises en cache :thinking:

1 « J'aime »

Merci @Krull56,
En rentrant je vais regarder mais je pense que la Freebox révolution contient des HP et doit donc pouvoir servir aussi de média player, ce pourrait être une solution en attendant mieux.
Je vais regarder l’intégration Freebox, je pense qu’elle est déjà détectée par HA mais je n’ai jamais utilisé.
Bob

J’ai activé l’intégration Freebox mais pas de média player Freebox !
Je poursuis plu tard :wink:
Bob

Avez vous reussi a faire fonctionner l’assistant vocal ?

j’ai suivi tout le tuto mais pas moyen de le faire reagir avec le mot de reveil.

de plus jai une erreur lors du flash

Pin 0 is used in multiple place
i2s_audio:

id: codec
i2s_lrclk_pin: GPIO22
i2s_bclk_pin: GPIO25
i2s_mclk_pin: GPIO0
Pin 0 is used in multiple place
id: mic_adc
i2s_lrclk_pin: GPIO26
i2s_bclk_pin: GPIO27
i2s_mclk_pin: GPIO0

merci de vos retour

Hello,

ESPHOME verifie maintenant l’unité des pins utilisées, il faut ajouter un parametre allow other uses
Exemple :

i2s_audio:
  - id: codec
    i2s_lrclk_pin: GPIO22
    i2s_bclk_pin: GPIO25
    i2s_mclk_pin: 
      number: GPIO0
      allow_other_uses: true
  - id: mic_adc
    i2s_lrclk_pin: GPIO26
    i2s_bclk_pin: GPIO27
    i2s_mclk_pin: 
      number: GPIO0
      allow_other_uses: true

Pour le reste tu as un gros fil sur le sujet ici : Projet voice control - Entraide Home Assistant - Home Assistant Communauté Francophone (hacf.fr) ou encore ici : Year of the voice - Chapitre 5, c’est ce mercredi - Communauté HACF / BlaBlaBla & Suggestions - Home Assistant Communauté Francophone

@+

ok merci je vais deja corriger ce bug et voir si cela change

bon on n’a pas beaucoup evoluéé

T’as encore une erreur de compilation ?
T’es pas très bavard en explications :wink:

Publie ton code stp.

Sinon, Assist fonctionne déjà bien depuis le dashboard ou smartphone et reconnait les commandes vocales ?

non pas d’erreur de compillation

pour le code

substitutions:

##### WIFI SETUP #####
###### CHANGE ME START ######
  device_name: "esp32korvo_mic" 
  wifi_ssid: !secret wifi_ssid
  wifi_password: !secret wifi_password
  apikey: !secret enc_key_esp32korvo_mic

##### CHANGE ME END #####

esphome:
  name: ${device_name}
  min_version: 2023.11.0
  platformio_options:
    board_build.flash_mode: dio
  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: esp-wrover-kit
  framework:
    type: arduino
    version: recommended

external_components:
  - source: github://rpatel3001/esphome@es8311
    components: [ es8311 ]
  - source: github://rpatel3001/esphome@es7210
    components: [ es7210 ]
  - source: github://pr#5230
    components:
      - esp_adf

# Enable logging
logger:
  level: VERBOSE
##### API KEY #####
api:
  encryption:
    key: ${apikey}
    
##### OTA PASSWORD #####
ota:
  password: ${wifi_password}
  safe_mode: true
  reboot_timeout: 3min
  num_attempts: 3

text_sensor:
  - platform: wifi_info
    ip_address:
      name: "${device_name} IP Address"

time:
  platform: homeassistant
  id: homeassistant_time

#### WIFI PASSWORD ###
wifi:
  networks:
    - id: wifi_default
      ssid: ${wifi_ssid}
      password: ${wifi_password}
  use_address: 192.168.42.159

  ap:
    ssid: ${device_name}
    password: ${wifi_password}

i2c:
  sda: GPIO19
  scl: GPIO32
  scan: true
  frequency: 400kHz

es8311:
  address: 0x18

es7210:
  address: 0x40

output:
  - platform: gpio
    id: pa_ctrl
    pin: GPIO12

i2s_audio:
  - id: codec
    i2s_lrclk_pin: GPIO22
    i2s_bclk_pin: GPIO25
    i2s_mclk_pin:
      number: GPIO0
      allow_other_uses: true
  - id: mic_adc
    i2s_lrclk_pin: GPIO26
    i2s_bclk_pin: GPIO27
    i2s_mclk_pin:
      number: GPIO0
      allow_other_uses: true

speaker:
  - platform: i2s_audio
    id: external_speaker
    dac_type: external
    i2s_audio_id: codec
    i2s_dout_pin: GPIO13
    mode: mono

microphone:
  - platform: i2s_audio
    id: external_mic
    adc_type: external
    i2s_audio_id: mic_adc
    i2s_din_pin: GPIO36
    pdm: false

voice_assistant:
  id: voice_asst
  microphone: external_mic
  speaker: external_speaker
  noise_suppression_level: 2
  auto_gain: 15dBFS
  volume_multiplier: 0.5
  use_wake_word: false
  on_listening:
    - light.turn_on:
        id: led_ring
        blue: 100%
        red: 0%
        green: 0%
        brightness: 100%
        effect: wakeword
  on_tts_start:
    - light.turn_on:
        id: led_ring
        blue: 0%
        red: 0%
        green: 100%
        brightness: 50%
        effect: pulse
  on_end:
    - delay: 100ms
    - wait_until:
        not:
          speaker.is_playing:
    - script.execute: reset_led
  on_error:
    - light.turn_on:
        id: led_ring
        blue: 0%
        red: 100%
        green: 0%
        brightness: 100%
        effect: none
    - delay: 1s
    - script.execute: reset_led
    - script.wait: reset_led
    - lambda: |-
        if (code == "wake-provider-missing" || code == "wake-engine-missing") {
          id(use_wake_word).turn_off();
        }

script:
  - id: reset_led
    then:
      - if:
          condition:
            switch.is_on: use_wake_word
          then:
            - light.turn_on:
                id: led_ring
                blue: 30%
                red: 0%
                green: 0%
                brightness: 25%
                effect: none
          else:
            - light.turn_off: led_ring

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(voice_asst).set_use_wake_word(true);
      - if:
          condition:
            not:
              - voice_assistant.is_running
          then:
            - voice_assistant.start_continuous
      - script.execute: reset_led
    on_turn_off:
      - voice_assistant.stop
      - script.execute: reset_led

# Restart option
  - platform: restart
    name: "${device_name} Restart"

light:
  - platform: esp32_rmt_led_strip
    id: led_ring
    name: "${device_name} Light"
    pin: GPIO33
    num_leds: 12
    rmt_channel: 0
    rgb_order: GRB
    chipset: ws2812
    default_transition_length: 0s
    effects:
      - pulse:
          name: "Pulse"
          transition_length: 0.5s
          update_interval: 0.5s
      - addressable_twinkle:
          name: "Working"
          twinkle_probability: 5%
          progress_interval: 4ms
      - addressable_color_wipe:
          name: "Wakeword"
          colors:
            - red: 28%
              green: 100%
              blue: 90%
              num_leds: 12
          add_led_interval: 40ms
          reverse: false

binary_sensor:
  - platform: template
    name: "${device_name} Volume Up"
    id: btn_volume_up
  - platform: template
    name: "${device_name} Volume Down"
    id: btn_volume_down
  - platform: template
    name: "${device_name} Set"
    id: btn_set
  - platform: template
    name: "${device_name} Play"
    id: btn_play
  - platform: template
    name: "${device_name} Mode"
    id: btn_mode
  - platform: template
    name: "${device_name} Record"
    id: btn_record
    on_press:
      - output.turn_on: pa_ctrl
      - voice_assistant.start:
      - light.turn_on:
          id: led_ring
          brightness: 100%
          effect: "Wakeword"
    on_release:
      - voice_assistant.stop:
      - output.turn_off: pa_ctrl
      - light.turn_off:
          id: led_ring

# Status de connection
  - platform: status
    name: "${device_name} Status"

sensor:
  - id: button_adc
    platform: adc
    internal: true
    pin: 39
    attenuation: 11db
    update_interval: 15ms
    filters:
      - median:
          window_size: 5
          send_every: 5
          send_first_at: 1
      - delta: 0.1
    on_value_range:
      - below: 0.55
        then:
          - binary_sensor.template.publish:
              id: btn_volume_up
              state: ON
      - above: 0.65
        below: 0.92
        then:
          - binary_sensor.template.publish:
              id: btn_volume_down
              state: ON
      - above: 1.02
        below: 1.33
        then:
          - binary_sensor.template.publish:
              id: btn_set
              state: ON
      - above: 1.43
        below: 1.77
        then:
          - binary_sensor.template.publish:
              id: btn_play
              state: ON
      - above: 1.87
        below: 2.15
        then:
          - binary_sensor.template.publish:
              id: btn_mode
              state: ON
      - above: 2.25
        below: 2.56
        then:
          - binary_sensor.template.publish:
              id: btn_record
              state: ON
      - above: 2.8
        then:
          - binary_sensor.template.publish:
              id: btn_volume_up
              state: OFF
          - binary_sensor.template.publish:
              id: btn_volume_down
              state: OFF
          - binary_sensor.template.publish:
              id: btn_set
              state: OFF
          - binary_sensor.template.publish:
              id: btn_play
              state: OFF
          - binary_sensor.template.publish:
              id: btn_mode
              state: OFF
          - binary_sensor.template.publish:
              id: btn_record
              state: OFF
# Wifi signal
  - platform: wifi_signal
    name: "${device_name} WiFi Signal"
    update_interval: 60s

en ce qui concerne l’intégration c’est ok le micro est bien reconnue

j’ai installer whisper piper et tout et tout comme ce tuto:

https://www.home-assistant.io/voice_control/voice_remote_local_assistant/

mais des que je prononcele mot magique , rien pas de reaction

Tu utilise quel moteur de wakeword dans ton pipeline ?

c’est celui du tuto openwakeword

Bof si tu n’as pas un super accent english.
Essai avec Porcupine1 puis par la suite tu as Porcupine et snowboy.

Mon cocktail gagnant c’est Porcupine + Vosk + piper

bon j’ai essayer, alors j’ai eu une seul reaction mais je sais pas commentj’ai fait, peut un autre paramétrage pour qu’il m’entende mieux

je sais pas si le micro me capte ou se qu’il capte,

C 'est bon des paramétrage dans le code esphome;

Maintenant il me capte bien mais les commandes sont catastrophique. il ne comprent pas « eteint » il me met 9/10 etat…

il ya moyen d’améliorer ca , entrainer la voix ou je sais pas ??

Sinon les delais de reponses sont horribles plus de 5 secondes voir le double . A votre avis c est du aux matériel ou pas ?
Si oui possible d externaliser ces services ? Les fairent s’exécuter sur un raspberry par exemple ou autres ( j ai des raspi 4 et un pc puissant qui attendent qu on les occupent).

Merci

Hello

Tu n’as pas pris le temps de lire les sujets que je t’ai proposé.
Remplace faster whisper par Vosk et tu verras une nette amélioration.

@+

Quésako ? :rofl:
Comme tu dit, c’est pas faute de le dire d’utiliser Vosk au lieu de whisper et d’utiliser Snowboy ou porcupine a la place de openwakeword.

Sisi j utilise vosk et porcupine et piper

Bah il me comprends mal et les delais de reponses sont catastrophique

Mais je pense pas que cela viennent d eux spécialements

C est pour cela que je demande si je peux les installer sur un autre support plus performant.

Et je crois que vosk il ya des modèles d entraînement ?

Si tu avais parcouru les sujets, tu verrais que vosk répond en moins de 2 secondes avec un RPI4, et ce avec sa configuration de base.
Donc dans ton cas, le pb ne vient pas d’un manque de ressources.