Home Assistant & Voice

Comme beaucoup d'utilisateurs j'utilise des notifications vocales, et comme pour beaucoup d'utilisateurs parfois c'est le bug. Il y a plusieurs approches, Alexa Media est la dernière, Alexa Media Player peut s'utiliser en parallèle ou encore Google TTS, Cloud TTS (Nabu Casa) ou même en local avec Piper.

Le problème est qu'il arrive parfois que l'un de ces services ne fonctionne pas. Il passe alors en indisponible, ou pas à l'image d'Alexa Devices qui parfois ne retourne pas d'erreur, mais ne parle pas !

Si contourner ces problème peut s'envisager automatiquement quand le device est indisponible, j'ai choisit une autre approche consistant à créer un input_select:avec les choix des différents services que j'appelerait via un script dans les automations :

input_select:
  select_voice:
    name: Select Voice
    icon: mdi:speaker-message
    options:
      - Alexa Media Player
      - Alexa Devices
      - Sonos TTS
      - ...
script:
  notify_voice:
    alias: Notify Voice
    mode: queued
    fields:
      message:
        description: Message vocal
      volume:
        description: Volume optionnel
        default: 40
    sequence:
      - variables:
          backend: "{{ states('input_select.tts') }}"
          vol: "{{ volume | default(40) }}"

      - choose:
          # Alexa Media Player
          - conditions: "{{ backend == 'Alexa Media Player' }}"
            sequence:
              - action: notify.alexa_media
                data:
                  message: "{{ message }}"
                  target: media_player.echo_dot_hall
                  data:
                    type: "tts"

          # Alexa Media Player (variante chuchotement)  https://docs.aws.amazon.com/polly/latest/dg/supportedtags.html#prosody-tag
          - conditions: "{{ backend == 'Alexa Media Player Soft' }}"
            sequence:
              - action: notify.alexa_media
                data:
                  message: <amazon:effect name="whispered">{{ message }}</amazon:effect>
                  target: media_player.echo_dot_hall
                  data:
                    type: "tts"
                    

          # Alexa Device
          - conditions: "{{ backend == 'Alexa Devices' }}"
            sequence:
              - action: notify.send_message
                target:
                  entity_id: notify.echo_hall_speak
                data:
                  message: "{{ message }}"
                  
          # Alexa Piper
          - conditions: "{{ backend == 'Alexa Piper' }}"
            sequence:
              - action: tts.speak
                data:
                  # cache: true
                  media_player_entity_id: media_player.echo_dot_hall
                  message: "{{ message }}"
                target:
                  entity_id: tts.piper

          # Sonos TTS (via Music Assistant)
          - conditions: "{{ backend == 'Sonos TTS MA' }}"
            sequence:
              - action: tts.cloud_say
                data:
                  entity_id: media_player.sonos_ma_hall
                  message: "{{ message }}"

          # Google Home TTS
          - conditions: "{{ backend == 'Google TTS Cloud' }}"
            sequence:
              - action: tts.cloud_say
                target:
                  entity_id: media_player.cast_entree
                data:
                  message: "{{ message }}"

          # Google Home TTS Piper
          - conditions: "{{ backend == 'Google TTS Piper' }}"
            sequence:
              - action: tts.speak
                data:
                  # cache: true
                  media_player_entity_id: media_player.cast_entree
                  message: "{{ message }}"
                target:
                  entity_id: tts.piper

Et ensuite j'insère uniquement cette commande dans mon automation. A noter que les variables dans le message sont prises en charge car il est créé dans l'automation :

automation:
... Mon automation ...
  - action: script.notify_voice
    data:
      message: "{{ trigger.event.data.preset }} du chauffage de la salle de bain activé pour {{ trigger.event.data.duration_minutes | int }} minutes, 

Pour aller plus loin on pourrait régulièrement tester la disponibilité des services et sélectionner automatiquement le bon service.