【Python】Pepperマイク to PCスピーカー【Pepper】

Pocket

タイトル通り、Pepperのマイクで拾った音を手元のPCにストリーミングし、リアルタイム再生させる方法の紹介です。

 

先に言っておきますが、本記事の中身は以下の2記事の内容をベタっと接着しただけです。

私の存在意義は接着剤、たとえば木工用ボンド程度…っていうと割と存在意義あるような気もしてきますが。

一つ目の記事ではPepperのマイク音を波形データローカルPCに引っ張ってファイルへ保存する方法を紹介しています。二つ目の記事は純粋なPythonのTipsでPyAudioというモジュールを使うとストリーミングによる音声再生が可能であることが紹介されています。

 

そこで「ファイル保存に使ってるストリームを音声再生用のストリームに差し替えれば音のリアルタイム再生が出来そう」という方針でスクリプトを組合せました。Windowsでしか動作確認してませんがLinuxやMacでも動くハズです。

 

実行に必要なものは以下の通り。

  • Python 2.7.x
  • NAO Python SDK(※)
  • PyAudio

※Choregrapheではないので注意。「欲しいけど手元にない」という場合アトリエ秋葉原で直接問い合わせてください。

そしてスクリプトはこちら。

スクリプトの実行方法ですが、コマンドライン引数でPepperのIPアドレスと接続ポート番号を入れる必要があります。例えば上記スクリプトを”hoge.py”で保存したなら

のように呼び出します。

 

使ってるモジュールとか関数については公式ドキュメンテーションで調べてもらうとして、特に注意というべきは一つ目の引用記事にある通りPYTHON_BIND関数を呼び出すこと、あとALBroker型変数をきちんと作らないとエラーで怒られる事くらいでしょうか。

 

最後に一点だけ追加で注意です。このスクリプトは一見するとどこもおかしくない(ハズ)ですが、なぜか長時間実行(4,5分とか)し続けるとPepper側がシステムエラーを起こす場合があることを確認しています。エラーの詳細や再現条件までは検証してませんが、気をつけて使って下さい。というか原因/対策分かった人居たらぜひ教えて下さいお願いしますm(_ _)m

“【Python】Pepperマイク to PCスピーカー【Pepper】” への6件の返信

  1. 上記機能をJavascript(qimessaging)にてブラウザーで再現しようとしているのですが、
    ALBroker、BIND_PYTHONについて調べましたが、理解が出来ていない状態です

    又、ALAudioDevice呼び出し後、setClientPreferencesの所で
    >>Uncaught (in promise) ALProxy :: ALProxy Can not find service
    とエラーが発生してしまいます。
    Javascript(qimessaging)で上記機能の再現が可能であれば教えてください。
    よろしくお願いします。

    1. ご質問ありがとうございます。

      結論から言うと、この機能は(少なくとも同じ原理では)Javascriptで再現できないと考えています。
      そのうえでご質問に順にお答えします。

      まず本記事で紹介したPythonコードの動作原理についてですが、ご指摘の通りALBrokerとかBIND_PYTHONは
      何してるのかが分かりづらい処理です(公式ドキュメントも貧弱です)。

      より新しい記事で
      Python/qi Frameworkを使ってPepperのマイクからストリーミングするというのを公開しています。こちらではALBrokerやBIND_PYTHONを使わないスタイルの実装を示しているので、あわせてご確認ください。

      またsetClientPreferencesの処理が失敗する理由ですが、現状で手元にPepperが無いので正確な回答はいたしかねます。
      いちおう考えられる理由としては
      「setClientPreferencesの前(BIND_PYTHON)の段階で既に処理が失敗している」
      「仮想ロボットで検証を行おうとした(仮想ロボットではALAudioDeviceはサポートされていません)」
      「PepperのAPI仕様が変わった」
      などが有り得ます。新しい記事の方法であればうまく行くかもしれません。

      最後にJavaScript(qimessaging)で本プログラムの再現が出来ないと考えている理由を簡単に示します。
      JavaScriptでは本記事のコードで言う所のBIND_PYTHON関数や、
      新しい記事のコードにある”session.registerService”相当の関数が使用できません。
      技術的に細かい話題であるため省きますが、音声リアルタイム取得ではこれらのいずれかの機能にアクセスすることが必須です。
      この必須プロセスがJavaScriptではどうにもならないため、プログラムの機能全体としても「再現できない」という回答になります。

  2. ご回答ありがとうございます。
    JavaScriptで再現できない事は残念ですが、細かな説明もして頂き感謝しております。
    リンク先も参照させて頂きます。

    現在、ブラウザー経由にてPepperリモート操作画面を作成しており、本体移動、カメラ移動等までは実装しており
    、上記マイクストリーミング機能を追加しようとしておりました。

    JavaScript(qimessaging)について、ドキュメントも少なく、サンプルページもなかなか見つからないので苦労しています。
    ありがとうございました。

  3. こんにちは!
    聞きたいことがありまして、choregrapheでpyaudioを組み込みたいと思いますけど、pyaudioのlibをインポートして、でもpyaudioのモジュールが見つかりませんというえーらが出てしまいました。
    もしかして、choregrapheの上で直接pyaudioを遣えないですか?
    日本語あまり良くないですから、念のために英語も書いておきます。
    よろしくお願いします。

    Hello, I got a question about if it’s impossible to use pyaudio in choregraphe?

    I have tried many times to import pyaudio’s project file and import it by using os.path.join but it didn’t work. “ImportError: No module named pyaudio” showed up.

    Shoule I connect to ssh to install pyaudio or it’s impossible to use pyaudio on choregraphe directly?
    Looking forward to your reply

    1. こんにちは、ご質問ありがとうございます。

      手元にPepperが無いので正確にはお答えしかねますが、ご質問を見る限りではsys.pathの設定が不十分な可能性が考えられます。
      日本語の記事で恐縮ですが、PepperからTwitterへ投稿する方法をチュートリアル解説した記事があります。(http://qiita.com/yacchin1205/items/3422b5066dcbfca63def )。この記事のなかで、インポートしたライブラリについてonInput_onStart関数内でimport可能にする処理の手順が示されています(http://qiita.com/yacchin1205/items/3422b5066dcbfca63def#python%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%AE%E8%A8%98%E8%BF%B0)。
      これに類似した処理を追加すると動作するかもしれません。

      Hello, thanks for asking!

      Though I do not have a Pepper for the test now, I could estimate a possible cause, the problem about “sys.path” setting.
      There is an article which explains how to post tweet from Pepper (written in Japanese: http://qiita.com/yacchin1205/items/3422b5066dcbfca63def).
      This article’s project imports the OAuth library, then overwrite ‘sys.path’ and reload the modules. (please see: http://qiita.com/yacchin1205/items/3422b5066dcbfca63def#python%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%AE%E8%A8%98%E8%BF%B0).
      This process will enable PyAudio module in your project. Good luck!

  4. Hello! Thank you for your quick reply!
    I’ve tried it all day yesterday but it still didn’t work out.
    I supposed the problem might be caused by the imported project or “sys.path” setting.
    I’m not sure if the source project (downloaded from https://pypi.python.org/pypi/PyAudio) can be used directly or maybe I lost other steps (ex:install other lib?)
    Regarding the method, it didn’t work out because the path wasn’t traced successfully.
    Therefore, I put the pyaudio source project into lib folder in Choregraphe Suite 2.4.
    “No module named pyaudio” still showed up.
    However, I am still working on it . Wish me luck!
    (I’m sorry, it’s a bit difficult for me to translate these sentence to Japanese this time)
    Regards

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です