こんにちは。ピャペロンです!
今回は第17回 パペロでJuliusを使って録音再生してみたに
・パペロで音声を認識している間、耳を光らせる
・雑音で音声認識が終了しないのを防ぐため、ボタン押下で音声認識を終了させる
・雑音を認識させないためマイクの感度を変更できるようにする
3つの機能を追加しました。
使用するハード
・PaPeRo i実機
使用するソフト
・Windows 10
・テキストエディタ(Visual Studio Code)
・Python 3.4(PaPeRo i)
・WinSCP
・Tera Term
● 第17回 パペロでJuliusを使って録音再生してみた
を参考にパペロをセットアップしてください。
● 中央ボタンで音声認識、右ボタンでマイク感度アップ、左ボタンでマイク感度ダウン、音声認識中に中央ボタンを押すと音声認識を終了させます。基本動作は第17回 パペロでJuliusを使って録音再生してみたと同じです。
speech_recog
- #!/Extension/pkgroot/usr/bin/python3
- import logging
- import sys
- import os
- import io
- import subprocess
- import time
- import signal
- import threading
- import base64
- import requests
- import pypapero
- #logger = logging.getLogger(__name__)
- logging.basicConfig(filename="/var/log/translate.log", level=logging.DEBUG)
- #logger.addHandler(logging.FileHandler("/var/log/translate.log"))
- #logger.addHandler(logging.StreamHandler())
- class SpeechRecogPapero(pypapero.Papero):
- def __init__(self, simulator_id, robot_name, arg_ws_server_addr):
- self.end = False
- self.mic_vol = 6000
- self.julius_path = "/Extension/local/julius/bin/adintool"
- self.julius_path_list = [self.julius_path, "-in", "mic", "-out", "stdout", "-oneshot", "-tailmargin", "500", "-lv", str(self.mic_vol)]
- return super().__init__(simulator_id, robot_name, arg_ws_server_addr)
- def send_event_message(msg): # イベントメッセージを処理
- if msg[0]["Name"] == "detectButton" and msg[0]["Status"] == "C": # 中央ボタンで音声認識実行
- papero.send_turn_led_on("ear", ["W3W3", "10"])
- time.sleep(0.5)
- print(papero.julius_path_list)
- julius_proc = subprocess.Popen(papero.julius_path_list,
- stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
- stop_event = threading.Event()
- stop_thread = threading.Thread(target=julius_stop, args=(julius_proc, stop_event)) # 音声認識監視スレッド
- stop_thread.start()
- out, err = julius_proc.communicate()
- stop_event.set()
- stop_thread.join()
- voice_bytes = bytearray(out)
- for i in range(len(voice_bytes)): # リトルエンディアンへ変換
- if i % 2 != 0:
- voice_bytes[i - 1], voice_bytes[i] = voice_bytes[i], voice_bytes[i - 1]
- speak_proc = subprocess.Popen("aplay -r 16000 -t raw -f S16".split(), stdin=subprocess.PIPE) # 翻訳した音声を発話
- speak_proc.communicate(voice_bytes)
- elif msg[0]["Name"] == "detectButton" and msg[0]["Status"] == "R": # 右ボタンでマイク感度を小さくする
- if papero.mic_vol <= 15000:
- papero.mic_vol += 3000
- papero.julius_path_list = [papero.julius_path, "-in", "mic", "-out", "stdout", "-oneshot", "-tailmargin", "500", "-lv", str(papero.mic_vol)]
- papero.send_start_speech("マイクの感度を小さくしました")
- elif msg[0]["Name"] == "detectButton" and msg[0]["Status"] == "L": # 左ボタンでマイク感度を大きくする
- if papero.mic_vol > 3000:
- papero.mic_vol -= 3000
- papero.julius_path_list = [papero.julius_path, "-in", "mic", "-out", "stdout", "-oneshot", "-tailmargin", "500", "-lv", str(papero.mic_vol)]
- papero.send_start_speech("マイクの感度を大きくしました")
- print("mic_volume:", papero.mic_vol)
- def julius_stop(proc, event): # 音声認識中の耳の光と音声認識の停止
- papero.send_turn_led_on("ear", ["W3W3", "10"], True)
- event.clear()
- while True:
- msg = papero.papero_robot_message_recv(0.5)
- if msg is not None:
- if msg[0]["Name"] == "detectButton" and msg[0]["Status"] == "C": # 中央ボタン
- proc.send_signal(signal.SIGINT) # 停止シグナル送信
- break
- elif event.is_set():
- break
- papero.send_turn_led_off("ear")
- if __name__ == "__main__":
- simulator_id, robot_name, ws_server_addr = None, None, "ws://127.0.0.1:8088/papero"
- while True:
- papero = SpeechRecogPapero(simulator_id, robot_name, ws_server_addr)
- if papero.errOccurred == 0:
- break
- time.sleep(10)
- papero.send_start_speech("起動が完了しました")
- while not papero.end:
- msg = papero.papero_robot_message_recv(None)
- send_event_message(msg)
- papero.papero_cleanup()
0