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

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.

Je confirme 2-4sec pour répondre avec Vosk sur un RPI4.

1 « J'aime »

Peut-etre du ce cote la . Je ne suis pas sous raspi.
Je l etait mais je me suis retrouver avec un shuttle xs35v4

https://global.shuttle.com/news/productsSpec?pn=XS35V4

Avec un proc celeron j1900 etv8gb

Mon install est docker supervised.
Voila si ca peut aider.

Je lis pas mal de truc sur plusieurs forum mais il y a pas de tuto tres claire. Il faut glaner a doite et à gauche.

Je crois qu il faut aussi que j’utilise un modele

Une doute que ca soit ta machine.

celeron J1900:
Nb. de cœurs 4
Nb. de threads 4
Fréquence de rafale 2.42 GHz
Fréquence de base 2.00 GHz

RPI4:
4 x 1.8 Ghz

1 « J'aime »

J’ai regarder un comparatif des deux oui le celeron est au-dessus normalement.

Mais ça explique ma latence

bon en partie résolue test ce soir et le delais est normal, peut etre etait-ce due a la construction de la base ou je ne sais quoi, trop préssé d’essayer.

Mais il me comprends pas toujours bien la j’upload le model fr linto , on verra

Ouah quel différence avec le modèle. tout est bon je vais pouvoir poursuivre mon travail.
ah savoir lancer de la musique sur mon serveur mopidy , je commence les recherches

any Idea ?

Bonsoir,

ESP32-S3-Korvo1 v5.0 reçu. Je vais pouvoir me remettre au travail en espérant que ce sera plus concluant !

Bon alors il y a du mieux !!!

Je suis parvenu à flasher ce nouveau korvo. Les led, les micros, le haut-parleur fonctionnent. J’ai testé avec un pipeline chatgpt et il répond. Par contre je n’ai pas encore accès à mes devices home assistant, ni obtenir leur statut, ni les commander. J’ai essayé de remettre le pipeline standard mais il ne semble pas comprendre mes requêtes.
J’ai quand même l’impression que le plus compliqué est fait.
A suivre…

Matt.

Et le code qui va bien, j’allais oublier :

logger:

ota:
  password: "lemotdepassesupersecret"

captive_portal:

substitutions:
  friendly_name: ESP32 S3 Korvo1 

esphome:
  name: esp32-s3-korvo-1
  friendly_name: ${friendly_name}
  name_add_mac_suffix: true
  platformio_options:
    board_build.flash_mode: dio
    upload_speed: 460800
  project:
    name: esphome.voice-assistant
    version: "1.0"
  min_version: 2023.11.1
  on_boot:
    - priority: 600
      then:
        - light.turn_on:
            id: led_ring
            brightness: 70%
            effect: connecting

esp32:
  board: esp32-s3-devkitc-1
  framework:
    type: esp-idf
    sdkconfig_options:
      CONFIG_ESP32S3_DEFAULT_CPU_FREQ_240: "y"
      CONFIG_ESP32S3_DATA_CACHE_64KB: "y"
      CONFIG_ESP32S3_DATA_CACHE_LINE_64B: "y"
      CONFIG_AUDIO_BOARD_CUSTOM: "y"
      CONFIG_ESP32_S3_KORVO1_BOARD: "y"
    components:
      - name: esp32_s3_korvo1_board
        source: github://abmantis/esphome_custom_audio_boards@main
        refresh: 0s

psram:
  mode: octal
  speed: 80MHz

external_components:
  - source: github://pr#5230
    components: esp_adf
    refresh: 0s

api:
  encryption:
    key: "lacleapisupersecrete"
  on_client_connected:
    then:
      - if:
          condition:
            switch.is_on: use_wake_word
          then:
            - delay: 1s
            - voice_assistant.start_continuous:
            - delay: 1s
            - voice_assistant.stop:
            - delay: 2s
            - voice_assistant.start_continuous:
            - script.execute: reset_led
  on_client_disconnected:
    then:
      - light.turn_on:
          id: led_ring
          blue: 0%
          red: 100%
          green: 100%
          brightness: 50%
          effect: connecting

dashboard_import:
  package_import_url: github://esphome/firmware/voice-assistant/esp32-s3-korvo1.yaml@main

wifi:
  ap:
    ssid: "Esp32-S3-Korvo-1"
    password: "passwordsupersecret"
  on_connect:
    then:
      - delay: 5s # Gives time for improv results to be transmitted
      - ble.disable:
  on_disconnect:
    then:
      - ble.enable:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

improv_serial:

esp32_improv:
  authorizer: none

button:
  - platform: factory_reset
    id: factory_reset_btn
    name: Factory reset

esp_adf:
  board: esp32s3korvo1

microphone:
  - platform: esp_adf
    id: korvo_mic

speaker:
  - platform: esp_adf
    id: korvo_speaker

voice_assistant:
  id: voice_asst
  microphone: korvo_mic
  speaker: korvo_speaker
  noise_suppression_level: 4
  auto_gain: 10dBFS
  volume_multiplier: 1
  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: 100%
                red: 0%
                green: 0%
                brightness: 30%
                effect: none
          else:
            - light.turn_off: led_ring

switch:
  - platform: gpio
    id: pa_ctrl
    pin: GPIO38
    name: "${friendly_name} Speaker Mute"
    restore_mode: ALWAYS_ON

  - 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

light:
  - platform: esp32_rmt_led_strip
    id: led_ring
    name: "${friendly_name} Light"
    pin: GPIO19
    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: 0%
              green: 50%
              blue: 0%
              num_leds: 12
          add_led_interval: 20ms
          reverse: false
      - addressable_color_wipe:
          name: "Connecting"
          colors:
            - red: 60%
              green: 60%
              blue: 60%
              num_leds: 12
            - red: 60%
              green: 60%
              blue: 0%
              num_leds: 12
          add_led_interval: 100ms
          reverse: true

binary_sensor:
  - platform: template
    name: "${friendly_name} Volume Up"
    id: btn_volume_up
  - platform: template
    name: "${friendly_name} Volume Down"
    id: btn_volume_down
  - platform: template
    name: "${friendly_name} Set"
    id: btn_set
  - platform: template
    name: "${friendly_name} Play"
    id: btn_play
  - platform: template
    name: "${friendly_name} Mode"
    id: btn_mode
    on_multi_click:
      - timing:
          - ON for at least 10s
        then:
          - button.press: factory_reset_btn
  - platform: template
    name: "${friendly_name} Record"
    id: btn_record
    on_press:
      - voice_assistant.start:
      - light.turn_on:
          id: led_ring
          brightness: 100%
          effect: "Wakeword"
    on_release:
      - voice_assistant.stop:
      - light.turn_off:
          id: led_ring

sensor:
  - id: button_adc
    platform: adc
    internal: true
    pin: 8
    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

Salut,
Ta essayer Vosk a la place de whisper et Porcupine ou snowboy a la place de openwakeword ?

Salut @WarC0zes ,

Oui, j’utilise bien Vosk, piper et snowboy.

Le Korvo réagit bien au wakeword, je pense que le speech to text Vosk fonctionne bien puisque, quand choisi comme Agent de conversation, gpt me répond correctement et la synthèse vocale fonctionne bien aussi puisque j’ai le retour audio sur le HP.

Le souci, mais j’ai dû passer à côté de quelque chose, se situe je pense, dans l’interface entre agent de conversation et entités home assistant. En même temps je n’ai pas beaucoup testé pour le moment…

Tu peu utiliser Alias dans les paramètres d’une entité pour choisir un nom plus simple.

Pour les commandes regarde les sentences en FR intents/sentences/fr at main · home-assistant/intents · GitHub

Exemple:
Allumer cuisine
éteins (ou éteindre) cuisine
Quel est la température du salon
Quel temps fait il

Salut,

tout marche maintenant nickel du point de vue assist du wakeword jusqu’à l’action et la réponse sur le haut parleur. Merci aux contributeurs !

Je suis gourmand du coup j’aimerais que l’ESP fasse aussi media player.

Le problème est que j’utilise le speaker de la platform esp-adf alors que le media_player est fourni par la platform i2s_audio.

Je n’arrive pas à faire cohabiter les 2.

Savez-vous si esp-adf serait en mesure de streamer du flux et d’être vu comme un media player d’une manière ou d’une autre ?

Où faut-il que je reprenne tout le code pour travailler en i2s-audio auquel cas je risque de ne pas profiter de tout ce que propose le esp32-s3-korvo1 et que j’identifie tous les GPIOs ?

Merci pour votre aide.

Matt.

Mon code pour mémoire :

Bonjour @MattG,

Je suis avec un INMP441 et un MAX98357.
J’ai désactivé le Speaker pour utiliser le media_player :

#speaker:
#  - platform: i2s_audio
#    id: my_speaker
#    dac_type: external
#    i2s_dout_pin: GPIO27   #DIN 
#    mode: mono
#    i2s_audio_id: i2s_in

media_player:
  - platform: i2s_audio
    id: media_sat2
    name: "media_sat2"
    i2s_dout_pin: GPIO27
    dac_type: external
    mode: mono

Et pour l’envoi sur le media_player :

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

Bob

Salut Bob,

Merci pour ta réponse.

C’était ce que je pensais faire aussi mais mon code utilise la platform esp-adf qui ne propose pas media_player.

Si j’ajouter i2s_audio, c’est incompatible.

D’où mon souci de faire cohabiter les 2…

Tu pourrais mettre un media_player sur un autre ESP non ?

Bob

Oui j’y ai pensé mais c’est vachement moins drôle !!