うしこlog
公開: 2014/08/10

ラズパイで音声認識をしてみる

今回の内容

 ラズベリーパイにUSBマイクを繋げて音声認識をしてみます。音声認識ソフトとしてはJuliusというソフトを使用し、その使い方を説明します。なお認識した音声は、文字列として出力されます。

前回までの内容は?

 前回は、ラズパイを使うための設定(OSのインストール,SSH等)をして、ラズパイからエアコンを操作する方法について紹介しました。
前回までの内容が気になる方や、ラズベリーパイをもっと活用したい方 は、ぜひ以下の記事をご確認ください。

Juliusとは

 Juliusは、音声認識をすることができるオープンソースソフトウェアです。読み方はユリウス? ジュリアス?どっちかな。よくわかりません(汗)
今回は、Juliusを使ってマイクからの音声を認識してみます。Juliusはwindowsのみならずlinuxでも動くので、ラズパイで扱うことができます。

音声入力の準備

 Juliusをインストールする前に、音声入力を行うための準備をしましょう。

使用したマイク

 使用したマイクは、SANWAの無指向性USBマイクを使用しました。 このマイクはラズパイでも、正常に動作しました。

使用したマイク
使用したマイク

マイク接続確認

 ラズパイにマイクを接続したら、ラズパイに電源を供給し以下のコマンドを打ち込みマイクの接続確認をします。
"snd_usb_audio"があれば問題ありません。なお、"snd_usb_audio"の左に記載された数字がusbマイクの優先度となります(0が最優先となります)。

sudo cat /proc/asound/modules
configureした時
サウンドデバイスの確認

USBマイクの優先度設定

 USBオーディオアダプタ(USBマイク)の優先度を上げておきましょう。
1. 以下のコマンドにより設定ファイルを開きます。

sudo vi /etc/modprobe.d/alsa-base.conf

2. 設定ファイルの中身を変更します(index=0にする)。
以下は、コメントアウトして新しく定義した例です。

# options snd-usb-audio index=-2
options snd-usb-audio index=0

3. ラズパイを再起動します。

マイクの感度設定

 マイクの感度を設定するには以下のコマンドを使います。入力可能範囲は0~62です(62が100%となる)

amixer sset Mic 54

環境変数の設定

 次は、入力デバイスを選択するために、オーディオカード番号を環境変数ALSADEVへ指定します。ただし、pulseaudioを使用しない場合のみ、環境変数を設定します。

1. 以下のコマンドよりUSBオーディオカード番号を確認します。

arecord -l

2. オーディオカード番号を環境変数に指定します
以下は、カード番号が0であった場合の例です。カード番号に応じて赤文字の部分を書き換えて下さい。

export ALSADEV=hw:0

Juliusのインストール

1. Juliusをダウンロードします。
(2014/7/1現在で、最新バージョンは4.3.1です)

wget -O julius-4.3.1.tar.gz
 'http://sourceforge.jp/frs/redir.php?m=osdn&f=%2Fjulius%2F60273%2Fjulius-4.3.1.tar.gz'

2. Juliusのディクテーションキット(v4.3.1)およびグラマーキット(v4.1)をダウンロードします。

wget -O dictation-kit-v4.3.1-linux.tgz
 'http://sourceforge.jp/frs/redir.php?m=jaist&f=%2Fjulius%2F60416%2Fdictation-kit-v4.3.1-linux.tgz'
wget -O grammar-kit-v4.1.tar.gz
 'http://sourceforge.jp/frs/redir.php?m=osdn&f=%2Fjulius%2F51159%2Fgrammar-kit-v4.1.tar.gz'

3. ダウンロードしたJuliusをインストールします(8分ほどかかります)。

tar zxvf julius-4.3.1.tar.gz
cd julius-4.3.1/
./configure
make
sudo make install
configureした時
configureした時

4. ディクテーションキットと、グラマーキットを解凍します。

tar zxvf dictation-kit-v4.3.1-linux.tgz
tar zxvf grammar-kit-v4.1.tar.gz

5. snd-pcm-ossモジュールを組み込みます。
(julius実行時エラー、"Error: adin_oss: failed to open /dev/dsp" となることを防ぐため)

sudo sh -c "echo snd-pcm-oss >> /etc/modules"

6. Juliusを実行します(グラマーキットを使ってみる)。

julius -C ~/grammar-kit-v4.1/testmic.jconf -charconv EUC-JP UTF-8
juliusテスト実行
juliusテスト実行

7. 「りんご2こをください」と喋ってみる。しっかり認識しましたよ。

julius_りんご2こくださいの認識
"julius_りんご2こをください"の認識

8. マイクの感度を調節するときは、先ほどのマイクの感度調整で行えます。

 これで、Juliusを使えるようになりました。

Juliusの使い方

 ここでは、認識させたい文字列を記述した辞書を作成し、マイクから入力された音声を認識させてみます。今回は「テレビオン」という文字列を認識させてみます。

 その前に、Juliusのキット2つをjulius-kitsフォルダにまとめておきます。フォルダ名は好きな名前を付けても構いません。

mkdir julius-kits
mv ~/dictation-kit-v4.3.1-linux ~/julius-kits
mv ~/grammar-kit-v4.1 ~/julius-kits

辞書作成

 辞書の作成は、単語帳を作り、それを変換することで作成できます。

 単語帳(word.yomiとした)を、julius-kitsフォルダ下に作成します。単語帳ファイルには"認識させたい単語"+"Tab"+"単語の読み" を記述します。

cd ./julius-kits
vi ~/word.yomi
-------word.yomi内での記述--------
テレビオン てれびおん
テレビオフ てれびおふ
テレビ1    てれびいち
テレビ2    てれびに
  (省略)
テレビ9    てれびきゅう
テレビ10 てれびじゅう
----------------------------------

 作成した単語帳(word.yomi)を、juliusが認識可能な単語辞書ファイル(word.dic)に変換します。

cd ~/julius-4.3.1/gramtools/yomi2voca/
iconv -f utf8 -t eucjp ~/word.yomi | ./yomi2voca.pl 
 > ~/julius-kits/dictation-kit-v4.3.1-linux/word.dic

 単語辞書ファイルは、ディクテーションキットフォルダに保存されます。辞書の文字コードはEUC-JPであることに注意してください。

Juliusの実行

 Juliusのオプションをまとめた設定ファイル(word.jconfとした)を作成します。これにより、Julius実行時の引数を省略することができます。先ほど作成した単語辞書ファイル等、Juliusを実行するときの引数を記述します。

vi ~/julius-kits/dictation-kit-v4.3.1-linux/word.jconf
------------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)
--------------------------------------------------------------------------------

 Julius実行の引数についての詳しい説明はjulius.sourceforge.jpを参照してください。

 単語辞書ファイルに記述された単語をJuliusで認識してみます。以下のコマンドのように実行します。

julius -C ~/julius-kits/dictation-kit-v4.3.1-linux/word.jconf
julius実行
julius実行

 マイクに向かって「テレビオン」と発すると...

テレビオンの認識
"テレビオン"の認識

 しっかりと認識してくれた! 感動!!

 Juliusで音声を認識させることができたので、音声でエアコンやテレビを操作するものを近いうちに作ろうと思います。ラズベリーパイからエアコンを操作する方法は、以前やりましたからね。

<< ラズパイでエアコンを動かす ラズパイをWebサーバにするへ >>