Help us understand the problem. What is going on with this article?

音声データをストリーミングで取得する。

More than 5 years have passed since last update.

はじめに

Pepperのマイクからの音声をPython経由でPC/Mac上にファイルとして取得してみました。マイクロフォンのドライバから音声をとってGoogleさんの音声認識を実行するページが大変参考になりましたが、ちょっと敷居が高かったのでPythonSDKのみで実行できるものにしてみました。
※テストはMac上のPythonでしか行っていません。

下記ソース利用時にはPEPPER_IPを自分のIPアドレスに変えてください。
保存されるファイル名が「pepper_record.raw」となっていますので、こちらも適宜変えてください。

ソース

pepperRecord.py
# encoding:UTF-8
import sys
import time

from naoqi import (ALProxy, ALBroker, ALModule)

PEPPER_IP = "192.168.0.15"

PepperModule = None
memory = None

class PepperModuleClass(ALModule):
    def __init__(self, name):
        ALModule.__init__(self, name)
        #
        self.BIND_PYTHON( self.getName(),"callback" );
        self.tts = ALProxy("ALTextToSpeech", PEPPER_IP, 9559)
        #
        print "PepperModule Initialyze"

    def startRecord(self):
        self.tts.say("録音を開始します")
        #
        # ファイルの保存先設定
        self.saveFile = open("pepper_record.raw","wb")
        self.pepperMicrophone = ALProxy("ALAudioDevice", PEPPER_IP, 9559)
        #
        # 16KHzのモノラル音声でFront(3)マイク1つのみを指定
        self.pepperMicrophone.setClientPreferences(self.getName(), 16000, 3, 0)
        #
        # 録音開始
        self.pepperMicrophone.subscribe(self.getName())

    def processRemote(self, inputChannels, inputSamples, timeStamp, inputBuff):
        # 録音バッファを保存
        self.saveFile.write(inputBuff)

    def stopRecord(self):
        # 録音終了
        self.pepperMicrophone.unsubscribe(self.getName())
        time.sleep(1)
        self.tts.say("録音を終了しました")
        self.saveFile.close()

def main():

    myBroker = ALBroker("myBroker","0.0.0.0",0,PEPPER_IP,9559)

    global PepperModule
    PepperModule = PepperModuleClass("PepperModule")

    try:
        print "録音開始"
        PepperModule.startRecord()
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        print "録音終了"
        PepperModule.stopRecord()
        myBroker.shutdown()
        sys.exit(0)

if __name__ == "__main__":
    main()

ポイントは

・self.BIND_PYTHON( self.getName(),"callback" );

↑ callbackの設定

・processRemote(self, inputChannels, inputSamples, timeStamp, inputBuff):

↑ ドキュメントではprocessのみですが、processRemoteで取得できました。
↑ processとprocessRemoteでは最後の2つの引数の順番が違っていました。(C++APIのヘッダーにて確認)


最後に

録音した音声は16KHz/16bitのモノラル、リトルインディアンのPCM音声となります。
単体マイクだと意外に本体のノイズがのっているだなと思いました。

参考URL

pepperくんの耳を良くする
NAO robot remote audio problems

hanzo
色々なUI/UXを経験しながら日々精進してます。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away