開発ブログ

第17回 パペロでJuliusを使って録音再生してみた

投稿日時:2019年5月10日 13:05

こんにちは。ピャペロンです!
今回はパペロでJuliusを使って録音再生してみた。
arecordでは発話区間を検出できないので録音の開始と終了を命令する必要があるが、
Juliusのadintoolを利用すると発話区間を検出できるので、しゃべった区間だけを録音できるよ。
オプションで柔軟な設定も可能だ。

使用するハード
・PaPeRo i実機

使用するソフト
・Windows 10
・テキストエディタ(Visual Studio Code
・Python 3.4(PaPeRo i)
・WinSCP
・Tera Term


中央ボタンを押すと録音待機状態になります。
発話をすると録音を開始して発話し終えると録音を終了します。
録音を終了した後、その音声をパペロが再生します。


中央ボタン押下

録音待機状態

人「今日はいい天気だ」

発話区間を検出して録音開始終了

パペロ「今日はいい天気だ」

 

● PaPeRo i でPythonを使えるようにする | PaPeRo i [非公式] Developer Forumを参考にパペロにPython 3.4をインストール

● Juliusで独自辞書を使った音声認識を行う | PaPeRo i [非公式] Developer Forumを参考にJuliusをPaPeRo i にインストール(adintoolしか使用しません)

● 実機に配置して[python3 voiceRec.py -wssvr ws://192.168.5.1:8088/papero]で実行してみよう。


voiceRec.py

  1. import logging
  2. logger = logging.getLogger(__name__)
  3. logging.basicConfig(level=logging.DEBUG)
  4. import sys
  5. import pypapero
  6. import subprocess
  7. import time
  8. import os
  9. class Papero(pypapero.Papero):
  10.     def __init__(self, simulator_id, robot_name, arg_ws_server_addr):
  11.         self.end = False
  12.         self.julius_path = "/Extension/local/julius/bin/adintool"
  13.         return super().__init__(simulator_id, robot_name, arg_ws_server_addr)
  14. def send_event_message(msg): #パペロのメッセージを処理
  15.     if msg[0]["Name"] == "detectButton" and msg[0]["Status"] == "C": #中央ボタンで録音実行
  16.         papero.send_turn_led_on("ear", ["W3W3", "10"])
  17.         time.sleep(0.5)
  18.         big_voice_byte = subprocess.check_output([papero.julius_path, "-in", "mic", "-out", "stdout", "-oneshot", "-tailmargin", "500"]) #juliusを実行して音声取得
  19.         voice_bytes = bytearray(big_voice_byte)
  20.         for i in range(len(voice_bytes)): #リトルエンディアンへ変換
  21.             if i % 2 != 0:
  22.                 voice_bytes[i - 1], voice_bytes[i] = voice_bytes[i], voice_bytes[i - 1]
  23.         cmd = subprocess.Popen("aplay -r 16000 -t raw -f S16".split(), stdin=subprocess.PIPE) #録音した音声を発話
  24.         cmd.stdin.write(voice_bytes)
  25.         cmd.stdin.close()
  26.         cmd.wait()
  27.     elif msg[0]["Name"] == "detectButton" and msg[0]["Status"] == "R":
  28.         pass
  29.     elif msg[0]["Name"] == "detectButton" and msg[0]["Status"] == "L":
  30.         pass
  31. if __name__ == "__main__":
  32.     simulator_id, robot_name, ws_server_addr = pypapero.get_params_from_commandline(sys.argv)
  33.     while True:
  34.         papero = Papero(simulator_id, robot_name, ws_server_addr)
  35.         if papero.errOccurred == 0:
  36.             break
  37.         time.sleep(10)
  38.     papero.send_start_speech("起動が完了しました")
  39.     
  40.     while not papero.end:
  41.         msg = papero.papero_robot_message_recv(None)
  42.         send_event_message(msg)
  43.     
  44.     papero.papero_cleanup()


0

最新開発ブログ一覧  (一覧で確認
2020年8月19日 14:08
開発ブログ
第30回 パペロで赤外線アレイセンサを動かしてみよう!【中編:顔の表面温度を測ってみよう】
by 管理者
2020年7月22日 16:07
開発ブログ
第29回 パペロで赤外線アレイセンサを動かしてみよう!【前編:簡易サーモグラフィを作ろう】
by 管理者
2019年11月20日 17:11
開発ブログ
第28回 パペロでJulius4.5を実行してみた
by 管理者
2019年11月13日 09:11
開発ブログ
第27回 JuliusをPaPeRoi向けにクロスコンパイルしてみた
by 管理者
2019年9月19日 17:09
開発ブログ
第26回Linaro Toolchainでクロスコンパイルしてみた
by 管理者

コメントは受け付けていません。