Googleアシスタントをラズパイで動かしてから、子どもたちが喜んで『OK グーグル』を連呼しています。
- 文字入力と違い子どもでも操作できる
- 自分の声に反応してくれるだけで、なんだか楽しい
のがお気に入りのようです。ということで、テキスト入力に応答してくれるチャットボットとGoogleアシスタントをつないで、おしゃべりチャットボットを作ってみたいと思います。
作りたい物
ユーザがモンスターなのは気にしないでください。決して家の子ではありません。
出来上がった物
できあがったチャットボットの構成はこんな感じになりました。
Googleアシスタントに『テスト用アプリにつないで』と話しかけることで、おしゃべりが始まります。一度始まると、『OK Google』というウェイクワードを言わなくても会話が続けられるのがいいです。
GoogleHomeまたはGoogleアシスタントを準備する
今回はiPhone6にインストールしたGoogleアシスタントを使用しました。
Repl-AIでチャットボットを用意する
Repl-AIは誰でも簡単に、問い合わせ対応チャットボットを作れるサービスです。プログラミングをしないで、思いのままに応答させられるチャットボットを作ることができます。今回はサンプルとして用意されているdocomoAPI連携(docomoapi)を使ってみます。
docomoAPI連携は3つのボットと連携しています。
- 知識Q&Aボット
- トレンド記事ボット
- 雑談対話ボット
「〇〇を教えて」と入力すると、wikiのURLを返してくれる
「〇〇のニュース」と入力すると、ニュース記事を検索してURLを返してくれる
適当に話しかけると、なんとかテイストを合わして返してくれる
Reple-AIを使うにはまずはユーザ登録が必要です。docomo Developer supportへの登録を求められますがそのまま進めましょう。ログインしてダッシュボードを開くと、こんな画面です。
sampleというプロジェクトが用意されているのでこちらを選び、さらにシナリオとしてdocomoAPI連携を選びます。
吹き出しアイコンを押すとシミュレータが起動しますので、テキストを入力してみます。
雑談もトレンドもそれなりに動いてくれます。ではリファレンスに沿って、REST APIで呼び出してみます。まずはユーザIDの取得が必要です。HeadersとBodyにパラメータをセットして呼び出しましょう。もちろんcurlでOKですが、windowsの場合にはchrome拡張などが利用できます。ユーザIDを取得したら、対話APIを呼び出してみます。
リクエスト
レスポンス
うん、良さそうですね。
DialogFlowでRepl-AIとGoogleアシスタントをつなぐ
次にDialogFlowを使って、Googleアシスタント側の機能を拡張します。DialogFlowはGoogleアシスタントからの入力を受け取って、言語解析をしてくれるエンジンです。DialogFlowの使い方はこちらのサイトに詳しく解説されているので省略します。
今回の使い方だと
- プロジェクトを作る
- インテントを作る
- フルフィルメントを実装する
になります。
インテント
ユーザがやってもらいたいことを決めるのがインテントになります。今回は音声入力をそのままRepl-AIに渡してしまおうと思うのでこんな感じです。
こちらのやまびこと同じです。
5分でひどいGoogle Home エージェントを作ったらひどい結果になった
この動画、しょうもないですけど笑えます。
フルフィルメント
ここが山場です。
DialogFlowから外部のサービスを呼び出すなど、動きをカスタマイズするために用意されています。Repl-AIをwebhookで呼び出すだけで良いなら簡単そうなのですが、DialogFlowが指定するパラメータが実装されていないとダメなようなので諦めます。ということで、もう一つのInline Editorを選んで、firebase上で実行されるnode.jsでRepl-AIを呼び出すことにします。firebaseのnode.jsにrequestが用意されているので、それを使って、Repl-AIのAPIを呼び出すことにします。コードはこんな感じです。
const rp = require('request-promise'); let headers = { 'Content-Type': 'application/json', 'x-api-key': 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' }; let body = { appUserId: 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', botId: 'sample', voiceText: msg, initTalkingFlag: false, initTopicId: 'docomoapi' }; let res = ''; let options = { method: 'POST', uri: 'https://api.repl-ai.jp/v1/dialogue', headers: headers, body: body, json: true }; rp(options).then(function (reply) { res = reply.systemText.expression; console.log(res); sendResponse(responseToUser); }).catch(function (err) { console.error(err); });
XXXはみなさんの値で設定して下さい。node.jsを書き慣れないので散々エラーを踏みました。console.log("")
でfirebaseのログにdumpできるので、一歩ずつ進んだ感じです。
さて動かしてみた
知識Q&Aとトレンド記事はURLも読み上げてしまうので、改良が必要です。雑談が一番おもしろいです。我が家の子供たちは不思議そうな顔して楽しんでいました。