ラズパイと音声認識でLチカ


https://ueqareer.net/2463
から

#ラズパイでLチカ

今回用意したもの
![](https://ueqareer.net/wp-content/uploads/2017/12/IMG_0164-300x239.jpg)

* OS(Raspbian)が入ったRaspberrypi3
* 抵抗330Ω 1本
* ジャンパーワイヤー（オス，メス）2本
* 青色LED
* ブレッドボード
* USBマイク（今回はBUFFALOのBSWHD06MBKを使用）
BUFFALOのBSWHD06MBKはマイク内蔵webカメラで1000円ほどなのでオススメ

2000円しないくらいで全て用意できました〜（もちろんラズパイ以外）

&nbsp;

LEDを点灯させる
---------
それでは早速、簡単に組み立ててLEDを点灯させてみましょう。

### 点灯の確認
LEDが正しく光るか確認します。
ピン番号は以下の画像を参考に組み立てます。
ピン番号
![](https://ueqareer.net/wp-content/uploads/2017/12/kokoraspi-300x86.png)
GPIO番号
![](https://ueqareer.net/wp-content/uploads/2017/12/05bf95f92d994b62ba76c436dec5ad56-300x89.png)

1.  ジャンパーワイヤーを[a5-ピン番号6]につなぐ
2.  もう一本を[a1-ピン番号1]につなぐ
3.  抵抗を[b1-b4]につなぐ
4.  LEDを[c4-c5]につなぐ（長い方がc4)
正しく接続すればこのようにLEDがつきました・・・！
確認ができたら先ほどピン番号１番につけたジャンパーワイヤーをピン番号3番（GPIO：２）に接続しなおします。
接続しなおしてもLEDはついたままのはずです。
![](https://ueqareer.net/wp-content/uploads/2017/12/IMG_0162-e1512992139373-300x225.jpg)

&nbsp;

### pythonで制御してみる
今度はpythonのライブラリを使って指定したGPIO番号に接続されたLEDを制御してみましょう。

#### ライブラリのインストール
ターミナルで以下のコマンドを打ちます。

```
$ sudo apt-get install python-rpi.gpio
```
インストールが終われば、pythonファイルを作成して以下のようなプログラムを書きます。

```python:led_l.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM) # GPIO番号で指定
GPIO.setup(2, GPIO.OUT) 
GPIO.output(2, GPIO.LOW)
```

実行します。

```
$ python led_off.py
```
消えました。

点灯も同じようにプログラムを書いて実行すればできます。

```python:led_h.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM) # GPIO番号で指定
GPIO.setup(2, GPIO.OUT) 
GPIO.output(2, GPIO.HIGH)
```

Juliusのインストール
-------------
続いて、音声認識ソフトウェアJuliusをインストールします。
この手順は参考記事に従ってすすめてください。
[Juliusの使い方（version 4.4.2 対応版）～ ラズベリーパイ研究室](http://www.feijoa.jp/laboratory/raspberrypi/julius442/)
[ラズパイに、人の声を理解させる。](http://www.asahi-net.or.jp/~cb9i-kn/geek/20170513totext.html)

USBマイクの認識設定
-----------
juliusのインストールが終わったらusbマイクをラズパイに接続します。
以下を参考にusbの優先順位をあげて再起動します。
[Raspberry PiでJuliusを使った音声認識(1)](http://hyottokoaloha.hatenablog.com/entry/2015/06/30/105906)

音声認識の確認
-------
ではでは、実行して見ましょう！

```
$ sudo modprobe snd-pcm-oss  //これがないとうまく動作しない
$ cd ~/julius/julius-kits/dictation-kit-v4.4/　　//main.jconfがあるディレクトリに移動
$ julius -C main.jconf -C am-gmm.jconf -demo  //実行
```
以下のように表示されれば成功です。
![](https://ueqareer.net/wp-content/uploads/2017/12/347e67ff82ca336063a51de183d6e159-300x211.png)

自作辞書の作成
-------
この状態では、全ての言葉を認識してくれますが遅いです。
そのため辞書を作って速度をあげましょう。
（「こんにちは」の１単語だけの辞書を作れば、何をいっても「こんにちは」と認識されるようになる。）

今回は「つけて」と「けして」と「てんめつ」の3単語を覚えさせます。

```denki.yomi
つけて　つけて
けして けして 
てんめつ てんめつ
```
以下のコマンドでコンパイルします。

```
$ iconv -f utf8 -t eucjp denki.yomi | yomi2voca.pl | iconv -f eucjp -t utf8 > denki.phone
```
次のようなファイルができました。

```denki.phone
つけて	ts u k e t e
けして	k e sh i t e
てんめつ    t e N m e ts u
```
次に以下のような２つのファイルを作成します。

```denki.grammar
S : NS_B DENKI NS_E
DENKI : TSUKETE
DENKI : KESHITE
DENKI : TENMETSU
```

```denki.voca
% TSUKETE
つけて ts u k e t e
% KESHITE
けして k e sh i t e
% TENMETSU
てんめつ t e N m e ts u
% NS_B
[s]             silB
% NS_E
[s]            silE
```
これらを以下のコマンドでコンパイルします。

```
$ mkdfa.pl denki
```

つかれましたね。

声でLED操作
-------
つづいてpythonプログラムを書いて認識したによりLEDの制御を行います。
以下のファイルを追加してください。

```python:flash.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO //LED点滅のプログラム
import time

def main():
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(2, GPIO.OUT)
    for i in range(10):
        GPIO.output(2, True)
        time.sleep(0.1)
        GPIO.output(2, False)
        time.sleep(0.1)
    GPIO.output(2, GPIO.LOW)
```

```python:juliustest.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import socket
import string
import led_h as on
import led_l as off
import flash


host = 'localhost'   # Raspberry PiのIPアドレス
port = 10500         # juliusの待ち受けポート

# パソコンからTCP/IPで、自分PCのjuliusサーバに接続
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((host, port))

data = ""
while True:

    # "/RECOGOUT"を受信するまで、一回分の音声データを全部読み込む。
    while (string.find(data, "\n.") == -1):
        data = data + sock.recv(1024)

    # 音声XMLデータから、<WORD>を抽出して音声テキスト文に連結する。
    strTemp = ""
    for line in data.split('\n'):
        index = line.find('WORD="')

        if index != -1:
            line = line[index + 6:line.find('"', index + 6)]
            if line != "[s]":
                strTemp = strTemp + line

    if strTemp != "":
        print("結果:" + strTemp)
    if strTemp == "つけて":
        on.main()
    if strTemp == "けして":
        off.main()
    if strTemp == "てんめつ":
        flash.main()

    data = ""
```
認識するか試してみましょう。
新規タブを開いて

```
$ sudo modprobe snd-pcm-oss  //ねんのため
$ julius -C ~/julius/julius-kits/grammar-kit-v4.1/hmm_mono.jconf -nostrip -input mic -gram ~/辞書があるディレクトリ/denki -module &
$ python juliustest.py
```
![](https://ueqareer.net/wp-content/uploads/2017/12/a788c49d140c4619cbe4034126f4c504-1.png)

うまくいきました・・・
LEDもうまく動作しています。
つかれすぎてめんつゆに見えますね。




参考記事
----

* [Juliusの使い方（version 4.4.2 対応版）～ ラズベリーパイ研究室](http://www.feijoa.jp/laboratory/raspberrypi/julius442/)
* [ラズパイに、人の声を理解させる。](http://www.asahi-net.or.jp/~cb9i-kn/geek/20170513totext.html)
* [Raspberry PiでJuliusを使った音声認識(1)](http://hyottokoaloha.hatenablog.com/entry/2015/06/30/105906)
* [Julius 独自辞書作成方法](https://qiita.com/satosystems/items/4d379e57d2370177ead1)