1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

raspberryPiとJulius(音声認識)を使用する。④Lチカ編

Last updated at Posted at 2020-10-06

#関連記事
raspberryPiとjulus(音声認識)を使用する。①マイク編
raspberryPiでjulius(音声認識)を使用する。②インストール編
raspberryPiとJulius(音声認識)を使用する。③辞書作成編
raspberryPiとJulius(音声認識)を使用する。④Lチカ編
raspberryPiとJulius(音声認識)を使用する。⑤i2cキャラクタディスプレイ編

#使用するもの
raspberryPi 3B+
USBマイク
LED
抵抗220Ω
ジャンパワイヤ(オス‐メス)2本

モジュールモードでJuliusを動かしてみる

保存したい場所のディレクトリに移動して、pythonでソケット通信をするためのコードを準備する。

$ sudo vim testnet001.py
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

image.png
モジュールモードでJuliusが待機しているのでこのままにして、もう一つターミナルを立ち上げる。

$ cd Pythonコード保存先のディレクトリ
$ sudo python3 testnet001.py

image.png

話しかけて反応があれば、ソケット通信はできている。

18ピンに刺したLEDを光らせる

###ラズパイのピン配置(画像はググって分かりやすいものを拝借) ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504329/ad493a34-ceea-203e-0565-72bcf136d1a4.png)

LED配線は調べたら誰かの記事が出てくるので省略。ピンはGPIO18を使用。

testnet002.py
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キャラクタディスプレイ編

参考

[juliusをmoduleモードで起動して、pythonで話した言葉を取得する](https://www.raspberrypirulo.net/entry/julius-python) [Raspberry Pi×JuliusとPythonでスマートスピーカー風にカメラを操作](https://www.pc-koubou.jp/magazine/20637) [How to resolve that error“:TypeError: can only concatenate str (not ”bytes“) to str”](https://stackoverflow.com/questions/61962436/how-to-resolve-that-errortypeerror-can-only-concatenate-str-not-bytes-to) [ラズパイで音声認識つかってLチカしてみる](https://ueqareer.net/2463)
1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?