WEB制作

GoPiGo2 音声で動かしてみる

Julius による音声認識で GoPiGo を動かしてみる。
 

1. Julius のキット2つを julius フォルダにまとめる

pi@dex:~ $ mkdir julius
pi@dex:~ $ mv ~/dictation-kit-v4.3.1-linux ~/julius
pi@dex:~ $ mv ~/grammar-kit-v4.1 ~/julius
 

2.辞書を作成

辞書の作成は、単語帳を作り、それを変換することで作成する。
単語帳(word.yomiとした)を、juliusフォルダ下に作成。
単語帳ファイルには"認識させたい単語"+"Tab"+"単語の読み" を記述する。
■単語帳を作成
pi@dex:~/julius $ sudo nano ~/word.yomi

進め すすめ
前進 ぜんしん
下がれ さがれ
後退 こうたい
右へ みぎへ
右 みぎ
左へ ひだりへ
左 ひだり
止まれ とまれ
ストップ すとっぷ
終わり  おわり

■作成した単語帳(word.yomi)を、julius が認識可能な単語辞書ファイル(word.dic)に変換
pi@dex:~/julius $ cd /home/pi/julius-4.3.1/gramtools/yomi2voca 
pi@dex:~/julius-4.3.1/gramtools/yomi2voca $ iconv -f utf8 -t eucjp ~/word.yomi | ./yomi2voca.pl > ~/julius/dictation-kit-v4.3.1-linux/word.dic

3. Julius を実行して確認

Julius のオプションをまとめた設定ファイル(word.jconfとした)を作成する。これにより、Julius 実行時の引数を省略することができる。
pi@dex:~/julius-4.3.1/gramtools/yomi2voca $ cd ~
pi@dex:~ $ sudo nano ~/julius/dictation-kit-v4.3.1-linux/word.jconf

-w word.dic #単語辞書ファイル
-v model/lang_m/bccwj.60k.htkdic #N-gram、または文法用の単語辞書ファイルを指定$
-h model/phone_m/jnas-tri-3k16-gid.binhmm #使用するHMM定義ファイル
-hlist model/phone_m/logicalTri #HMMlistファイルを指定する
-n 5 #n個の文仮説数が見つかるまで検索を行う
-output 1 #見つかったN-best候補のうち、結果として出力する個数
-input mic #マイク使用
-input oss #オープンサウンドシステム使用
-rejectshort 600 #検出された入力が閾値以下なら棄却
-charconv euc-jp utf8 #入出力エンコード指定(内部euc-jp, 出力utf-8)
-lv 1000 #入力の振幅レベルの閾値(0~32767)

■複数コンソール画面のため tmux をインストールして起動
pi@dex:~ $ sudo apt-get install tmux
pi@dex:~ $ tmux

■ Jukius を実行
pi@dex:~ $ julius -C ~/julius/dictation-kit-v4.3.1-linux/word.jconf

■確認
Notice for feature extraction (01),
*************************************************************
* Cepstral mean normalization for real-time decoding: *
* NOTICE: The first input may not be recognized, since *
* no initial mean is available on startup. *
*************************************************************
------
### read waveform input
Stat: adin_oss: device name = /dev/dsp (application default)
Stat: adin_oss: sampling rate = 16000Hz
Stat: adin_oss: going to set latency to 50 msec
Stat: adin_oss: audio I/O Latency = 32 msec (fragment size = 512 samples)
STAT: AD-in thread created
pass1_best: 進め
pass1_best_wordseq: 進め
pass1_best_phonemeseq: silB s u s u m e silE
pass1_best_score: -3890.191895
sentence1: 進め
wseq1: 進め
phseq1: silB s u s u m e silE
cmscore1: 0.499
score1: -3890.191895

4. Julius をモジュールモードで実行

Julius 起動時のオプションに -module を付けるとモジュールモードでの起動になって、クライアントからの TCP/IP 接続待ち状態になる。
その状態でクライアントからの接続を受けると音声認識可能な状態になって、クライアントに認識結果を XML で送信する。
■スクリプト作成
pi@dex:~ $ nano start_julius.sh

julius -C ~/julius/dictation-kit-v4.3.1-linux/word.jconf -module 

■実行
pi@dex:~ $ chmod +x start_julius.sh
pi@dex:~ $ tmux
pi@dex:~ $ ./start_julius.sh

■動作確認 別画面にて
pi@dex:~ $ jcontrol localhost
 

5.音声で GoPiGo2 を動かしてみる。

■ python プログラム( control_julius.py )を作成してアップロード
#!/usr/bin/python
# -*- coding: utf-8 -*-
import socket
import subprocess
import xml.etree.ElementTree as ET
import time
from gopigo import *
import gopigo
 
def __init__( self ):
gopigo.set_speed(200)
gopigo.stop()
 
def main():
 
    # julius起動スクリプトを実行
    p = subprocess.Popen(["bash /home/pi/start_julius.sh"], stdout=subprocess.PIPE, shell=True)
    pid = p.stdout.read() # juliusのプロセスIDを取得
    host = 'localhost'
    port = 10500
    # LED_L 点灯
    led_on(LED_L)
 
    # TCPクライアントを作成し接続
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.connect((host, port))
 
    # サーバからのデータ受信
    try:
        data = ''
        while 1:
            if '</RECOGOUT>\n.' in data:
                root = ET.fromstring('<?xml version="1.0"?>\n' + data[data.find('<RECOGOUT>'):].replace('\n.', ''))
                for whypo in root.findall('./SHYPO/WHYPO'):
                    command = whypo.get('WORD')
                    score = float(whypo.get('CM'))
                    print command #for debug
                    print score #for debug
                    if (command == u'進め' and score >= 0.90) or (command == u'前進' and score >= 0.80):
                        # すすめ処理
                        print ("Fwd")
                        gopigo.fwd()
                        time.sleep(1)
                        print( "Stop")
                        gopigo.stop()
                    elif (command == u'下がれ' and score >= 0.90) or (command == u'後退' and score >= 0.80):
                        # さがれ処理
                         print ("Back")
                        gopigo.bwd()
                        time.sleep(1)
                        print( "Stop")
                        gopigo.stop()
                    elif (command == u'右へ' and score >= 0.90) or  (command == u'右' and score >= 0.80):
                        # みぎ処理
                         print( "Right")
                         gopigo.right()
                        time.sleep(.5)
                        print( "Stop")
                        gopigo.stop()
                    elif (command == u'左へ' and score >= 0.90) or  (command == u'左' and score >= 0.80):
                        # ひだり処理
                         print( "Left")
                         gopigo.left()
                        time.sleep(.5)
                        print( "Stop")
                        gopigo.stop()
                    elif (command == u'止まれ' and score >= 0.90) or  (command == u'ストップ' and score >= 0.80):
                        # とまれ処理
                        print( "Stop")
                        gopigo.stop()    
                        client.close()
                        led_off(LED_L)
                     else:
                        print( "わかりません")
                data = ''
            else:
                data = data + client.recv(1024)
    except KeyboardInterrupt:
         # CTRL+Cで終了
         print "KeyboardInterrupt occured."
         client.close()
         led_off(LED_L)
if __name__ == "__main__":
    main()

■Julius をモジュールモードで起動してから,上記プログラムを動作させ確認
pi@dex:~ $ sudo nano gpg_julius.sh

julius -C ~/julius/dictation-kit-v4.3.1-linux/word.jconf -module  > /dev/null &
echo $!
sleep 3
sudo python /home/pi/gpgstream/control_julius.py

pi@dex:~ $ sudo chmod +x gpg_julius.sh
pi@dex:~ $ ./gpg_julius.sh

 
2017/07/31 GoPiGo2   toshi