33
31

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Pepperハンズオン ~基本編B 音声認識~ Google Speech APIを使ってPepperにあなたの名前を知ってもらう [Tech-Circle#7]

Last updated at Posted at 2015-08-05

本記事は Tech-Circle#7 Pepper ハンズオン のハンズオン ~基本編B~ の内容です。


Google Speech APIを使ってPepperにあなたの名前を知ってもらう(所要時間目安: 15分)

はじめに

ハンズオン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 から行えます。

stt.py
apikey = os.environ.get("GOOGLE_API_KEY")

となっている所を以下のように直接書き換えてしまいましょう。

stt.py
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で以下のようなアプリを作ります。順番に説明します。
2-2-1.png

プロジェクトのオープン (pepper_google_stt)

スクリプトは先ほどダウンロードしたpepper_google_sttを使用します。

$ cd ~/workspace/techcircle/techcircle_pepper_handson_b/pepper_google_stt

このプロジェクトは、新規のプロジェクトに対して利用するライブラリ(requests)をあらかじめインポートしたものになります。以下の通り、librequestsがインポートされているのが確認できます。
requestsについては後で説明します。

$ tree . -L 3
.
└── pepper_google_stt
    ├── behavior.xar
    ├── lib
    │   └── requests
    ├── manifest.xml
    └── pepper_google_stt.pml

プロジェクトを開くと以下のような状態になっています。

Screen Shot 2015-07-22 at 09.28.27.png

この状態から、以降のステップでボックスをつないでPepperアプリを作っていきます。

Set Language

最初にSet Languageを配置し、Languageを「Japanese」にします。

2-2-1.png

(ヒント) ボックスはボックスライブラリビューの一番右の検索タブから探しましょう

Screen_Shot_2015-07-22_at_00_28_59.png

Text Edit + Say Text

次にText Edit + Say Textを配置します。Text Editの入力は「あなたのお名前は?」にします。

2-2-2.png

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)を開きます。

2-2-3.png
2-2-4.png

techcircle_boxボックスライブラリにあるボックスを配置します。

2-2-2-1.png

まずはtechcircle_boxボックスライブラリからRecord Sound for Google STTを配置します。
このボックスは組み込みのRecord Soundを若干Google Speech APIで扱い易いようカスタマイズしたものになります。

2-2-3.png

HTTP Google STT

techcircle_boxボックスライブラリから、HTTP Google STTを配置し、変数のGOOGLE_API_KEYの値をあなたのAPI_KEYの値で上書きしましょう。

2-2-4.png

HTTP Google STT の中を少し見てみます。基本的には、①の stt.py の内容をボックスの中の**onInput_onStart()**に埋め込んだ形になります。

HTTP_Google_STT
    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にします。

2-2-5.png

このボックスは文字列を受け取って、文字列を出力します。

私の例では、「白石です」→「こんにちは、白石さん。」の変換をしています。

Edit inputEdit outputで入力と出力の型をそれぞれ「文字列」にしましょう。
以下のイメージは入力だけですが、出力も同様です。
2-2-5-1.png
2-2-5-3.png

Pythonボックスの中身は以下のとおり、 onInput_onStart() メソッドで話者の言葉から名前を抽出して、返答文を組み立てています。(実際には、名前を抽出する処理は、かなり複雑な処理ですが、ここでは簡単のため、正規表現で置換しています。)
なお、ここで、ALMemoryを使ってpepper_google_stt_usernameという変数に名前をセット(記憶)しています。
万が一、名前を認識できない場合(聞き取れなかった)は、今日の天気について言及してごまかす仕様にしています。

Get_Name_Box
    def onInput_onStart(self, p):
        #self.onStopped(p) #activate the output of the box
        pass

↑上記を、↓下記のように置き換えます。

Get_Name_Box
    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ボックスを配置して完成です。

2-2-6.png

アプリケーションの実行と動作確認

以上で完成です。実行してみましょう。あなたの名前をPepperが尋ねるので答えてあげましょう。

メモリウォッチャービューから、メモリキーpepper_google_stt_usernameを追加しておくと、Pepperが名前を覚えてくれるのを確認できます。
3-3-4-1.png

どうでしょうか。正しくあなたの名前を知ってもらえたのではないでしょうか。
せっかく名前を知ってもらえたので、次のステップではあなたのことをもっと知ってもらって、おぼえてもらいましょう。

解答例

shiraco/pepper_google_stt

③ (おまけ) よしもとロボット研究所モーションボックスライブラリでPepperに動きを付けてみよう

まだ、Pepperに動きが無くて面白みに掛けますね。時間に余裕がある方は、以下のボックスライブラリでPepperに動きを付けてみましょう。

特に、API問い合わせは時間を要する処理です。この間にモーションを入れることで、体感時間を短くすることができるかもしれません。

techcircle_box同様以下からボックスライブラリをダウンロードして、プロジェクトに読み込んだ上で、適当なタイミングでモーションボックスをつないでみましょう。

モーション作成を効率化するボックスライブラリを公開 | Pepper アトリエ秋葉原 with SoftBank


以上で、ハンズオン ~基本編B~ は終了です。

次のステップは以下の内容になります。
~基本編C画像認識~ ReKognition APIを使ってPepperにあなたの見た目の印象を聞いてみる


本ハンズオンのイベントページ
Tech-Circle#7 Pepper ハンズオン

33
31
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
33
31

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?