GRデザインコンテスト2017のグランドフィナーレ(2017年12月9日)を無事に終えたので、今回、野良ハックチームがエントリーした作品「カンパイシェア」の足跡について記事に残しておこうと思う。
事の始まりは2017年4月28〜30日に開催されたJUNCTION TOKYO 2017に遡る。
この時はまだ野良ハックチームという名前を名乗っていなかったが、当日参加したメンバーでチームを組んで、ROBOTICS TRACK (ロボットと人間が実現する働き方革命) でハックタイムに突入することになった。
課題と解決(案)
我々が解決すべき課題は少子高齢化が進む日本の将来の人手不足、特に飲食業界・ホールスタッフの人手不足をPepperによって解決を図るハックである。
まず人手不足の要因分析だが、これについてはいくつか考えられる。
・立ちっぱなし (キツい)
・混雑時の忙しさ (大量の注文、調理、配膳)
・安いバイト代 (人件費削減)
・夜型の生活リズム (体調不調をきたす)
・お客様からのクレーム (お酒が入ることによる理不尽な苦情)
・お客様との会話、笑顔作り (会話スキル、表情接客)
しかし一方、2020年東京オリンピック開催に向けて訪日外国人旅行者の数は年々増加傾向であり、また、それに合わせて消費額も増加するため、機会損失を避け経済効果を最大化する喫緊の課題である。
検討した結果、Pepper 3体による接客スタッフの代替をデモすることにした。
・受付 (いらっしゃいませ、予約有無 / 人数 / コースの確認)
・注文 (おススメ紹介、感情のコントロール、店内雰囲気の改善、割引クーポンの発行、簡易ゲーム(エンタメ)の提供)
・配膳 (料理を運ぶ、空いたグラス / 食器を下げる)
アピール要素として加えたのが MESH の傾きセンサーを用いた空いたグラスの検知で、Pepperが声掛けすることにより良い雰囲気作り「いい飲みっぷり!」や追加注文の促進を狙った「もう 1杯いかがですか?!」を実装した。
これが「カンパイシェア!」の原点である。
構成と実装
構成はビールジョッキの底に MESH の傾きセンサーをグルーガンで固定しただけのシンプルなもので、右手 / 左手 / 鷲掴み どの持ち方でもグラスが空いたことを傾き(90°)によって検知できるように実装した。
傾きセンサーと MESH アプリ (スマホ、または、タブレット) の間は Bluetooth で接続され、スマホ、または、タブレットは Wi-Fi に接続された PC 経由で Pepper と接続される構成である。(PC に NAOqi Python SDK がインストールされている。)
MESH アプリ
MESH アプリは Node-RED と同様、電子タグをドラッグ&ドロップでつなげていくだけなので直感的に仕組みを作ることができる。PC と連携させるカスタムタグ (下図の赤枠で囲ったタグ) のみ MESH SDK で作成する。
URLに表示されている IP アドレス (192.168.10.16) は PC に付与された IP アドレスである。
MESH SDK
ブラウザで MESH SDK へアクセスする。(アカウントを作成してログインする。)
ここを参考にして GET URL という名前でカスタムタグを作成し、Execute タブ を選択して、下図の赤枠で囲った部分にコードを入力する。
ajax ({
url : properties.url,
type : "GET",
timeout: 5000,
success : function ( contents ) {
log("GET URL : SUCCESS");
callbackSuccess( {
resultType : "continue"
} );
},
error : function ( request, errorMessage ) {
log("GET URL : ERROR");
callbackSuccess( {
resultType : "continue"
} );
}
});
return {
resultType : "pause"
};
NAOqi Python SDK
PC (Mac OSX) に NAOqi Python SDK をインストールして Pepper を喋らせるようにする。単に喋らせるだけであれば say 関数にセリフを設定すれば済むのだが、自然なイントネーションと抑揚で聞こえるようにするにはセリフを調整する必要がある。
ここ を参考にしてブラウザから Pepper へ直接アクセスして何度も試行錯誤しながら最高のセリフになるまで調整するのだ。(職人技が必要と言われる所以。)
最終的に以下のような声の高さ、声のスピード、当て字になった。
「いい飲みっぷり!もう1杯いかがですか〜!?」
↓
"\\vct=153\\\\rspd=100\\ ゐーー蚤|ぷりヰッ!!モォーいっぱい|いかがですかー"
Python スクリプトを実行して Pepper が期待通りに喋ってくれるかどうか確認する。
$ python jt2017.py
# -*- encoding: UTF-8 -*-
from naoqi import ALProxy
ip = "" # Pepperに付与されたIPアドレスを設定
port = 9559
# say
tts = ALProxy("ALTextToSpeech", ip, port)
tts.setLanguage("Japanese")
# いい飲みっぷり!もう1杯いかがですか〜!?
tts.say("\\vct=153\\\\rspd=100\\ ゐーー蚤|ぷりヰッ!!モォーいっぱい|いかがですかー")
# animated speech
#atts = ALProxy("ALAnimatedSpeech", ip, port)
#atts.setLanguage("Japanese")
#atts.setBodyLanguageMode(2)
# いい飲みっぷり!もう1杯いかがですか〜!?
#atts.say("\\vct=153\\\\rspd=100\\ ゐーー蚤|ぷりヰッ!!モォーいっぱい|いかがですかー")
Node.js
MESH アプリから GET リクエストを受け付けて上記の Python スクリプトを実行する簡易ウェブサーバを立てる。
node コマンドを実行してブラウザからアクセスして Pepper が期待通りに喋ってくれるかどうか確認する。
$ node app.js
var http = require('http');
var exec = require("child_process").exec;
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello test\n');
exec('. ~/.profile \;/usr/bin/python /var/Pepper/Python/jt2017.py', (err, stdout, stderr) => {
if (err) { console.log(err); }
console.log(stdout);
});
}).listen(80, '0.0.0.0');
ロボット居酒屋、開店!
ロボット居酒屋開店と同時に飲みまくり状態である。(基本的にはエナジードリンクだが、中身がアルコールのものも・・。)
Pepper が ”ヨイショ!” してくれるからといって、くれぐれも飲み過ぎには注意されたい。
足跡(その2)へ続くことに・・。