Julius音声認識ソフトpart3!フリーでも文法ファイルで認識率アップ
さて、60爺の音声認識第三弾は、Julius用の文法ファイルを拵えて音声認識にチャレンジしてみます。
まずは、天気予報、ニュースを音声で伝えて、ラズパイにしゃべってもらいます。
伝える音声は、「ニュース」「天気」と「教えて」「話して」を組み合わせて行こうと思います。話す種類も少ないので、認識率は高まるはずだと思います。
まずは、出来る部分を増やしてモチベーションを高めましょうか。
part1,2同様、実施内容を備忘録の形で残していきます。
実行手順
最初に、part3の実行手順を示します。
- vocaファイル作成
- grammarファイル作成
- コンパイル実行
- 音声認識実行
1,2で文法ファイルを作成し、3でコンパイルを行い、最後4で音声認識を実行します。
vocaファイル作成
このファイルには、発音音素列を記述するそうです。記述はローマ字(ヘボン式)で行います。区切り文字は半角スペースです。
60爺は、source.vocaとしました。まずは、天気予報ないしニュースをしゃべってもらうため、ソースという名称にしました。
“NS_B" と “NS_E" はそれぞれ文頭、文末の「無音区間」に対応する単語カテゴリで、文の最初と最後に必ず挿入する必要があるとのことです。
% SOURCE
天気 t e n k i
ニュース n y u u s u
% WO
を w o
% PLEASE 教えて o sh i e t e
話して h a n a sh i t e
% NS_B
[s] silB
% NS_E
[s] silE
grammarファイル作成
このファイルで 構文制約を行います。
SOURCE と SOURACE WO の両方に SOURCE_ を定義します。
これにより「天気教えて」と「ニュースを話して」のふたつの音声に対し、ひとつの構文制約で対応します。
S : NS_B SOURCE_ PLEASE NS_E
SOURCE_ : SOURCE
SOURCE_ : SOURCE WO
pi@raspberrypi:~/julius-4.3.1/gramtools/mkdfa $ ls
00readme-ja.txt Makefile mkdfa.pl mkfa-1.44-flex source.voca
00readme.txt Makefile.in mkdfa.pl.in source.grammar
さあ、準備が出来ました。
コンパイル実行
mkdfa.plを使用してコンパイルを行います。
お約束のエラーが・・・
pi@raspberrypi:~ $ sudo julius-4.3.1/gramtools/mkdfa/mkdfa.pl source
sudo: julius-4.3.1/gramtools/mkdfa/mkdfa.pl: コマンドが見つかりません
実行可能なコマンドがないと言ってます。
たしかに、mkdfa.plには、実行可能となっていませんね。うーん、どういうことだろう。
pi@raspberrypi:~ $ cd julius-4.3.1/gramtools/mkdfa/
pi@raspberrypi:~/julius-4.3.1/gramtools/mkdfa $ ls -l
合計 36
-rw-r--r-- 1 pi pi 2306 12月 20 2013 00readme-ja.txt
-rw-r--r-- 1 pi pi 1939 12月 20 2013 00readme.txt
-rw-r--r-- 1 root root 893 9月 25 07:58 Makefile
-rw-r--r-- 1 pi pi 799 6月 21 2013 Makefile.in
-rw-r--r-- 1 root root 5224 9月 25 07:58 mkdfa.pl
-rwxr-xr-x 1 pi pi 5180 6月 21 2013 mkdfa.pl.in
drwxr-xr-x 3 pi pi 4096 9月 25 07:58 mkfa-1.44-flex
.plは、Perlプログラムです。実行するには、perl perlプログラムで動くようです。それでは、頭に、Perlをつけて実行してみれば、動くのではないでしょうか?
まずは、先ほど作成した voca,grammarファイルを、ディレクトリ source に入れて実行してみます。
pi@raspberrypi:~ $ mkdir source
pi@raspberrypi:~ $ mv source.grammar source.voca source
pi@raspberrypi:~ $ sudo perl julius-4.3.1/gramtools/mkdfa/mkdfa.pl source/source
source/source.grammar has 3 rules
source/source.voca has 0 categories and 3 words
Warning: dfa_minimize not found in the same place as mkdfa.pl
Warning: no minimization performed
no .dfa or .dict file generated
あれれ、ワーニングが出て、.dfa, .dict が generate 出来ないと言ってます。
ディレクトリ source の下には、source.term が generate されましたが、中身は空でした。
さあ、再実行します!
ワーニングでは、dfa_minimizeが、mkdfa.plと同じ場所にないと言ってますね。じゃ、上記の記事にあったものと同じなのでコピーして再実行してみましょう。
pi@raspberrypi:~ $ cp julius-4.3.1/gramtools/dfa_minimize/dfa_minimize julius-4.3.1/gramtools/mkdfa/dfa_minimize
さあ、再実行します。
pi@raspberrypi:~ $ sudo perl julius-4.3.1/gramtools/mkdfa/mkdfa.pl
source/source
source/source.grammar has 3 rules
source/source.voca has 0 categories and 3 words
---
Error: cannot open "source/source.dfa.tmp"
---
no .dfa or .dict file generated
今度は、ワーニングではなく、エラーに昇格してしまいました。ディレクトリ source に source.dfa.tmp がない(のでオープンできない)とのエラーです。
・
・
なんじゃらほいですね。
これでどうだ!?
上記の記事では、コンパイルの際に、もうひとつファイルが必要なのでコピーせよと言ってますので、エラーついでに、こちらもコピーして実行してみましょう。
pi@raspberrypi:~ $ cp julius-4.3.1/gramtools/mkdfa/mkfa-1.44-flex/mkfa julius-4.3.1/gramtools/mkdfa/mkfa
じゃ、やってみます。
pi@raspberrypi:~ $ sudo perl julius-4.3.1/gramtools/mkdfa/mkdfa.pl source/source
source/source.grammar has 3 rules
source/source.voca has 5 categories and 7 words
Now parsing grammar file
Now modifying grammar to minimize states[-1]
Now parsing vocabulary file
Now making nondeterministic finite automaton[6/6]
Now making deterministic finite automaton[6/6]
Now making triplet list[6/6]
5 categories, 6 nodes, 6 arcs
-> minimized: 6 nodes, 6 arcs
generated: source/source.dfa source/source.term source/source.dict
おー、出来たようです。すばらしい。
ディレクトリ source にいくと、source.dfa,source.term,source.dict の3ファイルがgenerateされています。
音声認識実行
それでは、上記で作成した 三つのファイルを用いて音声認識を行ってみます。
pi@raspberrypi:~ $ julius -C julius-kits/grammar-kit-v4.1/hmm_mono.jconf -lv 5000 -input mic -gram ~/source/source -nostrip
ご覧の通り、見事にクリアできました。
- 「天気教えて」「天気を教えて」
- 「ニュース教えて」「ニュースを教えて」
- 「天気話して」「天気を話して」
- 「ニュース話して」「ニュースを話して」
4でちょっと引っかかったものの、それ以外は見事にクリアできました。
最後に
Julius音声認識ソフトの実践も第3弾となりました。
今回は、フリーですが文法ファイルを用意して認識率アップを図ることを狙いとしました。
伝える音声は、「ニュース」、「天気」と「教えて」「話して」を組み合わせる形で行きました。
結果、話す種類を絞って、認識率が高まることを確認しました。
■思えば、「Julius音声認識」の記事も増えてきました
ディスカッション
コメント一覧
まだ、コメントがありません