Nature Remo APIでエアコンを声で操作する|家電の種類が足りず動かなかった原因と修正(E.D.E.N.開発ログ #8)

E.D.E.N. devlog 08 - voice air conditioner control 開発ログ

E.D.E.N.という、わたし専用のAIアシスタントを作っています。従量課金のAPIを増やさず、手元のPCで動かすことを条件にしているプロジェクトです。

家電は、Nature Remo(スマートリモコン)経由で操作しています。開発ログ #2 で、テレビを声で消せるようにしました。ところが、エアコンは声で操作できないままでした。今回はその原因と、直した記録です。

原因は、エアコンが「存在しない」扱いだったこと

Nature Remoに登録している家電の一覧を、APIで取り出してみました。登録されている家電には「エアコン(AC)」「テレビ(TV)」「照明(LIGHT)」「学習させた赤外線信号(IR)」といった種類が付いています。

エアコンはどれも、Nature Remo側で「エアコン」として正しく登録されていました。

問題はE.D.E.N.のコードの側でした。家電の一覧を取り込むとき、操作ボタンを拾っていたのは「テレビ」と「照明」だけでした。エアコンは一覧には載るものの、操作の手段が1つも無い家電として扱われていました。声で「エアコンつけて」と言っても、そもそも受け付ける言葉として登録されていなかったのです。

エアコンは、ボタンではなく「状態」を送る

テレビや照明は、「電源ボタン」「音量+」のようにボタンを1つずつ送ります。エアコンはそうではありません。Nature RemoのエアコンAPI(aircon_settings)には、運転モード・温度・風量をまとめた状態を送ります。

  • 運転する: button を空にして送る
  • 止める: button=power-off を送る
  • モードと温度を変える: operation_mode=cool(冷房)と temperature=26 のように送る

注意が要ったのは、エアコンごとに設定できる温度の範囲や刻みが違うことです。0.5度刻みで設定できる機種もあれば、1度刻みの機種もありました。さらに「自動運転」では、温度が「26度」ではなく「−2〜+2」の相対値になる機種もありました。

そこで、声で指定された温度は、そのエアコンに登録されている値のうち、いちばん近いものに丸めて送るようにしました。設定できる範囲を超える温度を言われたときは、そのエアコンの上限か下限に合わせます。自動運転中に「◯度にして」と言われたときは、送らずに「自動運転では温度を指定できません」と返します。

声の言い方は、AIに解釈させない

「エアコンつけて」を、会話AIに解釈させることもできます。ただ、E.D.E.N.では開発ログ #2 と同じく、物理的な操作はAIに判断させず、決まった言い方だけで動かす方針にしています。聞き間違いや、AIの思い込みで家電が動くのを避けるためです。

受け付けるようにした言い方は、たとえば次のとおりです。

  • 「エアコンつけて」「エアコン消して」
  • 「冷房26度にして」「暖房にして」「除湿にして」
  • 「温度を2度下げて」「26度に上げて」
  • 「〇〇のエアコンを止めて」(部屋の名前が付いた登録名から探す)

逆に「エアコンの電気代を教えて」「エアコンの掃除をして」のような文は、操作として受け付けず、会話AIに回します。「〜して」で終わっていても、モードや温度の指定が無ければ操作ではない、と判定しています。

「26度に上げて」は、最初「1度上げる」と解釈していました。「上げて」の前に「26度に」が付いているときは、相対ではなく絶対値として扱うよう直しています。こうした言い方の判定は、自動テストで確かめてから入れました。

AIが「操作しました」と言うのに、何も動かなかった

実装後にもう一つ、見落としに気づきました。会話AIに「部屋が暑い」と話しかけると、こう返ってきたのです。

エアコンを冷房運転で設定温度25度に下げます。

もっともらしい返事ですが、実際には何も動いていません。会話AIには家電を操作する手段が無く、操作するのは上で書いた「決まった言い方」の経路だけだからです。AIが、できないことを「します」と言っていました。

会話AIへの指示を直し、家電は自分では操作できないこと、操作したように言わないこと、必要なら言い方を案内することを明記しました。今は、同じ「部屋が暑い」にこう返ります。

「エアコンを冷房25度にして」のように言っていただければ、操作できます。まずはそちらのエアコンをつけましょうか?

(実際の返事では部屋の名前が入っていたので、ここでは伏せています)

そして、この提案の直後に「はい」「お願い」と答えると、提案されたエアコン操作を実行するようにしました。提案の中に「」付きの言い方があればそれを、無ければ提案文に出てきたエアコンと運転モードを使います。家電の名前が出てこない提案(「消しておきましょうか」だけ、など)には、推測で動かさず何もしません。

実機での確認

登録しているエアコンについて、声での運転・停止・モード変更・温度変更が実際に動くことを、わたしが部屋で確認しました。Nature Remoは赤外線を送るだけで、エアコンが本当に受け取ったかは返ってきません。そのため、E.D.E.N.の表示は「最後に送った設定」としています。

使っているスマートリモコンはこれです。わたしの環境では、Nature Remo側でエアコンとして登録してあれば、API(aircon_settings)から運転・停止・モード・温度を変えられました(設定できる温度の範囲や刻みは機種ごとに違いました)。

※上記はAmazonアソシエイトのリンク(広告)です。紹介しているのは実際に使っている機器だけで、実物の写真は掲載していません(アフィリエイトについて)。

わたしが学んだこと

家電が操作できないとき、最初に疑ったのは赤外線やNature Remoの側でした。実際には、登録は正しく、APIも使える状態で、コードが知っている家電の種類が足りなかっただけでした。

そしてもう一つ。操作の経路を「決まった言い方だけ」に絞っても、会話AIは平気で「操作します」と言います。できることの範囲は、コードで絞るだけでなく、AIにも言葉で伝えておく必要がありました。

コメント

タイトルとURLをコピーしました