找回密碼
 立即註冊
惟家LINE群QRCODE
    查看: 1|回覆: 0

    教 Assist 聽懂你家的說法:自訂語句(custom sentences)

    [複製鏈接]

    !lvup!   100%

    363

    主題

    27

    回帖

    2200萬

    積分

    管理員

    積分
    22005752
    發表於 3 天前 | 顯示全部樓層 |閱讀模式
    HA 內建的語音助理 Assist 已經聽得懂「開客廳的燈」這種話。
    但你家可能有些特殊說法它不懂,例如:


    • 「我要睡了」
    • 「幫我準備看電影」
    • 「狗的水還有嗎」
    • 「等一下要出門」


    這些可以自己教。



    先搞懂三個名詞


    • Sentence(語句) — 使用者會講的話
    • Intent(意圖) — 這句話代表的「意思」
    • Response(回應) — 講完之後助理要說什麼


    流程是:聽到語句 → 對應到意圖 → 執行動作 → 給回應。

    最簡單的做法:意圖腳本(intent_script)

    兩個檔案就搞定。

    檔案一:告訴 HA 有哪些說法

    放在 config/custom_sentences/zh-tw/(資料夾要自己建)。
    檔名隨便,副檔名 .yaml。
    1. # config/custom_sentences/zh-tw/my_sentences.yaml
    2. language: "zh-tw"
    3. intents:
    4.   GoodNight:
    5.     data:
    6.       - sentences:
    7.           - "我要睡了"
    8.           - "晚安"
    9.           - "要睡覺了"
    10.           - "睡覺模式"
    11.   MovieTime:
    12.     data:
    13.       - sentences:
    14.           - "我要看電影"
    15.           - "幫我準備看電影"
    16.           - "電影模式"
    17.   LeavingSoon:
    18.     data:
    19.       - sentences:
    20.           - "等一下要出門"
    21.           - "準備出門"
    複製代碼

    檔案二:告訴 HA 每個意圖要做什麼

    寫在 configuration.yaml(或你的 package 裡):
    1. intent_script:
    2.   GoodNight:
    3.     speech:
    4.       text: >
    5.         好的,晚安。
    6.         {% if is_state('lock.前門','unlocked') %}
    7.         提醒你前門還沒鎖。
    8.         {% endif %}
    9.     action:
    10.       - action: script.turn_on
    11.         target:
    12.           entity_id: script.睡前模式
    13.   MovieTime:
    14.     speech:
    15.       text: "電影模式,燈光已經調暗了"
    16.     action:
    17.       - action: scene.turn_on
    18.         target:
    19.           entity_id: scene.看電影
    20.   LeavingSoon:
    21.     speech:
    22.       text: >
    23.         好。外面 {{ states('sensor.室外溫度') }} 度,
    24.         {% if states('sensor.今日降雨機率') | float(0) > 50 %}
    25.         降雨機率 {{ states('sensor.今日降雨機率') }}%,記得帶傘。
    26.         {% else %}
    27.         今天不會下雨。
    28.         {% endif %}
    29.     action:
    30.       - action: script.turn_on
    31.         target:
    32.           entity_id: script.預備離家
    複製代碼

    改完要重啟 HA(custom_sentences 不能熱重載)。



    進階:讓語句帶參數

    「把客廳調到 30%」—— 房間和數字是變數。
    1. language: "zh-tw"
    2. intents:
    3.   SetRoomBrightness:
    4.     data:
    5.       - sentences:
    6.           - "把{area}調到{brightness}"
    7.           - "{area}亮度{brightness}"
    8.         slots:
    9.           brightness: "{{ brightness }}"
    10. lists:
    11.   brightness:
    12.     range:
    13.       from: 0
    14.       to: 100
    複製代碼

    {area} 是 HA 內建的清單(會自動對應到你設定的區域),
    {brightness} 是我們自訂的數字範圍。
    1. intent_script:
    2.   SetRoomBrightness:
    3.     speech:
    4.       text: "好,{{ area }}調到 {{ brightness }}%"
    5.     action:
    6.       - action: light.turn_on
    7.         target:
    8.           area_id: "{{ area }}"
    9.         data:
    10.           brightness_pct: "{{ brightness }}"
    複製代碼

    自訂清單
    1. lists:
    2.   寵物:
    3.     values:
    4.       - in: "狗"
    5.         out: "sensor.dog_water_level"
    6.       - in: "貓"
    7.         out: "sensor.cat_water_level"
    8. intents:
    9.   CheckPetWater:
    10.     data:
    11.       - sentences:
    12.           - "{寵物}的水還有嗎"
    13.           - "{寵物}還有水嗎"
    複製代碼
    1. intent_script:
    2.   CheckPetWater:
    3.     speech:
    4.       text: >
    5.         {% set v = states(寵物) | float(0) %}
    6.         {% if v > 50 %}還很多,{{ v }}%
    7.         {% elif v > 20 %}剩 {{ v }}%,該補了
    8.         {% else %}快沒了,只剩 {{ v }}%
    9.         {% endif %}
    複製代碼

    in 是使用者講的、out 是程式拿到的,這個對應很好用。

    只回答不做事的意圖

    有些只是想問:
    1. intents:
    2.   HowManyLightsOn:
    3.     data:
    4.       - sentences:
    5.           - "現在有幾盞燈開著"
    6.           - "還有燈開著嗎"
    複製代碼
    1. intent_script:
    2.   HowManyLightsOn:
    3.     speech:
    4.       text: >
    5.         {% set n = states.light | selectattr('state','eq','on') | list | count %}
    6.         {% if n == 0 %}
    7.         所有燈都關著
    8.         {% else %}
    9.         有 {{ n }} 盞開著:
    10.         {{ states.light | selectattr('state','eq','on')
    11.            | map(attribute='name') | list | join('、') }}
    12.         {% endif %}
    複製代碼

    沒有 action 區塊也完全合法 —— 就只是回答。

    怎麼測試

    方法一:Assist 對話框(右上角的對話圖示),直接打字測。
    這個最快,不用真的講話。

    方法二:開發者工具 → 動作 → conversation.process
    1. action: conversation.process
    2. data:
    3.   text: 我要看電影
    4.   language: zh-tw
    複製代碼

    回應會顯示它對應到哪個意圖、有沒有成功。

    常見問題

    1. 說了沒反應


    • 確認檔案放在 custom_sentences/zh-tw/(語言代碼要對)
    • 確認 language: "zh-tw" 那行有寫
    • 確認有重啟 HA
    • 檢查 YAML 縮排


    2. 中文的斷詞問題

    中文沒有空格,比對比英文麻煩。建議:


    • 多寫幾種說法,把你和家人會講的都列上去
    • 避免太短的語句(「開」「關」很容易誤觸發)
    • 參數前後最好有明確的字(「把{area}調到{brightness}」比「{area}{brightness}」好)


    3. 跟內建語句衝突

    自訂語句優先權比較高。如果你定義了「開燈」,
    就會蓋掉內建處理「開燈」的邏輯。盡量用內建沒有的說法。

    搭配本地語音

    這些自訂語句在完全本地的環境也能用 ——
    配 Whisper(語音轉文字)+ Piper(文字轉語音),
    整條鏈都不出家門。

    HA Voice Preview Edition 那台小音箱就是設計來跑這個的。
    (2026 年的狀況是:純本地可用,但辨識率跟 Google、Alexa 還有差距,
    Nabu Casa 雲端版本準很多。要看你在意隱私還是在意準確度。)

    ---

    我自己教了大概十個自訂語句,真正天天用的只有三個:
    「我要睡了」「等一下要出門」「有燈沒關嗎」。

    會被常用的都是那種「一句話取代好幾個動作」的。
    單純開關燈的語音,其實還不如伸手按開關快。
    您需要登入後纔可以回帖 登入 | 立即註冊

    本版積分規則

    Archiver|手機版|惟家的智能論壇

    GMT+8, 2026-9-24 10:29 , Processed in 0.074828 second(s), 24 queries .

    快速回覆 返回頂部 返回列表