LoginSignup
24
29

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-03-02

はじめに

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

24
29
0

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
24
29