ルールベースの juliusと精度

ルールベースの julius と精度についてです。
ルールベースの julius は、やたらに過剰マッチを繰り返します。


そこで、SAPIでやったように、認識率で重しをつけます。
一応、score や confidence(cmscore)などがあるのでそれで判断できそうに思えます。
が、実際やってみると、うまくいきません。

ケーキ食べたい

(ケーキ)(ください) または、(ケーキ)(食べたい) といった音声認識パータンを作ってみます。
いろいろ喋ってみて様子を観察しましょう。
動くサンプルは、このサンプルキットの grammar-kit-v4.2-win\cake です。

0	[</s>]	 silE
1	[<s>]	 silB
4	[ケーキ]	 k e: k i
5	[ください]	 k u d a s a i
5	[たべたい]	 t a b e t a i


ケーキください


ケーキ食べたい


ケーキは嘘


タコス食うか?


そんなことより野球しようぜ!


昔々あるところにおじーさんとおばーさんが住んでいました。おじーさんは川に洗濯に、おばーさんは山に芝かりに行きました。って逆ぢゃん。


scoreとconfidenceの値を比べてみましょう。
ドキュメントによると、score は尤度で、常にマイナスの数字になり、 0に近いほどいいらしいです。
confidence(cmscore)は、確率で0〜1の値を返し、1に近いほど確かなみたいです。
また、confidence(cmscore)の最初と最後には、マークが挿入されますので、読み飛ばす必要があります。
ここでは、最初と最後のスコアを消して表にしています。

発音 マッチ スコア confidence
ケーキください ケーキ ください -5177.162109 1.000 1.000
ケーキ食べたい ケーキ 食べたい -3522.017822 1.000 1.000
ケーキは嘘 ケーキ ください -3584.453125 1.000 0.898
タコス食うか ケーキ ください -3802.656738 1.000 1.000
そんなことより野球しようぜ! ケーキ ください -3802.656738 1.000 1.000
昔々あるところに... ケーキ ください -22794.660156 1.000 0.951


はい、ダメですね。
正しい入力と間違った入力の区別がつけられませんね。


スコアの値が荒ぶっています。
尤度なので単純な比較はできないかもしれませんが、そのままでは使えません。


cake is lie.
cake is lie.
cake is lie.
cake is lie.
cake is lie.


さらに、ケーキの confidence(cmscore)が常に 1 になっていますね。
常に正しいとか、アルファコンプレックスのコンピュータみたいですね。怖いですね。

ケーキもバナナ食べたいです

ちょっとサンプルを変えてみましょう。
(ケーキ)(ください) または、(ケーキ)(食べたい) または (バナナ)(ください) または、(バナナ)(食べたい) としてみます。
ケーキ or バナナ の選択肢になりました。
今度はどうでしょうか?
動くサンプルは、このサンプルキットの grammar-kit-v4.2-win\cake_or_banana です。

0	[</s>]	 silE
1	[<s>]	 silB
4	[ケーキ]	 k e: k i
4	[バナナ]	 b a n a n a
5	[ください]	 k u d a s a i
5	[たべたい]	 t a b e t a i

ケーキください


ケーキ食べたい


ケーキは嘘


タコス食うか?


そんなことより野球しようぜ!


昔々あるところにおじーさんとおばーさんが住んでいました。おじーさんは川に洗濯に、おばーさんは山に芝かりに行きました。って逆ぢゃん。

発音 マッチ スコア confidence
ケーキください ケーキ ください -3477.051270 1.000 1.000
ケーキ食べたい ケーキ たべたい -4375.406738 1.000 1.000
ケーキは嘘 ケーキ ください -3548.833252 1.000 0.908
タコス食うか ケーキ ください -3932.959473 0.651 1.000
そんなことより野球しようぜ! バナナ ください -5844.240234 0.656 0.991
昔々あるところに... バナナ たべたい -24742.443359 0.996 0.746


失敗したときのケーキの confidence(cmscore) が揺らぎ始めました。
そうなんです。
このconfidenceの確率というのは、ライバルと比べた場合の確率なんですね。
最初の例だと、ケーキしか選択肢がなかったから必ず100%になってしまったわけです。

なんてこったい。

score

そして、score は相変わらずフリーダムな値を返します。
これは尤度らしくて、値の積み重ねだそうなんですね。だから、長期に間違った文章を入れると果てしなくマイナスな値に突っ込んでしまいます。
そのため、録音時間やフレーム数で割って利用してみましょう。
juliusには、標準では、録音時間を表示するものやスコアを割ってくれる機能がないので自作する必要があります。
ちょっとこれは省略しますね。
(ただ、それをやったとしてもこれだけでは判断できかねますけどね)

わかったこと

ともかく、2つの事がわかりました。
1つは confidence を揺らがせるには、ライバル単語が必要。
2つは score は間違った値を長く聴かせるとマイナスに突っ込みまくる。

ゴミノード

どうすれば、SAPIのような、そこそこ信頼出来る値が取れる考えます。
ライバルがいれば confidence が揺らぐわけですから、ライバルを作ればいいわけです。
あ-ん のダミーデータを入れてみましょう。

0	[</s>]	 silE
1	[<s>]	 silB
4	[ケーキ]	 k e: k i
4	[バナナ]	 b a n a n a
4	[gomi]	a
4	[gomi]	i
4	[gomi]	u
4	[gomi]	e
4	[gomi]	o
4	[gomi]	k a
4	[gomi]	k i
4	[gomi]	k u
4	[gomi]	k e
4	[gomi]	k o
4	[gomi]	s a
4	[gomi]	sh i
4	[gomi]	s u
4	[gomi]	s e
4	[gomi]	s o
4	[gomi]	t a
4	[gomi]	ch i
4	[gomi]	ts u
4	[gomi]	t e
4	[gomi]	t o
4	[gomi]	n a
4	[gomi]	n i
4	[gomi]	n u
4	[gomi]	n e
4	[gomi]	n o
4	[gomi]	h a
4	[gomi]	h i
4	[gomi]	f u
4	[gomi]	h e
4	[gomi]	h o
4	[gomi]	m a
4	[gomi]	m i
4	[gomi]	m u
4	[gomi]	m e
4	[gomi]	m o
4	[gomi]	y a
4	[gomi]	y u
4	[gomi]	y o
4	[gomi]	r a
4	[gomi]	r i
4	[gomi]	r u
4	[gomi]	r e
4	[gomi]	r o
4	[gomi]	w a
4	[gomi]	N
5	[ください]	 k u d a s a i
5	[たべたい]	 t a b e t a i


(ケーキ)(ください) (あ)(ください) (い)(ください) ... (ん)(ください) といった、ダミーデータに埋もれさせることに寄って、ライバルを意図的に作り出します。
感覚的に言うと、あ-んに埋もれているケーキをUFOキャッチャーで拾い上げるようなものです。


早速やってみましょう。
動くサンプルは、このサンプルキットの grammar-kit-v4.2-win\cake_or_banana_vs_rival です。

ケーキください


ケーキ食べたい


ケーキは嘘



タコス食うか?


そんなことより野球しようぜ!


昔々あるところにおじーさんとおばーさんが住んでいました。おじーさんは川に洗濯に、おばーさんは山に芝かりに行きました。って逆ぢゃん。

発音 マッチ スコア confidence
ケーキください ケーキ ください -3648.394531 0.962 1.000
ケーキ食べたい ケーキ 食べたい -3577.765381 0.986 1.000
ケーキは嘘 ケーキ ください -4066.991943 0.802 0.983
タコス食うか gomi ください -4015.263916 0.326 0.995
そんなことより野球しようぜ! gomi ください -5627.587910 0.556 0.999
昔々あるところに... ばなな ください -20624.134766 0.912 0.900


うーん、そこそこの値はとれている感じですかね。


仮説によるペナルティ

そこで julius のクセを見ます。
詳しくはソース読んでいないんですけど、 julius は仮説を立てて推論しています。
これだ!!と拡張を持てないときは、あれかな、これかな?といった推論を多くするようです。


なので、推論しているということは自信がない証拠であって、間違っている可能性が大きいとしてみましょう。
何処まで推論するかは、 -n と -output パラメータで設定できます。
本当にそうなのか、パラメータを増やして挙動を観察してみましょう。
動くサンプルは、このサンプルキットの grammar-kit-v4.2-win\cake_or_banana_vs_rival_optionN です。

testmic.jconf

-gram cake
-C ../../hmm_ptm.jconf
-input mic 
-n 10 -output 6   ←追加


ケーキください


ケーキ食べたい


ケーキは嘘


タコス食うか?


そんなことより野球しようぜ!


昔々あるところにおじーさんとおばーさんが住んでいました。おじーさんは川に洗濯に、おばーさんは山に芝かりに行きました。って逆ぢゃん。

うーん、それでもよくわからないですね。


ただ、間違った入力の時には、結果が長くなって推論していることがわかります。
正しい入力でも聞き取りづらい発音をすると長くなったりすることもありますが、まぁ、いいでしょうw

ともかく、長々と推論している時に、スコアを下げるような重しを作ってみましょう。

わかったこととjulius-plus

ライバルを作ると confidence(cmscore) が変動する。
scoreの値は間違った単語を長々きかせていると限りなく小さくなる。
仮説によるペナルティはそこそこ有効


これらをあわせてパッケージ化したものが julius-plus です。
julius-plus だと、plusスコアとして、これらを加味したスコアを計算します。
githubにあるので自由に使ってください。
https://github.com/rti7743/rtilabs/tree/master/files/asobiba/juliustest/julius-4.2.1


そこそこの精度が出るようになったと思います。
「ただし」これもSAPIと同じように会話に弱いです。
議論のような、短文が連続するシーンに置くと誤認識してしまいます。
そこで、次のSVMによる解決案に進みます。


続く・・・


ケーキ欲しい