本記事は Tech-Circle#7 Pepper ハンズオン のハンズオン ~基本編B~ の内容です。
Google Speech APIを使ってPepperにあなたの名前を知ってもらう(所要時間目安: 15分)
- ① Google Speech APIをターミナルから実行してみる (要Pythonインストール)
- ② Google Speech APIを使ってPepperにあなたの名前を確実に覚えてもらう
- ③ (おまけ) よしもとロボット研究所モーションボックスライブラリでPepperに動きを付けてみよう
はじめに
ハンズオンBで利用するプロジェクトはshiraco/techcircle_pepper_handson_bにあります。作業ディレクトリに一括git cloneでダウンロードしておきます。
$ cd ~/workspace/techcircle
$ git clone https://github.com/shiraco/techcircle_pepper_handson_b.git
$ cd techcircle_pepper_handson_b
ディレクトリ構成は以下のようになっています。
$ tree -L 1
.
├── google_stt # ①で利用
└── pepper_google_stt # ②で利用
以降では上記のプロジェクトを利用します。
① Google Speech APIをターミナルから実行してみる (要Pythonインストール)
まず、ターミナルからpythonスクリプトで実行して動作確認してみます。基本的には、動作確認がとれたpythonスクリプトをPepperのボックスとして組み込めばPepperアプリとして実装もできるはずです。
プロジェクトの確認 (google_stt)
スクリプトは先ほどダウンロードしたgoogle_sttを使用します。
$ cd ~/workspace/techcircle/techcircle_pepper_handson_b/google_stt
外部ライブラリのインポート (requests)
このプロジェクトはAPIにアクセスするにあたって、requestsというライブラリを使っています。pip
が実行できる環境であれば以下のコマンドでインストールできます。
$ pip install -r requirements.txt
API_KEYの設定
エディタを開いてapikeyの値をあなたのGoogleのAPI_KEYの値で上書きしましょう。API_KEYの確認は https://console.developers.google.com から行えます。
apikey = os.environ.get("GOOGLE_API_KEY")
となっている所を以下のように直接書き換えてしまいましょう。
apikey = "YOUT_API_KEY_HERE"
スクリプトの実行と動作確認
pythonのスクリプトを実行することでクラウドの音声認識を呼び出すことができます。
$ python stt.py test.wav
白石です
認識された結果、もっともらしい結果が得られます。
ちなみにtest.wav
にはあらかじめ以下の(参考)の手順で音声で私の名前「シライシです。」という音声を録音していました。
実際Googleの音声認識結果は確信度付きで複数件戻ってきます。その中で一番確信度の高いものを取り出しています。
(参考) マイクの音声をwavファイルに録音[mac]
macの場合、Homebrewを使ってsoxをインストールすれば、音声ファイル(wav)ファイルを作成することができます。自分の名前を録音してみましょう。
$ brew install sox
$ rec --encoding signed-integer --bits 16 --channels 1 --rate 16000 test.wav
test.wav
というファイルを開いてみると録音した音声が聞けるはず。
② Google Speech APIを使ってPepperにあなたの名前を確実に覚えてもらう
アプリケーションの作成
それでは上記で試した内容をPepperアプリとして実装してみます。
本節では、最終的にChoregrapheで以下のようなアプリを作ります。順番に説明します。
プロジェクトのオープン (pepper_google_stt)
スクリプトは先ほどダウンロードしたpepper_google_sttを使用します。
$ cd ~/workspace/techcircle/techcircle_pepper_handson_b/pepper_google_stt
このプロジェクトは、新規のプロジェクトに対して利用するライブラリ(requests)をあらかじめインポートしたものになります。以下の通り、lib
にrequests
がインポートされているのが確認できます。
requestsについては後で説明します。
$ tree . -L 3
.
└── pepper_google_stt
├── behavior.xar
├── lib
│ └── requests
├── manifest.xml
└── pepper_google_stt.pml
プロジェクトを開くと以下のような状態になっています。
この状態から、以降のステップでボックスをつないでPepperアプリを作っていきます。
Set Language
最初にSet Languageを配置し、Languageを「Japanese」にします。
(ヒント) ボックスはボックスライブラリビューの一番右の検索タブから探しましょう
Text Edit + Say Text
次にText Edit + Say Textを配置します。Text Editの入力は「あなたのお名前は?」にします。
Record Sound for Google STT
次は音声認識するためのボックスを配置します。このボックスは今回のハンズオンではこちらで用意したものを使います。以下でその使い方を説明します。
以下にアクセスして、techcircle_boxボックスライブラリをダウンロードします。
https://github.com/shiraco/techcircle_box
techcircle_boxボックスライブラリは次のハンズオンCでも利用するため、親ディレクトリにダウンロードしておきます。
$ cd ~/workspace/techcircle
$ git clone https://github.com/shiraco/techcircle_box.git
ボックスライブラリを開くから、ダウンロードしておいたtechcircle_boxボックスライブラリ(techcircle_box/techcircle.cbl
)を開きます。
techcircle_boxボックスライブラリにあるボックスを配置します。
まずはtechcircle_boxボックスライブラリからRecord Sound for Google STTを配置します。
このボックスは組み込みのRecord Soundを若干Google Speech APIで扱い易いようカスタマイズしたものになります。
HTTP Google STT
techcircle_boxボックスライブラリから、HTTP Google STTを配置し、変数のGOOGLE_API_KEYの値をあなたのAPI_KEYの値で上書きしましょう。
HTTP Google STT の中を少し見てみます。基本的には、①の stt.py
の内容をボックスの中の**onInput_onStart()**に埋め込んだ形になります。
def onInput_onStart(self, p):
self.logger.info(p)
filepath = p
import os
import json
import requests
import urllib
try:
timeout = int(self.getParameter("Timeout"))
q = {"output": "json", "lang": "ja-JP", "key": self.getParameter("GOOGLE_API_KEY")}
url = "http://www.google.com/speech-api/v2/recognize?%s" % (urllib.urlencode(q))
self.logger.info(url)
headers = {"Content-Type": "audio/l16; rate=16000"}
data = open(filepath, "rb").read()
response = requests.post(
url,
headers=headers,
data=data,
timeout=timeout
)
jsonunits = response.text.split(os.linesep)
res = ""
for unit in jsonunits:
if not unit:
continue
obj = json.loads(unit)
alternatives = obj["result"]
if len(alternatives) > 0:
breakflag = False
for obj in alternatives:
results = obj["alternative"]
for result in results:
res = result["transcript"]
breakflag = True
break
if breakflag:
break
text = res.encode("UTF-8")
self.logger.info("result: %s" % text)
self.onStopped(text)
except requests.exceptions.RequestException, message:
self.logger.warn("Failed to open: message=%s" % (message))
self.onFailed(message)
HTTP Google STTは外部ライブラリのrequestsに依存しています。
今回は、ベースとなるプロジェクトにあらかじめ必要なライブラリがインポートされているのでそのまま使います。
Get Name + Say Text
Pythonボックスを配置して、ボックスの名前はGet Nameにします。
このボックスは文字列を受け取って、文字列を出力します。
私の例では、「白石です」→「こんにちは、白石さん。」の変換をしています。
Edit inputとEdit outputで入力と出力の型をそれぞれ「文字列」にしましょう。
以下のイメージは入力だけですが、出力も同様です。
Pythonボックスの中身は以下のとおり、 onInput_onStart() メソッドで話者の言葉から名前を抽出して、返答文を組み立てています。(実際には、名前を抽出する処理は、かなり複雑な処理ですが、ここでは簡単のため、正規表現で置換しています。)
なお、ここで、ALMemoryを使ってpepper_google_stt_username
という変数に名前をセット(記憶)しています。
万が一、名前を認識できない場合(聞き取れなかった)は、今日の天気について言及してごまかす仕様にしています。
def onInput_onStart(self, p):
#self.onStopped(p) #activate the output of the box
pass
↑上記を、↓下記のように置き換えます。
def onInput_onStart(self, p):
import re
name = re.sub(r'です', '', p)
self.logger.info(name)
memory = ALProxy("ALMemory")
memory.insertData("pepper_google_stt_username", name)
if name is None or name == "":
text = "今日はいい天気ですね"
else:
text = "こんにちは" + name + "さん"
self.onStopped(text)
最後にSay Textボックスを配置して完成です。
アプリケーションの実行と動作確認
以上で完成です。実行してみましょう。あなたの名前をPepperが尋ねるので答えてあげましょう。
メモリウォッチャービューから、メモリキーpepper_google_stt_username
を追加しておくと、Pepperが名前を覚えてくれるのを確認できます。
どうでしょうか。正しくあなたの名前を知ってもらえたのではないでしょうか。
せっかく名前を知ってもらえたので、次のステップではあなたのことをもっと知ってもらって、おぼえてもらいましょう。
解答例
③ (おまけ) よしもとロボット研究所モーションボックスライブラリでPepperに動きを付けてみよう
まだ、Pepperに動きが無くて面白みに掛けますね。時間に余裕がある方は、以下のボックスライブラリでPepperに動きを付けてみましょう。
特に、API問い合わせは時間を要する処理です。この間にモーションを入れることで、体感時間を短くすることができるかもしれません。
techcircle_box同様以下からボックスライブラリをダウンロードして、プロジェクトに読み込んだ上で、適当なタイミングでモーションボックスをつないでみましょう。
モーション作成を効率化するボックスライブラリを公開 | Pepper アトリエ秋葉原 with SoftBank
以上で、ハンズオン ~基本編B~ は終了です。
次のステップは以下の内容になります。
~基本編C画像認識~ ReKognition APIを使ってPepperにあなたの見た目の印象を聞いてみる
本ハンズオンのイベントページ
Tech-Circle#7 Pepper ハンズオン