Hatena::ブログ(Diary)

お前の血は何色だ!! 4 このページをアンテナに追加 RSSフィード Twitter

2012-03-14

ルールベースの 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

ケーキください

f:id:rti7743:20120314112941j:image


ケーキ食べたい

f:id:rti7743:20120314112955j:image


ケーキは嘘

f:id:rti7743:20120314113009j:image


タコス食うか?

f:id:rti7743:20120314113026j:image


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

f:id:rti7743:20120314113040j:image


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

f:id:rti7743:20120314113051j:image


scoreとconfidenceの値を比べてみましょう。

ドキュメントによると、score は尤度で、常にマイナスの数字になり、 0に近いほどいいらしいです。

confidence(cmscore)は、確率で0〜1の値を返し、1に近いほど確かなみたいです。

また、confidence(cmscore)の最初と最後には、マークが挿入されますので、読み飛ばす必要があります。

ここでは、最初と最後のスコアを消して表にしています。

発音マッチスコアconfidence
ケーキくださいケーキ ください-5177.1621091.000 1.000
ケーキ食べたいケーキ 食べたい-3522.0178221.000 1.000
ケーキは嘘ケーキ ください-3584.4531251.000 0.898
タコス食うかケーキ ください-3802.6567381.000 1.000
そんなことより野球しようぜ!ケーキ ください-3802.6567381.000 1.000
昔々あるところに...ケーキ ください-22794.6601561.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

ケーキください

f:id:rti7743:20120314114212j:image


ケーキ食べたい

f:id:rti7743:20120314114324j:image


ケーキは嘘

f:id:rti7743:20120314114344j:image


タコス食うか?

f:id:rti7743:20120314114753j:image


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

f:id:rti7743:20120314114421j:image


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

f:id:rti7743:20120314114433j:image


発音マッチスコアconfidence
ケーキくださいケーキ ください-3477.0512701.000 1.000
ケーキ食べたいケーキ たべたい-4375.4067381.000 1.000
ケーキは嘘ケーキ ください-3548.8332521.000 0.908
タコス食うかケーキ ください-3932.9594730.651 1.000
そんなことより野球しようぜ!バナナ ください-5844.2402340.656 0.991
昔々あるところに...バナナ たべたい-24742.4433590.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 です。

ケーキください

f:id:rti7743:20120314115448j:image


ケーキ食べたい

f:id:rti7743:20120314115503j:image


ケーキは嘘

f:id:rti7743:20120314115518j:image



タコス食うか?

f:id:rti7743:20120314115548j:image


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

f:id:rti7743:20120314115600j:image


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

f:id:rti7743:20120314115613j:image

発音マッチスコアconfidence
ケーキくださいケーキ ください-3648.3945310.962 1.000
ケーキ食べたいケーキ 食べたい-3577.7653810.986 1.000
ケーキは嘘ケーキ ください-4066.9919430.802 0.983
タコス食うかgomi ください-4015.2639160.326 0.995
そんなことより野球しようぜ!gomi ください-5627.5879100.556 0.999
昔々あるところに...ばなな ください-20624.1347660.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   ←追加

ケーキください

f:id:rti7743:20120314120200j:image


ケーキ食べたい

f:id:rti7743:20120314120213j:image


ケーキは嘘

f:id:rti7743:20120314120226j:image


タコス食うか?

f:id:rti7743:20120314120240j:image


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

f:id:rti7743:20120314120306j:image


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

f:id:rti7743:20120314120350j:image

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


ただ、間違った入力の時には、結果が長くなって推論していることがわかります。

正しい入力でも聞き取りづらい発音をすると長くなったりすることもありますが、まぁ、いいでしょう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による解決案に進みます。


続く・・・


ケーキ欲しい

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

リンク元