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

#関連記事
[raspberryPiとjulus（音声認識）を使用する。①マイク編](https://qiita.com/chiapis2/items/347a9b422706c2d8ebe2)
[raspberryPiでjulius（音声認識）を使用する。②インストール編](https://qiita.com/chiapis2/items/7ec1b0b21ee4fef4e8f0)
[raspberryPiとJulius(音声認識)を使用する。③辞書作成編](https://qiita.com/chiapis2/items/f0bd2ccb0f04d18d8a98)
[raspberryPiとJulius（音声認識）を使用する。④Lチカ編](https://qiita.com/chiapis2/items/a2ed64414c9e49b6cb42)
[raspberryPiとJulius（音声認識）を使用する。⑤i2cキャラクタディスプレイ編](https://qiita.com/chiapis2/items/8e02bb591fb7a02274aa)

#使用するもの
raspberryPi 3B+
USBマイク
LED
抵抗220Ω
ジャンパワイヤ（オス‐メス）2本
<h1>モジュールモードでJuliusを動かしてみる</h1>

保存したい場所のディレクトリに移動して、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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504329/5d8e0f00-69f2-2afb-40f5-26dd501e6102.png)
モジュールモードでJuliusが待機しているのでこのままにして、もう一つターミナルを立ち上げる。

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504329/4f5f1718-7e0c-88ed-3559-9fe161e7d484.png)

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

<h1>18ピンに刺したLEDを光らせる</h1>
###ラズパイのピン配置（画像はググって分かりやすいものを拝借）
![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キャラクタディスプレイ編](https://qiita.com/chiapis2/items/8e02bb591fb7a02274aa)

<h2>参考</h2>
[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)