Julius(ジュリアス)のインストール
Juliusはラズパイでも使用可能なオープンソースの音声認識エンジンです。
オープンライセンスなので個人利用はもちろん、商用でも無償で利用することができます。
Juliusをインストールするシェルスクリプト「setup_julius.sh」を実行してください。
sh setup_julius.sh
#! /bin/bash # setting up the Julius # 音声認識エンジンJuliusのインストール echo "Step0= setting snd-pcm-oss" # for OSS sudo apt-get -y install osspd-alsa sudo sed -i -e 's/snd-pcm-oss//' /etc/modules # for ALSA sudo apt-get -y install libasound2-dev echo "Step1= installing Julius" cd sudo sh -c "rm -r julius-master" wget https://github.com/julius-speech/julius/archive/master.zip unzip master.zip rm master.zip cd julius-master ./configure --with-mictype=alsa make sudo make install echo "Step2= Getting and unzip Kits" cd sudo sh -c "rm -r julius-kit" mkdir julius-kit cd julius-kit wget https://github.com/julius-speech/dictation-kit/archive/master.zip unzip master.zip rm master.zip wget https://github.com/julius-speech/grammar-kit/archive/master.zip unzip master.zip rm master.zip echo "finished"
Juliusをモジュールモードで起動する
音声認識をするために、まずはJuliusを「聞き耳状態」にする必要があります。Julius起動プログラム「boot_julius.sh」を実行してみましょう。
sh boot_julius.sh
#!/bin/bash # Julius(キーワード認識版)をモジュールモードで起動 ALSADEV="plughw:1,0" julius -w data_julius.dic -C julius.jconf -module exit 0
Juliusが起動する際、「julius.jconf」と「data_julius.dic」を読み込んでいるのがわかるでしょうか。「julius.jconf」は設定ファイルで、音声認識方法を細かく設定しているファイルです。
# Julius 設定ファイル:音声キーワード認識版 -v /home/pi/julius-kit/dictation-kit-master/model/lang_m/bccwj.60k.htkdic #単語辞書ファイル -h /home/pi/julius-kit/grammar-kit-master/model/phone_m/hmmdefs_ptm_gid.binhmm # PTM triphone -hlist /home/pi/julius-kit/grammar-kit-master/model/phone_m/logicalTri -n 1 #n個の文仮説数が見つかるまで検索を行う -output 1 #見つかったN-best候補のうち、結果として出力する個数 -input mic #マイクからの直接入力 -charconv euc-jp utf8 #出力文字コードの変換(内部euc-jp, 出力utf-8) -rejectshort 600 #検出された入力の時間(msec)が閾値以下なら棄却 -lv 1500 #入力の振幅レベルのしきい値(0から32767の範囲。デフォルトは2000)
音声認識サンプルを実行する
先程まで使っていたLXTerminalはJuliusに専有されてしまっているので、新たなウィンドウを開きましょう。
Juliusの音声認識結果を受けて処理を行うためのサンプルプログラム「sample_julius1.py」を実行してみましょう。マイクに向かって「おはよう」「おはようございます」など朝の挨拶をしてみてください。べゼリーが「どうもです」と返事したら成功です。Ctrl+Cキーで終了します。
cd bezelie/flitz/
python3 sample_julius1.py
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # Sample Code : julius音声認識サンプル # モジュールのインポート from time import sleep # ウェイト処理 import subprocess # 外部プロセスを実行するモジュール import socket # ソケット通信モジュール import select # 待機モジュール import sys # python終了sys.exit()のために必要 # 変数 ttsJpn = "exec_talkJpn.sh" # 音声合成 bufferSize = 256 # 受信するデータの最大バイト。2の倍数が望ましい。 # 関数 def socket_buffer_clear(): while True: rlist, _, _ = select.select([client], [], [], 1) if len(rlist) > 0: dummy_buffer = client.recv(bufferSize) else: break # TCPクライアントを作成しJuliusサーバーに接続する client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) enabled_julius = False for count in range(3): try: client.connect(('localhost', 10500)) # client.connect(('10.0.0.1', 10500)) # Juliusサーバーに接続 enabled_julius = True break except socket.error: print ('failed socket connect. retry') pass if enabled_julius == False: print ('Could not find Julius') sys.exit(1) # メインループ new = "" try: print ('音声認識開始') cmds = ['sh',ttsJpn, 'こんにちは'] # コマンドリストの作成 proc = subprocess.Popen(cmds, stdout=subprocess.PIPE) # コマンドの呼び出し proc.communicate() # コマンド実行プロセスが終了するまで待機 data = "" socket_buffer_clear() while True: data = str(client.recv(bufferSize)).decode('utf-8') # Juliusサーバーから受信 if "<RECOGOUT>" in data: new = "" new = new + data if "</RECOGOUT>" in new: # RECOGOUTツリーの最終行を見つけたら以下の処理を行う print (new) if u"朝の挨拶" in new: cmds = ['sh',ttsJpn, 'どうもです'] # proc = subprocess.Popen(cmds, stdout=subprocess.PIPE) # コマンドの呼び出し proc.communicate() # コマンド実行プロセスが終了するまで待機 else: print ("not mached") socket_buffer_clear() new = "" except KeyboardInterrupt: # CTRL+Cで終了 client.close() sys.exit(0)
「RECOGOUTってなんやねん?」と思ったかもしれませんね。Juliusは音声認識結果を、以下のような感じでpythonに送ってきます。<RECOGOUT>タグと</RECOGOUT>タグに囲まれた部分が音声認識された結果なのです。
<INPUTPARAM FRAMES="98" MSEC="980"/> . <RECOGOUT> <SHYPO RANK="1" SCORE="-2356.354980" GRAM="0"> <WHYPO WORD="朝の挨拶" CLASSID="朝の挨拶" PHONE="silB o h a y o u silE" CM="0.997"/> </SHYPO> </RECOGOUT> .
好きな言葉に反応できるようにする
先程の例では何種類かの「朝の挨拶」にしか反応しませんでしたが、データを追加することで反応するキーワードを増やすことができます。最終的なJulius向けのデータは拡張子が「.dic」になりますが、まずは以下のようなcsvファイルを作ることから始めます。分類とキーワードをカンマで区切って書いていくだけです。
cat data_julius.csv
朝の挨拶,おはよう 朝の挨拶,おっは 朝の挨拶,おはようございます 朝の挨拶,もーにんぐ 昼の挨拶,こんにちは 昼の挨拶,こんちはー 昼の挨拶,ちわー 昼の挨拶,おっす 昼の挨拶,はろー 昼の挨拶,よお 昼の挨拶,へいっ 夜の挨拶,こんばんわ テスト,てすとです テスト,てすと テスト,きこえますか テスト,ちぇっく テスト,きこえてる
上記のcvsファイルをtool_julius.shによってJulius用の辞書ファイルdata_julius.dicに変換することで、Julius起動時に読み込まれ、キーワード認識ができるようになります。
sh tool_julius.sh
#!/bin/bash # csvデータをtsvに変換 sudo sed -E "s/,/ /g" data_julius.csv > data_julius.tsv # tsvファイルをjuliusのdic形式に変換 sudo iconv -f utf8 -t eucjp data_julius.tsv | ./tool_yomi2voca.pl > data_julius.dic exit 0
「tool_yomi2voca.pl」というのはJuliusが提供している辞書データ作成ツールです。
以上です。これで好きなキーワードにべゼリーを反応させることができるようになりました。if文を追加していくことで、どんどん複雑な会話ができるようになります。