はじめに
筆者は趣味でコミュニケーションロボットPepperのアプリ開発をやる事があるのですが、自宅にPepperはおらず、いつもPepperアトリエを利用させて頂いています。しかしながら、本記事を書いている2020年4月現在、筆者は外出自粛中であり、かつアトリエも休業になってから1ヶ月以上が経っており、ここしばらくPepperに会えていません。
趣味を自粛するのもちょっと疲れてきたので、なんとか自宅にあるものでPepperを自作できないかと模索してみました。
材料
- Pepperぬいぐるみポシェット
- 正式名称:一緒におでかけPepperポシェット
- Google Home Mini
-
MESHブロック「ボタン」と「動き」
- 旧称:MESHタグ
- MacBook (サービス常駐用。ラズパイに移行予定)
- iPad mini(MESHアプリ対応のスマホやタブレットならなんでもOK)
Pepperポシェットの中にMESHブロック2つとGoogle Home Miniを入れてインタラクションをします。
センサーブロック2つはちょうどお腹辺りに、Google Home Miniは頭部にすっぽり入ります。
ぺたんこだった頭が少しふっくらして、ちょっとだけ本物に近づいてきた気がしますね。
Pepperの挙動を思い出してみる
要件定義の前に、Pepperのよくある挙動をなんとなく思い出してみます。
- 「こんにちは」とか「ペッパー」と話しかけると、簡単な受け答えをしてくれる
- センサーのある部位(頭とか手とか)を触ると、びっくりしたり、くすぐったがる
- 定期的に「ねぇねぇ、何してるのぉ?」とか声かけてくる
これらは、Naoqi OS 2.5.x 版と言われる旧型のモデルの筐体が「オートノマスライフ」という自律モードで動いている時の挙動です。最新のAndroid版と呼ばれるPepperは会話エンジンが異なるのと、センサー値に応じた挙動も異なる可能性があります。
ただ、筆者が開発に利用しているのは前者の旧型ですので、これでよしとしましょう。
要件
記憶を辿った結果を受けて、ざっくり以下の要件を定義しました。
- ユーザーが話しかけたら、言葉を返す
- センサーの値に応じて言葉を発する
- 定期的にユーザーに対して言葉を発する
設計
処理フローは以下の通りです。
要件1については、Actions on Googleを使って、Pepperと会話しているような会話フローを作成します。要件2,3についてはgoogle-home-notifierを使い、センサーや時刻をトリガーとしてGoogle Homeに通知を飛ばす仕組みを利用します。
実装
1. Actions on Googleを使って、Pepperっぽい受け答えをするActionを作成
Actions Consoleから、新規プロジェクトを作成し、Dialogflowで以下のように作成しました。
- Default Welcome Intentの編集
アクション起動時のセリフとして以下を設定しました。
- CallPepper intentを新規作成
Training phrasesに"ペッパー/Pepper"を追加し、
2. MESHアプリとMESH SDKでセンサー値に応じた発話を実装
こちらの記事を参考にさせて頂き、google-home-notifierの導入、およびMESHカスタムタグの作成をしました。
https://qiita.com/glory/items/a464872b9655a21e9f2f
複数の返答候補からランダムに選択するようにするため、トリガー時に渡すテキストを以下のような書式にしました。
・MESHのボタンが押された時
ナニー?, どうしたの?, おなか, くすぐったいよー
・動きを検出した時
きゃっハッハー, わあ, びっくりー
そして、MESHカスタムタグ内のコードについては以下のようにしました。
var endPointURL = "https://" + properties.ipAddress + "/google-home-notifier";
var resList = properties.speakText.split(','); //propertiesのspeakTextを配列に変換
var resText = resList[Math.floor( Math.random() * resList.length )]; //発話テキストをランダムに選択
ajax ({
url : endPointURL,
type : 'post',
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
timeout : 5000,
data:{text: resText},
success : function ( contents ) {
log('trigger success');
callbackSuccess( {
resultType : 'continue'
} );_
},
error : function ( request, errorMessage ) {
log("detail: " + JSON.stringify(request));
log('trigger : Network error');
log(endPointURL);
log('trigger : ' + errorMessage);
callbackSuccess( {
resultType : 'continue'
} );
}
});
return {
resultType : 'pause'
};
MESHアプリでは以下のようにフローを設定します。
これで、お腹を押されたり、揺らされたら何らかの反応を示すようになりました。
3. IFTTTのDate/TimeとWebhookで定期的な発話を設定
IFTTTと、前節で設定したgoogle-home-notifierを使って、決まった時間に「ねぇねぇ、何してるのー?」と発話させます。IFTTTのトリガー(this)をDate&Timeにし、Webhookを使って(that)、毎時45分に稼働中のgoogle-home-notifierにリクエストを飛ばします。設定は以下のようにしました。
実行結果
それでは、話しかけてみましょう。
[実行結果1] https://youtu.be/pRXoF8uH23c
揺らしたり、お腹を押してみると。。。
[実行結果2] https://youtu.be/ksDXIohJB-w
google-home-notifierを使った方(2つ目の動画)はだいぶタイムラグはありますが、なんとかPepperらしく(?)リアクションしてくれました。
結論
・・・やっぱり本物が良いですね。