開発ブログ

第19回 パペロでJuliusを利用した録音再生をパワーアップしてみた

投稿日時:2019年6月21日 18:06

こんにちは。ピャペロンです!
今回は第17回 パペロでJuliusを使って録音再生してみた
・パペロで音声を認識している間、耳を光らせる
・雑音で音声認識が終了しないのを防ぐため、ボタン押下で音声認識を終了させる
・雑音を認識させないためマイクの感度を変更できるようにする
3つの機能を追加しました。

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

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


 

● 第17回 パペロでJuliusを使って録音再生してみた
を参考にパペロをセットアップしてください。

● 中央ボタンで音声認識、右ボタンでマイク感度アップ、左ボタンでマイク感度ダウン、音声認識中に中央ボタンを押すと音声認識を終了させます。基本動作は第17回 パペロでJuliusを使って録音再生してみたと同じです。


speech_recog

  1. #!/Extension/pkgroot/usr/bin/python3
  2. import logging
  3. import sys
  4. import os
  5. import io
  6. import subprocess
  7. import time
  8. import signal
  9. import threading
  10. import base64
  11. import requests
  12. import pypapero
  13. #logger = logging.getLogger(__name__)
  14. logging.basicConfig(filename="/var/log/translate.log", level=logging.DEBUG)
  15. #logger.addHandler(logging.FileHandler("/var/log/translate.log"))
  16. #logger.addHandler(logging.StreamHandler())
  17. class SpeechRecogPapero(pypapero.Papero):
  18.     def __init__(self, simulator_id, robot_name, arg_ws_server_addr):
  19.         self.end = False
  20.         self.mic_vol = 6000
  21.         self.julius_path = "/Extension/local/julius/bin/adintool"
  22.         self.julius_path_list = [self.julius_path, "-in", "mic", "-out", "stdout", "-oneshot", "-tailmargin", "500", "-lv", str(self.mic_vol)]
  23.         return super().__init__(simulator_id, robot_name, arg_ws_server_addr)
  24. def send_event_message(msg): # イベントメッセージを処理
  25.     if msg[0]["Name"] == "detectButton" and msg[0]["Status"] == "C": # 中央ボタンで音声認識実行
  26.         papero.send_turn_led_on("ear", ["W3W3", "10"])
  27.         time.sleep(0.5)
  28.         print(papero.julius_path_list)
  29.         julius_proc = subprocess.Popen(papero.julius_path_list,
  30.                                         stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
  31.         stop_event = threading.Event()
  32.         stop_thread = threading.Thread(target=julius_stop, args=(julius_proc, stop_event)) # 音声認識監視スレッド
  33.         stop_thread.start()
  34.         out, err = julius_proc.communicate()
  35.         stop_event.set()
  36.         stop_thread.join()
  37.         voice_bytes = bytearray(out)
  38.         for i in range(len(voice_bytes)): # リトルエンディアンへ変換
  39.             if i % 2 != 0:
  40.                 voice_bytes[i - 1], voice_bytes[i] = voice_bytes[i], voice_bytes[i - 1]
  41.         speak_proc = subprocess.Popen("aplay -r 16000 -t raw -f S16".split(), stdin=subprocess.PIPE) # 翻訳した音声を発話
  42.         speak_proc.communicate(voice_bytes)
  43.     elif msg[0]["Name"] == "detectButton" and msg[0]["Status"] == "R": # 右ボタンでマイク感度を小さくする
  44.         if papero.mic_vol <= 15000:
  45.             papero.mic_vol += 3000
  46.             papero.julius_path_list = [papero.julius_path, "-in", "mic", "-out", "stdout", "-oneshot", "-tailmargin", "500", "-lv", str(papero.mic_vol)]
  47.         papero.send_start_speech("マイクの感度を小さくしました")
  48.     elif msg[0]["Name"] == "detectButton" and msg[0]["Status"] == "L": # 左ボタンでマイク感度を大きくする
  49.         if papero.mic_vol > 3000:
  50.             papero.mic_vol -= 3000
  51.             papero.julius_path_list = [papero.julius_path, "-in", "mic", "-out", "stdout", "-oneshot", "-tailmargin", "500", "-lv", str(papero.mic_vol)]
  52.         papero.send_start_speech("マイクの感度を大きくしました")
  53.     print("mic_volume:", papero.mic_vol)
  54. def julius_stop(proc, event): # 音声認識中の耳の光と音声認識の停止
  55.     papero.send_turn_led_on("ear", ["W3W3", "10"], True)
  56.     event.clear()
  57.     while True:
  58.         msg = papero.papero_robot_message_recv(0.5)
  59.         if msg is not None:
  60.             if msg[0]["Name"] == "detectButton" and msg[0]["Status"] == "C": # 中央ボタン
  61.                 proc.send_signal(signal.SIGINT) # 停止シグナル送信
  62.                 break
  63.         elif event.is_set():
  64.             break
  65.     papero.send_turn_led_off("ear")
  66. if __name__ == "__main__":
  67.     simulator_id, robot_name, ws_server_addr = None, None, "ws://127.0.0.1:8088/papero"
  68.     while True:
  69.         papero = SpeechRecogPapero(simulator_id, robot_name, ws_server_addr)
  70.         if papero.errOccurred == 0:
  71.             break
  72.         time.sleep(10)
  73.     papero.send_start_speech("起動が完了しました")
  74.     
  75.     while not papero.end:
  76.         msg = papero.papero_robot_message_recv(None)
  77.         send_event_message(msg)
  78.     
  79.     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 管理者

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