Edited at

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

https://ueqareer.net/2463

から


ラズパイでLチカ

今回用意したもの


  • OS(Raspbian)が入ったRaspberrypi3

  • 抵抗330Ω 1本

  • ジャンパーワイヤー(オス,メス)2本

  • 青色LED

  • ブレッドボード

  • USBマイク(今回はBUFFALOのBSWHD06MBKを使用)
    BUFFALOのBSWHD06MBKはマイク内蔵webカメラで1000円ほどなのでオススメ

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

 


LEDを点灯させる

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


点灯の確認

LEDが正しく光るか確認します。

ピン番号は以下の画像を参考に組み立てます。

ピン番号



GPIO番号


  1. ジャンパーワイヤーを[a5-ピン番号6]につなぐ

  2. もう一本を[a1-ピン番号1]につなぐ

  3. 抵抗を[b1-b4]につなぐ

  4. LEDを[c4-c5]につなぐ(長い方がc4)
    正しく接続すればこのようにLEDがつきました・・・!
    確認ができたら先ほどピン番号1番につけたジャンパーワイヤーをピン番号3番(GPIO:2)に接続しなおします。
    接続しなおしてもLEDはついたままのはずです。


 


pythonで制御してみる

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


ライブラリのインストール

ターミナルで以下のコマンドを打ちます。

$ sudo apt-get install python-rpi.gpio

インストールが終われば、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

消えました。

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


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 対応版)~ ラズベリーパイ研究室

ラズパイに、人の声を理解させる。


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単語を覚えさせます。


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

次に以下のような2つのファイルを作成します。


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の制御を行います。

以下のファイルを追加してください。


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)



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

うまくいきました・・・

LEDもうまく動作しています。

つかれすぎてめんつゆに見えますね。


参考記事