TV LG webOS zmiana programów za pomocą voice assistant

Może komuś się przyda moje rozwiązanie ( i AI). Bawię się Voice Assistant z lokalnym asystentem konwersacji. Mam TV LG webOS i chodziło o zmianę programów poleceniem głosowym. To wydaje się przydatne, bo skakanie P+/P- lub pamiętanie numerów kanałow jest kłopotliwe.
Po kolei.
Wpisana sentencja w custom_sentences/pl:

   TvSetChannel:
      data:
       - sentences:
          - "włącz program {channel}"
          - "przełącz na program {channel}"
          - "zmień program na {channel}"
          - "przełącz program na {channel}"
          - "zmień na program {channel}"

Słowo “program” jest o tyle istotne, że łatwo odczytane przez STT, bo np. słowo “kanał” asystent mylił z “Canal +”

i koniecznie lista kanałów (tutaj tylko fragment)

lists:
  channel:
    values:
      - in: "TV Toruń"
        out: "TV Torun HD"
      - in: "TVP1"
        out: "TVP1 HD"
      - in: "TVP 1"
        out: "TVP1 HD"
      - in: "Jedynkę"
        out: "TVP1 HD"    
      - in: "TVP2"
        out: "TVP2 HD"
      - in: "TVP 2"
        out: "TVP2 HD"
      - in: "Dwójkę"
        out: "TVP2 HD"         
      - in: "TVN"
        out: "TVN"
      - in: "TVN24"
        out: "TVN 24 HD"
      - in: "TVN 24"
        out: "TVN 24 HD"    
      - in: "TVN24 bis"
        out: "TVN 24 BIS HD"
      - in: "TVN 24 bis"
        out: "TVN 24 BIS HD"   
      - in: "TVN 7"
        out: "TVN 7"
      - in: "POLSAT"
        out: "POLSAT HD"
      - in: "POLSAT 2"
        out: "POLSAT 2 HD"    
      - in: "POLSAT NEWS"
        out: "POLSAT NEWS HD"
      - in: "POLSAT NEWS "
        out: "POLSAT NEWS 2 HD"   

Generalnie chodzi o to, że TV ma zapisane kanały w różny sposób, w większości przypadków z “HD” na końcu i po co to mówić. Tutaj zresztą można sobie wpisać swoje nazwy. Nazwa out: xxx musi być dokładnie jak w TV. To można podejrzeć za pomocą narzędzi deweloperskich i wyświetleniu stanu TV, gdzie jest media_title. Ale chyba to co wyświetla się na TV jest też OK.

source_list:
  - Accuweather
  - Amazon Alexa
  - Apple TV
  - Apps
  - CANAL+
  - Copilot
  - Disney+
  - Dostępność
  - HBO Max
  - HDMI 2
  - HDMI 3
  - HDMI 4
  - Home Hub
  - Kamera
  - LG Gallery+
  - LG Gaming Portal
  - Live TV
  - "MEGOGO: TV, Filmy, Sport"
  - Multi View
  - Netflix
  - Odtwarzacz multimedialny
  - Prime Video
  - Przeglądarka
  - Rakuten TV
  - SWEET.TV
  - SkyShowtime
  - Sport
  - Spotify - Muzyka i podcasty
  - Yamaha Odtwarzacz DVD
  - YouTube
  - cda.pl
volume_level: 0.06
is_volume_muted: false
media_content_type: channel
media_title: Polsat News HD
source: Live TV
sound_output: tv_external_speaker
assumed_state: true
device_class: tv
entity_picture: >-
  /api/media_player_proxy/media_player.lg_webos_tv_55qned86a6a_beufljp?token=6ef4448946ebe3c8eadaa33fb168868ec34a7fe77e2a6354fa6986e309921a29&cache=e46683248a6957df
friendly_name: LG webOS TV 55QNED86A6A.BEUFLJP
supported_features: 24381

Następnie wpis w intent_script.yaml:

TvSetChannel:
    speech:
      text: >-
        {% set ch = channel | default('', true) | string | trim %}
        {% if ch %} Bardzo proszę. {% else %} Nie jestem pewien, o jaki kanał chodzi. Nie wykonuję akcji. {% endif %}
    action:
      service: script.tv_set_channel
      data:
        channel: "{{ channel | string | trim }}"

I sam skrypt, w moim wypadku napisany przez AI. Jest tutaj czyszczenie ze śmieci odebranego tekstu. To wynik, prób gdzie były kłopoty z odpowiednim jego działaniem. Jednak myślę, że można by z tego framgemntu zrezygnować.

tv_set_channel:
  alias: "Ustaw kanał TV (LG webOS)"
  mode: restart
  sequence:
    - variables:
        spoken: >-
          {{ (channel
              if channel is defined else media_content_id
              if media_content_id is defined else '') | string }}
        cleaned: >-
          {{ spoken
             | replace('“','"') | replace('”','"')
             | replace('„','"') | replace('’',"'")
             | trim('" ')
             | regex_replace('^[\\.,;:!\\s]+','')
             | regex_replace('[\\s\\.,;:!]+$','')
          }}
    - service: media_player.play_media
      target:
        entity_id: media_player.lg_webos_tv_55qned86a6a_beufljp
      data:
        media_content_type: channel
        media_content_id: "{{ cleaned }}"

Działa to dobrze. Radzi sobie z programami gdzie nazwy polskie są mieszane z angielską wymową np. “Polsat news” , czy mieszany tekst z cyfrą np.: “TVP 1”. Pewnie dałoby się zrezygnować całkowicie z osobnego skryptu, ale piszę Wam jak u mnie to jest rozwiązane i działa. I jeszcze jedno, mam zrobioną automatyzacje, która wycisza TV jak urządzenia voice Assistant przechodzi w tryb słuchania komendy. To poprawia skuteczność rozpoznawania mowy.

Jaką masz integrację do tv?

LG webOS

Ja to zapytam o listę użytych Dodatków, bo to zupełnie pominąłeś, a wcale nie jest oczywiste czego używasz.

Jak pisałem wcześniej LG webOS + Voice Assistant w takiej konfiguracji:

Czyli bez żadnych Dodatków? (np. Rhasspy), bo umieściłeś w tym dziale wątek, więc chcę wiedzieć dlaczego…