UEQareer Advent Calendar 2017の12日目のエントリーです。
はじめまして! レッドインパルスのインターン生、もーりーです。
インターンではサーバーサイドを担当させてもらっているのですが、
今回はRaspberrypi3と音声認識のソフトウェアJuliusを使ってLチカしてみたので紹介します。
Contents
今回用意したもの

- OS(Raspbian)が入ったRaspberrypi3
- 抵抗330Ω 1本
- ジャンパーワイヤー(オス,メス)2本
- 青色LED
- ブレッドボード
- USBマイク(今回はBUFFALOのBSWHD06MBKを使用)
BUFFALOのBSWHD06MBKはマイク内蔵webカメラで1000円ほどなのでオススメ
LEDを点灯させる
それでは早速、簡単に組み立ててLEDを点灯させてみましょう。
点灯の確認
LEDが正しく光るか確認します。
ピン番号は以下の画像を参考に組み立てます。
ピン番号
GPIO番号
- ジャンパーワイヤーを[a5-ピン番号6]につなぐ
- もう一本を[a1-ピン番号1]につなぐ
- 抵抗を[b1-b4]につなぐ
- LEDを[c4-c5]につなぐ(長い方がc4)
正しく接続すればこのようにLEDがつきました・・・!
確認ができたら先ほどピン番号1番につけたジャンパーワイヤーをピン番号3番(GPIO:2)に接続しなおします。
接続しなおしてもLEDはついたままのはずです。
pythonで制御してみる
今度はpythonのライブラリを使って指定したGPIO番号に接続されたLEDを制御してみましょう。
ライブラリのインストール
ターミナルで以下のコマンドを打ちます。
sudo apt-get install python-rpi.gpio
インストールが終われば、pythonファイルを作成して以下のようなプログラムを書きます。
import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) # GPIO番号で指定 GPIO.setup(2, GPIO.OUT) GPIO.output(2, GPIO.LOW)
実行します。
python led_off.py
消えました。
点灯も同じようにプログラムを書いて実行すればできます。
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 対応版)~ ラズベリーパイ研究室
ラズパイに、人の声を理解させる。
USBマイクの認識設定
juliusのインストールが終わったらusbマイクをラズパイに接続します。
以下を参考にusbの優先順位をあげて再起動します。
Raspberry PiでJuliusを使った音声認識(1)
音声認識の確認
ではでは、実行して見ましょう!
$ sudo modprobe snd-pcm-oss //これがないとうまく動作しない $ cd ~/julius/julius-kits/dictation-kit-v4.4/ //main.jconfがあるディレクトリに移動 $ julius -C main.jconf -C am-gmm.jconf -demo //実行
以下のように表示されれば成功です。
自作辞書の作成
この状態では、全ての言葉を認識してくれますが遅いです。
そのため辞書を作って速度をあげましょう。
(「こんにちは」の1単語だけの辞書を作れば、何をいっても「こんにちは」と認識されるようになる。)
今回は「つけて」と「けして」と「てんめつ」の3単語を覚えさせます。
つけて つけて けして けして てんめつ てんめつ
以下のコマンドでコンパイルします。
$ iconv -f utf8 -t eucjp denki.yomi | yomi2voca.pl | iconv -f eucjp -t utf8 > denki.phone
次のようなファイルができました。
つけて ts u k e t e けして k e sh i t e てんめつ t e N m e ts u
次に以下のような2つのファイルを作成します。
S : NS_B DENKI NS_E DENKI : TSUKETE DENKI : KESHITE DENKI : TENMETSU
% 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の制御を行います。
以下のファイルを追加してください。
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)
// import socket import string import led_h as on import led_l as off import flash import tv_off import ty_on 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

うまくいきました・・・
LEDもうまく動作しています。
つかれすぎてめんつゆに見えますね。
今後
今後はラズパイをirMagicainっていう赤外学習リモコンを使ってG●●gle H●meより優秀な家電操作デバイスにしていきたいと思います笑
(部屋の電気とエアコンとテレビは音声で制御できました!)
次回はテレビの電源制御を書こうかな。