Hast du ihn mit einer (lokalen) AI verknüpft, oder lässt du ihn über den Cloud-Assistenten von Nabucasa laufen und nutzt dessen “Intelligenz”? Ich habe versucht, alles lokal zu machen, und verwende die Cloud praktisch nicht (ich will ja gerade die Abhängigkeit von einer Cloud loswerden, als Ersatz für Alexa). Die Einrichtung des zweiten Wake-Words war bei mir “problemlos”, wenn ich “Hey Home Assistant” verwende. Ich hatte zuerst “Pyper” versucht, was das Gerät als Alternative anbietet, aber das Teil ist bei jedem “Also” in einem Satz angesprungen. Wie er “Also” als “Pyper” fehl-hören kann, erschließt sich mir nicht, war aber extrem nervig. Aber dann habe ich halt erstmal ein anderes Wake-Word verwendet.
Als Spracherkennung verwende ich lokal Whisper mit dem base-int8 Modell und faster-whisper als Library. Das läuft auf meiner Maschine (eine virtuelle Maschine auf meinem QNAP NAS) performant genug, dürfte aber gern etwas schneller sein. Als Text-to-Speech verwende ich Piper mit der de_DE-thorsten-medium Stimme mit length scale 1.3 (der Hesse spricht mir zu langsam
).
Ohne die Intelligenz des Cloud-Assistenten habe ich viele typische Anfragen per Automation mit “trigger: conversation” gelöst, was erstaunlich gut funktioniert. Sachen die ich bisher implementiert habe sind unter anderem: Temperatur für einen bestimmten Raum und draussen abfragen/ansagen, ebenso Luftqualität (CO2-Wert von IKEA-Alpstuga Sensoren), Fragen nach dem Wetter beantworten (zB “regnet es heute?”, Wettervorhersage für heute oder morgen ansagen), Lautstärke des Assistenten per Sprache lauter/leiser oder auf einen bestimmten Wert stellen, Einkaufslisten verwalten (Artikel zufügen bzw löschen, alles abhaken, eine andere Liste verwenden, verwendete Liste ansagen etc), Tagesschau-Podcast abspielen für aktuelle Nachrichten, und ein Bestätigungston für Änderungen der Lautstärke am Gerät (was gut über das Edititeren einer Systemdatei /etc/adckey/adckey_function.sh auf dem Gerät funktioniert). Das alles funktioniert soweit ganz Alltags-tauglich.
NICHT vernünftig habe ich bisher Timer zum Laufen bekommen. Das heißt - schon, aber man kann einen abspielenden Timer nicht per Stimme anhalten bis man einen Button am Gerät drückt. Da bin ich noch am Experimentieren, aber das Hauptproblem scheint zu sein daß der Assist “schlau” ist und den Timer selbst verwaltet statt über HA, was wiederum bedeutet daß HA ihn nicht sieht und auch nicht beeinflussen kann.
Was mich ebenfalls nervt ist der “Thinking”-Ton des Voice Assist, der nützlich aber zu schrill und laut ist.
Ein proof-of-principle Beispiel für die heutige Wettervorhersage (was die Pirateweather-Integration verwendet, aber prinzipiell mit einer anderen weather-entity genauso funktionieren sollte):
alias: "Assist: Wettervorhersage heute"
description: ""
triggers:
- trigger: conversation
command:
- wie wird das wetter heute
- wie wird das wetter
- wie ist die vorhersage
- was ist die vorhersage
- wie ist die wettervorhersage
- was ist die wettervorhersage
- wettervorhersage
- wettervorhersage heute
- wettervorhersage für heute
- was ist die wettervorhersage
- wie ist die wettervorhersage
- wie ist die vorhersage heute
- wie ist die vorhersage für heute
- wie ist die wettervorhersage für heute
- was ist die vorhersage für heute
- was ist die wettervorhersage für heute
- gib mir die wettervorhersage für heute
conditions:
- condition: template
value_template: "{{ 'morgen' not in (trigger.sentence | default('') | lower) }}"
actions:
- variables:
weather_entity: weather.pirateweather
- action: weather.get_forecasts
target:
entity_id: "{{ weather_entity }}"
data:
type: daily
response_variable: forecast_data
- variables:
forecast: "{{ forecast_data[weather_entity]['forecast'][0] }}"
condition: "{{ forecast.condition | default('unknown') }}"
temp_high: "{{ forecast.temperature | default(none) }}"
temp_low: "{{ forecast.templow | default(none) }}"
precip: "{{ forecast.precipitation | default(0) }}"
precip_prob: "{{ forecast.precipitation_probability | default(none) }}"
wind: "{{ forecast.wind_speed | default(none) }}"
condition_de: |-
{% set c = forecast.condition | default('unknown') %} {% set map = {
'clear-night': 'klar',
'cloudy': 'bewölkt',
'exceptional': 'ungewöhnlich',
'fog': 'neblig',
'hail': 'Hagel',
'lightning': 'Gewitter',
'lightning-rainy': 'Gewitter mit Regen',
'partlycloudy': 'teilweise bewölkt',
'pouring': 'starker Regen',
'rainy': 'regnerisch',
'snowy': 'schneit',
'snowy-rainy': 'Schneeregen',
'sunny': 'sonnig',
'windy': 'windig',
'windy-variant': 'windig und bewölkt'
} %} {{ map.get(c, c) }}
- set_conversation_response: >
Heute wird es voraussichtlich {{ condition_de }}. Die Temperatur liegt
zwischen {{ temp_low | round(0) }} und {{ temp_high | round(0) }} Grad. {%
if precip_prob is not none %} Die Regenwahrscheinlichkeit liegt bei {{
precip_prob | round(0) }} Prozent. {% endif %} {% if precip | float(0) > 0
%} Erwarteter Niederschlag: {{ precip | round(1) }} Millimeter. {% endif
%}
mode: single