M5Stickc Plus 2 voice assistant , soucis de GPIO pour le microphone

Bonjour a tous,
j’essayer de configurer mon M5Stickc Plus 2, pour utiliser le microphone avec voice assistant.
Mais je n’arrive pas a faire fonctionner le microphone.

voici les pins:


La doc , pour les pins complet et schéma si besoin.

image

Pour arduino, j’ai vu un code pour le micro, je vois rien d’autre de spécial dans le code, mais je suis pas un pro arduino.

#define PIN_CLK  0
#define PIN_DATA 34

la configue de esphome:

i2s_audio:
  id: i2c_bus
  i2s_lrclk_pin: GPIO0

microphone:
  - platform: i2s_audio
    id: echo_microphone
    i2s_din_pin: GPIO34
    adc_type: external
    i2s_audio_id: i2c_bus
    pdm: true

Voici les logs quand j’essayer de parler:

[10:56:59][D][voice_assistant:439]: State changed from IDLE to START_PIPELINE
[10:56:59][D][voice_assistant:445]: Desired state set to START_MICROPHONE
[10:56:59][D][voice_assistant:126]: microphone not running
[10:56:59][D][voice_assistant:210]: Requesting start...
[10:56:59][D][voice_assistant:439]: State changed from START_PIPELINE to STARTING_PIPELINE
[10:56:59][D][voice_assistant:126]: microphone not running
[10:56:59][D][voice_assistant:476]: Client started, streaming microphone
[10:56:59][D][voice_assistant:439]: State changed from STARTING_PIPELINE to START_MICROPHONE
[10:56:59][D][voice_assistant:445]: Desired state set to STREAMING_MICROPHONE
[10:56:59][D][voice_assistant:163]: Starting Microphone
[10:56:59][D][voice_assistant:439]: State changed from START_MICROPHONE to STARTING_MICROPHONE
[10:56:59][D][esp-idf:000]: I (2833082) I2S: DMA Malloc info, datalen=blocksize=1024, dma_buf_count=4

[10:56:59][D][voice_assistant:563]: Event Type: 1
[10:56:59][D][voice_assistant:566]: Assist Pipeline running
[10:56:59][D][voice_assistant:439]: State changed from STARTING_MICROPHONE to STREAMING_MICROPHONE
[10:56:59][D][voice_assistant:563]: Event Type: 3
[10:56:59][D][voice_assistant:577]: STT started
[10:56:59][D][light:036]: 'M5StickC PLUS2 Voice' Setting:
[10:56:59][D][light:047]:   State: ON
[10:56:59][D][light:109]:   Effect: 'Listening'
[10:57:14][D][voice_assistant:563]: Event Type: 12
[10:57:14][D][voice_assistant:721]: STT by VAD end
[10:57:14][D][voice_assistant:439]: State changed from STREAMING_MICROPHONE to STOP_MICROPHONE
[10:57:14][D][voice_assistant:445]: Desired state set to AWAITING_RESPONSE
[10:57:14][D][voice_assistant:439]: State changed from STOP_MICROPHONE to STOPPING_MICROPHONE
[10:57:14][D][light:036]: 'M5StickC PLUS2 Voice' Setting:
[10:57:14][D][light:085]:   Transition length: 1.0s
[10:57:14][D][esp-idf:000]: I (2848174) I2S: DMA queue destroyed

[10:57:14][D][voice_assistant:439]: State changed from STOPPING_MICROPHONE to AWAITING_RESPONSE
[10:57:14][D][voice_assistant:563]: Event Type: 0
[10:57:14][E][voice_assistant:693]: Error: stt-no-text-recognized - No text recognized
[10:57:14][D][voice_assistant:556]: Signaling stop...
[10:57:14][D][voice_assistant:439]: State changed from AWAITING_RESPONSE to STOP_MICROPHONE
[10:57:14][D][voice_assistant:445]: Desired state set to IDLE
[10:57:14][D][voice_assistant:439]: State changed from STOP_MICROPHONE to IDLE

Le GPIO0 est utliser pour le CLK, mais quand je lance les logs sous esphome, je vois ce message:
image

J’ai un speaker a installer, que j’ai réussi a faire fonctionner.


Comme on le vois ca utilise le GPIO0 et 26, le 36/25 pour le data.

J’y connais pas assez, il y pas un soucis avec le GPIO0 qui faudrait basculer suivant le micro ou le speaker ou une histoire de priorité au boot?

J’ai pas encore bossé sur le sujet, par contre pour ton warning avec le gpio00, il ne devrait pas y avoir de soucis si quand tu met le device sous tension, le gpio00 n’est pas mis à la masse.
si tu le met à la masse et que tu boote ton M5, il va passer en mode programmation et là ca va pas le faire.
c’est pour ca qu’esphome te met le warning.

j’ai fait cet assistant GitHub - techdregs/Home-Assistant-Voice-Remote: ESPHome Voice Remote for Home Assistant il y a un switch qui réveille la carte, elle s’allume en bleu, elle se connecte au wifi et au vert, tu parles.

j’ai pu le laisser un mois en veille sans l’utiliser, la batterie est toujours OK.

Vu que mon speaker fonctionne et qu’il utilise le GPIO0 aussi, il doit pas être a la masse donc off et pour le micro il doit être sur la masse (on) . Comme rien n’est programmer, il reste sur off.
Si je créer un switch GPIO et je bascule, ca va fonctionner.
Je vais y réfléchir, merci pour c’est piste.

edit:

switch:
  - platform: gpio
    pin: 
      number: GPIO0
      allow_other_uses: true
    id: input_mic_speaker
    name: Switch Micro Speaker

il aurait un mode a configurer ?

mode (Optional, string or mapping): Configures the pin to behave in different modes like input or output. The default value depends on the context. Accepts either a shorthand string or a mapping where each feature can be individually enabled/disabled:

  • input (Optional, boolean): If true, configure the pin as an input.
  • output (Optional, boolean): If true, configure the pin as an output.
  • pullup (Optional, boolean): Activate internal pullup resistors on the pin.
  • pulldown (Optional, boolean): Activate internal pulldown resistors on the pin.
  • open_drain (Optional, boolean): Set the pin to open-drain (as opposed to push-pull). The active pin state will then result in a high-impedance state.

Edit 2:
pas possible d’avoir un switch gpio et i2s_audio qui utilise le même pin, même avec l’option allow_other_uses.

J’ai tester la démo arduino pour le micro, le micro fonctionne bien ( déja il est pas dead ).
En testant la démo, j’entends du son et j’ai compris dans le code ce qu’est le speaker. C’est enfaite le buzzer inclus dans le M5Stickc plus 2, rien avoir avec un Haut parleur brancher sur le port i2c externe.

au truc qui m’enbrouille sur le PIN 0, dans la configue arduino c’est marquer CLK

#define PIN_CLK  0

dans la doc, idem:
image

mais sous esphome, il y a le LRCLK , le BCLK ou MCLK.

i2s_audio:
  i2s_lrclk_pin: GPIO0

As tu jeté un oeil sur M5Stack M5StickC PLUS | devices.esphome.io

je n’ai pas pu compiler l’exemple, mais je ne suis pas certain que l’AXP192 soit indispensable.
Quoi qu’il en soit, la definition des gpio ne devrait pas être loin de la vérité ?

@bentou le lien que tu ma mis est pour le PLUS, pas le PLUS 2.
C’est ici pour le PLUS 2 M5Stack M5StickC PLUS2 | devices.esphome.io

ils ont pas tester pour l’audio, les pin sont inverser en plus.

# note: Audio hasn't been tested
i2s_audio:
  id: bus_i2s
  i2s_lrclk_pin: G26
  i2s_bclk_pin: G0

microphone:
  - platform: i2s_audio
    i2s_din_pin: GPIO34
    i2s_audio_id: bus_i2s
    adc_type: external
    pdm: true
    id: mic

J’ai réussi , a faire reconnaitre un truc, j’y suis pas loin du but.

[09:19:02][D][voice_assistant:439]: State changed from STOPPING_MICROPHONE to AWAITING_RESPONSE
[09:19:05][D][voice_assistant:563]: Event Type: 4
[09:19:05][D][voice_assistant:591]: Speech recognised as: "ah"
[09:19:05][D][voice_assistant:563]: Event Type: 5
[09:19:05][D][voice_assistant:596]: Intent started
[09:19:06][D][voice_assistant:563]: Event Type: 6
[09:19:06][D][voice_assistant:563]: Event Type: 7
[09:19:06][D][voice_assistant:619]: Response: "Désolé, je n'ai pas compris"
[09:19:06][D][light:036]: 'M5StickC PLUS2 Voice' Setting:
[09:19:06][D][light:051]:   Brightness: 60%
[09:19:06][D][light:085]:   Transition length: 1.0s
[09:19:06][D][voice_assistant:563]: Event Type: 8
[09:19:06][D][voice_assistant:639]: Response URL: "http://192.168.1.xxxx:8123/api/tts_proxy/393247aa3dd2cd24b4ee2f8550489431d86f0c02_fr-fr_a022601376_tts.piper.mp3"
[09:19:06][D][voice_assistant:439]: State changed from AWAITING_RESPONSE to IDLE
[09:19:06][D][voice_assistant:445]: Desired state set to IDLE
i2s_audio:
  - id: mic_adc
    i2s_lrclk_pin:
       number: GPIO0
       allow_other_uses: true
       ignore_strapping_warning: true
  - id: spk_adc
    i2s_lrclk_pin:
       number: GPIO0
       allow_other_uses: true
       ignore_strapping_warning: true
    i2s_bclk_pin: GPIO26


microphone:
  - platform: i2s_audio
    id: echo_microphone
    i2s_din_pin: GPIO34
    adc_type: external
    i2s_audio_id: mic_adc
    bits_per_sample: 16bit
    sample_rate: 44100
    pdm: true

Ah oui, je viens de voir le M5Stack M5StickC PLUS2 | devices.esphome.io

yes !!!

[10:09:47][D][voice_assistant:439]: State changed from STOPPING_MICROPHONE to AWAITING_RESPONSE
[10:09:48][D][voice_assistant:563]: Event Type: 4
[10:09:48][D][voice_assistant:591]: Speech recognised as: "quelle est la température du salon"
[10:09:48][D][voice_assistant:563]: Event Type: 5
[10:09:48][D][voice_assistant:596]: Intent started
[10:09:48][D][voice_assistant:563]: Event Type: 6
[10:09:48][D][voice_assistant:563]: Event Type: 7
[10:09:48][D][voice_assistant:619]: Response: "La température est de 17.4 °"
[10:09:48][D][light:036]: 'M5StickC PLUS2 Voice' Setting:
[10:09:48][D][light:051]:   Brightness: 60%
[10:09:48][D][light:085]:   Transition length: 1.0s
[10:09:48][D][voice_assistant:563]: Event Type: 8
[10:09:48][D][voice_assistant:639]: Response URL: "http://192.168.1.xxx:8123/api/tts_proxy/b973e9a209b4b43bb13890560f26b8364a4864e3_fr-fr_a022601376_tts.piper.mp3"
[10:09:48][D][voice_assistant:439]: State changed from AWAITING_RESPONSE to IDLE

Plus cas ajouter le speaker et voir le résultat final :smiley:

1 « J'aime »

Bravo !!! tu affiche les dialogues sur l’écran ?

Pas essayer encore, je cherche a faire fonctionner le micro et speaker spk2.

j’ai déja des idées en tête, pour afficher sur l’écran.

Voila !

[20:08:16][D][voice_assistant:439]: State changed from STOPPING_MICROPHONE to AWAITING_RESPONSE
[20:08:18][D][voice_assistant:563]: Event Type: 4
[20:08:18][D][voice_assistant:591]: Speech recognised as: "éteindre cuisine"
[20:08:18][D][voice_assistant:563]: Event Type: 5
[20:08:18][D][voice_assistant:596]: Intent started
[20:08:18][D][voice_assistant:563]: Event Type: 6
[20:08:18][D][voice_assistant:563]: Event Type: 7
[20:08:18][D][voice_assistant:619]: Response: "Éteint"
[20:08:18][D][text_sensor:064]: 'text-to-speech': Sending state 'Éteint'
[20:08:18][D][light:036]: 'M5StickC PLUS2 Voice' Setting:
[20:08:18][D][light:051]:   Brightness: 60%
[20:08:18][D][light:085]:   Transition length: 1.0s

Joli !!!

au lieu de mettre question et réponse, ce qui prend de la place, il faudrait mettre des couleurs …

Oui la réponse prends de la place et j’ai pas de retour a la ligne, ca sort de l’écran quand c’est trop long.

Des couleurs Ok, pour ok ou erreur. Mais quand tu attends une réponse de température, météo, obliger de mettre du texte.

ah c’est couillon l’absence de retour à la ligne…

Oui, faut le coder lol.

j’ai tester, la réponse sur un google nest, nikel. Ca peut être une bonne alternative, si j’arrive pas a utiliser le speaker sur l’esp.

trigger:
  - platform: state
    entity_id:
      - sensor.m5stickc_plus2_voice_text_to_speech
    to: null
condition: []
action:
  - service: tts.speak
    metadata: {}
    data:
      cache: true
      media_player_entity_id: media_player.nest_mini
      message: "{{ states(\"sensor.m5stickc_plus2_voice_text_to_speech\") }}"
    target:
      entity_id: tts.google_fr_fr

Salut @Bob ,
j’ai un message texte a afficher sur un écran, ou la longueur peu varier. Si le message est trop long il sort de l’écran, et je reçois des warnings dans les logs.

Connais tu une façon de découper le texte sur deux lignes, ou faire du scrolling sous esphome ?

text_sensor:
  - platform: template
    name: "text-to-speech"
    id: tts

display:
  - platform: ili9xxx
    model: st7789v
    cs_pin: GPIO5
    dc_pin: GPIO14
    reset_pin: GPIO12
    rotation: 90
    dimensions:
      height: 240
      width: 135
      offset_height: 40
      offset_width: 52
    # Required or the colors are all inverted, and Black screen is White
    invert_colors: true
    lambda: |-
      it.printf(5, 4, id(roboto), id(my_white), "Response:");
      it.printf(5, 30, id(roboto), id(my_green), id(tts).state.c_str());

Sinon, tu sais comment mettre un accent pour c’est la ligne:

it.printf(5, 4, id(roboto), id(my_white), "Response:");

remplacer "Response:" par "Réponse:"

Bonsoir @WarC0zes
Pour les accents et symbole j’avais mis un exemple ici:

Désolé je ne suis pas sur PC et copier coller de code délicat :smirk:
Pour le scroll ou longueur pas d’idée à l’instant.
Bob

ok, rien de spécial enfaite :slight_smile:

it.print(5, 160, id(my_font18), "Humidité :");

j’ai bien la police avec accents, mais je pense que c’est un autre soucis pour la compilation.

it.printf(5, 4, id(roboto), id(my_white), "Réponse:");

Je resterais.

Tu as bien les caractères, accentuées dans glyphs: ?
Bob

Oui, mais c’est un autre soucis enfaite. c’est moi qui pensais que ca compiler pas a cause d’un accent dans la ligne it.print, mais non .

font:
  - file: "gfonts://Roboto"
    id: roboto
    size: 18
    glyphs: "<>!'%()+,-_.:;*=°?#0123456789AÀBCDEÉÈÊFGHIJKLMNOPQRSTUVWXYZ aàbcdeéèêfghijklmnopqrstuvwxyzôöç"

je pense que c’est un soucis ou j’ai flasher un firmware avec 4MB de flash au lieu de 8MB.
J’ai voulu reflasher en OTA pour passer en 8MB . :sweat_smile:
J’ai effacer le flash et reflasher :wink:

1 « J'aime »