#関連記事
raspberryPiとjulus(音声認識)を使用する。①マイク編
raspberryPiでjulius(音声認識)を使用する。②インストール編
raspberryPiとJulius(音声認識)を使用する。③辞書作成編
raspberryPiとJulius(音声認識)を使用する。④Lチカ編
raspberryPiとJulius(音声認識)を使用する。⑤i2cキャラクタディスプレイ編
#使用するもの
raspberryPi 3B+
USBマイク
LED
抵抗220Ω
ジャンパワイヤ(オス‐メス)2本
モジュールモードでJuliusを動かしてみる
保存したい場所のディレクトリに移動して、pythonでソケット通信をするためのコードを準備する。
$ sudo vim testnet001.py
import socket
import time
HOST = '127.0.0.1' # juliusサーバーのIPアドレス
PORT = 10500 # juliusサーバーの待ち受けポート
DATESIZE = 1024 # 受信データバイト数
class Julius:
def __init__(self):
self.sock = None
def run(self):
# socket通信でjuliusサーバーに接続
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as self.sock:
self.sock.connect((HOST, PORT))
strTemp = "" # 話した言葉を格納する変数
fin_flag = False # 話終わりフラグ
while True:
# juliusサーバからデータ受信
data = self.sock.recv(DATESIZE).decode('utf-8')
for line in data.split('\n'):
# 受信データから、<WORD>の後に書かれている言葉を抽出して変数に格納する。
# <WORD>の後に、話した言葉が記載されている。
index = line.find('WORD="')
if index != -1:
# strTempに話した言葉を格納
strTemp = strTemp + line[index+6:line.find('"',index+6)]
# 受信データに</RECOGOUT>'があれば、話終わり ⇒ フラグをTrue
if '</RECOGOUT>' in line:
fin_flag = True
# 話した言葉毎に、print文を実行
if fin_flag == True:
if 'ありがとう' in strTemp:
print("どういたしまして")
elif 'こんにちは' in strTemp:
print("こんばんは")
else:
print("話した言葉:" + strTemp)
fin_flag = False
strTemp = ""
if __name__ == "__main__":
julius = Julius()
julius.run()
作成したらエディタを終了する。
独自辞書をモジュールモードで呼び出す。
$ cd
$ julius -C ~/julius/julius-4.6/julius-kit/dictation-kit-4.5/am-gmm.jconf -nostrip -gram ~/julius/dict/test -input mic -module
モジュールモードでJuliusが待機しているのでこのままにして、もう一つターミナルを立ち上げる。
$ cd Pythonコード保存先のディレクトリ
$ sudo python3 testnet001.py
話しかけて反応があれば、ソケット通信はできている。
18ピンに刺したLEDを光らせる
###ラズパイのピン配置(画像はググって分かりやすいものを拝借) ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504329/ad493a34-ceea-203e-0565-72bcf136d1a4.png)LED配線は調べたら誰かの記事が出てくるので省略。ピンはGPIO18を使用。
import RPi.GPIO as GPIO
import time
import socket
import string
def main():
GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.OUT)
for i in range(5):
GPIO.output(18, True)
time.sleep(0.1)
GPIO.output(18, False)
time.sleep(0.1)
GPIO.output(18, GPIO.LOW)
HOST = '127.0.0.1' # juliusサーバーのIPアドレス
PORT = 10500 # juliusサーバーの待ち受けポート
DATESIZE = 1024 # 受信データバイト数
class Julius:
def __init__(self):
self.sock = None
def run(self):
# socket通信でjuliusサーバーに接続
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as self.sock:
self.sock.connect((HOST, PORT))
strTemp = "" # 話した言葉を格納する変数
fin_flag = False # 話終わりフラグ
while True:
# juliusサーバからデータ受信
data = self.sock.recv(DATESIZE).decode('utf-8')
for line in data.split('\n'):
# 受信データから、<WORD>の後に書かれている言葉を抽出して変数に格納する。
# <WORD>の後に、話した言葉が記載されている。
index = line.find('WORD="')
if index != -1:
# strTempに話した言葉を格納
strTemp = strTemp + line[index+6:line.find('"',index+6)]
# 受信データに</RECOGOUT>'があれば、話終わり ⇒ フラグをTrue
if '</RECOGOUT>' in line:
fin_flag = True
# 話した言葉毎に、print文を実行
if fin_flag == True:
if 'ありがとう' in strTemp:
print("どういたしまして")
main()
elif 'こんにちは' in strTemp:
print("こんばんは")
else:
print("話した言葉:" + strTemp)
fin_flag = False
strTemp = ""
if __name__ == "__main__":
julius = Julius()
julius.run()
モジュールモードで呼び出して、別ターミナルで上記コードを実行すると光る。
##音声認識でLチカ完了
Juliusをモジュールモード動作させることができた。
次は言葉を認識してi2cディスプレイ表示編へ。
raspberryPiとJulius(音声認識)を使用する。⑤i2cキャラクタディスプレイ編