大人のおもちゃ箱

ガジェット関係のツール・グッズ、WEBサービスのレビューや体験談が主なブログ(お父さんの大人のおもちゃ箱)です。

Google Home IFTTT Raspberry piでテレビ操作 日本語の認識率を向上させる

f:id:rikochanhayatokun:20180323153135p:plain

最近、Google Home&IFTTT&Raspberry piを使った、ブラビアテレビの操作をポチポチと触っております。

テストアプリの仕様が嫌で、Actions on Googleでは無くIFTTTサービスを使っていますが

いろいろと調べているうちに、Google Homeのスマートホームアプリでは、テストアプリの制約を受けないらしい?ことが分かり、それに心が移ろうとしています・・・

でも、折角ここまで仕上げて来たのだから、勉強を兼ねて最後まで現在のシステムを調整していきたいと思います。

現在、Google Homeへの音声指示にて、テレビを操作するところまで一通り完成しています。

電源、チャンネル、その他ボタン操作など、リモコンで操作できることは、ほぼ全て音声から指示を送ることができました。

これで、日常の生活が便利になる! 我が家に革命が起こるぞ!っと期待するのでしたが・・・

あれ?5回に1回程度しか正常に動作してくれません。

そう、音声の認識が悪いです。

どうやら発声のリズムを変えるだけで、IFTTTから送られてくるテキストが変わって、認識されないようです。

(もちろんその他の日本語の揺れにも対応してくれません)

我が家では

リモコン $(テレビ操作のコマンド)

で、IFTTTが動作するように設定しています。

例えば

リモコン はっちゃんねる

と言えば

・8 チャンネル ・8 ちゃんねる ・はっ ちゃんねる ・は っ ちゃんねる

などなど、期待していないテキストになってリクエストが届くことがあります。

少しでも声の間隔があけば、IFTTTから送られてくるテキストには、空白・スペースが付くようです。

その為、Raspberry piの受け側で、正規表現やら、スペース区切りの配列化などで、いろいろとキーワードに対応させていました・・・

その都度、ボタン毎に調整していくのが面倒になってきたので、Dialogflowを使って日本語の認識をAI化して、目的のコマンドを得ることにしました。

一般的には

Google Home -> Actions on Google -> Dialogflow -> Raspberry pi -> TV

になるかと思いますが

我が家では

Google Home -> IFTTT -> Raspberry pi -> Dialogflow -> (Raspberry pi) -> TV

の仕様で、IFTTTから送られてくるテキストを、Dialogflowの自然言語処理機能を使い処理します。

(Dialogflowの詳しい内容や使い方は省略します)

https://dialogflow.com/docs/getting-started/basics

$order_text = 'IFTTTからのテキスト';

$dialogflow_data = dialogflow( $order_text );

function dialogflow( $text ) {

  ////$time_s =  microtime( TRUE );

  $CLIENT_ACCESS_TOKEN = '作成したプロジェクトから取得した値';

  $api_url  = 'https://api.api.ai/v1/query?v=v=20150910';

  $st_head = [
    'Content-Type: application/json; charset=UTF-8',
    'Authorization: Bearer '. $CLIENT_ACCESS_TOKEN
  ];

  $st_body = [
    'sessionId' => md5( uniqid( mt_rand(), TRUE ) ),
    'lang'      => 'ja',
    'query'     => $text,
  ];

  $st_option = [
    'http'=> [
      'method'  => 'POST',
      'header'  => implode( "\r\n", $st_head ),
      'content' => json_encode( $st_body )
    ]
  ];

  $stream = stream_context_create( $st_option );
  $dialogflow_data = file_get_contents( $api_url, FALSE, $stream );

  $dialogflow_data = json_decode( $dialogflow_data, TRUE );

  return $dialogflow_data;
}

を、実行しパラメータで得た値を元に、テレビ操作するだけです。

$BtnName = $dialogflow_data['result']['parameters']['パラメーター値'];

switch ( $BtnName ) {
case 'on':
  // 処理
  break;
case 'off':
  // 処理
  break;
default:

}

dialogflowのEntitiesに予めパラメーター値を登録する必要がありますが、慣れてくると楽しいものです。

また、認識についてもその都度トレーニングを行うことで、認識率を上げることができ便利です。

これで、テストした結果

テレビ操作の認識率がほぼ100%になりました。意外な制度にめちゃめちゃ満足です!

赤外線デバイスとスマートホームの組み合わせ以上に、音声の認識がされる!そんな感じです。

今のところは・・・

Actions on Googleからdialogflowを使うのではなく、他の言語プログラムからdialogflowを使えると、いろいろなシステムで使えて便利そうですね。

(dialogflowからのレスポンスは大体0.5秒以内くらいです。とても高速に動作するので、他のシステムでも用意に使えそうです。例えばサイト内検索、商品・製品・サービス検索など、自前のお問い合わせチャットに絡ませるのも面白そうです)

今回はとても勉強になりました。

一通り終わったので、次回はスマートホームアプリの開発を試してみたいと思います。