一般的な音声認識

Download Report

Transcript 一般的な音声認識

HMM(Hidden Markov Model)
と音声認識におけるその実際
(比較的業界標準で使われる
認識ソフトの認識手法のやり方)
H17.08.05
岡田 一秀 ( 4ET2G )
HMMってそもそも何?
隠れマルコフモデル(HMM)と言うは、
事象がある状態Siにある時、ないし事象
がある状態SiからSjに遷移しようとする時
に目で見えるOutputが一義的に出るので
はなくて、いろいろな出力がある確率の
条件で出る可能性があるのですよ、
(要はいろいろな物事が起きるVariation
が多いのですよ)と言うことを表示する
モデル ⇒ 業界標準の認識ソフトでよく使う
では、音声認識で言う
状態Sと出力kの定義は?
S : 声道の形状、調音(共振)位置に
対応している、ある(何か不明な)状態
k: ≒ケプストラム(短時間スペクトから
変形されたベクトル)
※ 出力確率は、出力されるケプスとラムの
値kそのものと区別するためによくb(k)と言う
書き方をする
何故,同一状態(状態遷移)
にいて出力にVariationを見込むの?
同一人物でも声門下圧や
舌の湿り、口蓋・咽頭等口腔内筋肉や
顎の反応の敏速性が時間に応じ違う上、
さらに個人間では、声道長さや声帯の大きさ、声
道(帯)周りの脂肪の付き方も違うでしょう
⇒
同じ状態遷移の可能性においても出力
にバリエーションを持たせないといけない
(要はHMMは‘状態’と‘出力’と言う2事象間における
相関の不確定性を補完する論理)
何故“隠れ”(Hidden)か?
同一人物でも声門下圧や
舌の湿り、口蓋・咽頭等口腔内筋肉や
顎の反応の敏速性が時間に応じ違う上、
さらに個人間では、声道長さや声帯の大きさ、
声道周りの脂肪の付き方も違うでしょう。
出力の出され方に応じて、一番尤度が高い
モデルを当該語彙と(志向語彙が
辞書の結果と合致したものと)見なし
採用する。
よって、状態の種別はもとより通過した状態
遷移パスは問わないし、認識エンジンの
ユーザーにも見えない
HMM(一般的)の概念は?
(4状態(S1→S4)のHMMを考えよう)
Si→Sjへ遷移
する確率は?
(状態遷移確率)
aij
0. 3
0.2
[ 0.7 ]
0.1
0. 1
0. 1
(斜字)
S1
量子化後の
パターンの
出方は?
(出現確率)
0. 2
0.1
[ 0.4]
0.5
0.3
[ 0.3 ]
0.4
0.2
[ 0.3 ]
0.5 0.4
S2
0.8
[ 0.1 ]
0.1
1.0
0.2
[ 0.6]
0.2
0. 8
0. 6
S3
0. 3
0.4
[ 0.3 ]
0.3
0.3
[ 0.3 ]
0.4
S4
0.6
[ 0.3 ]
0.1
S1
→ S1 → S2 → S3 → S3 → S4
と状態が遷移し、観測され出力がA,B,B,A,C,Bの場合
{
S1→S4
{ {
{ {
A
b= [B]
C
0. 2
0.4
[ 0.3]
0.3
総体確率Πaijbj(k) = 0.3×0.2×0.1×0.3×0.6×0.1×
0.2×0.5×0.8×0.3 = 0.000005184
HMM(実戦的)の概念は?
(音素HMMに適した
音声認識にはより実際的なもの)
Si→Sjへ遷移
する確率は?
(状態遷移確率)
↓
aij
0. 3
0. 7
(斜字)
量子化後の
パターンの出方は?
(出現確率)
↓
0.3
[ 0.5]
0.2
S1
S1
→
S2
1.0
0.1
[ 0.1]
0.8
0. 8
0.7
[ 0.2 ]
0.1
S3
・ 桂馬飛びは無し
・ 音素HMMなら3状態で十分
S3
と状態が遷移し、上記S1→S2時、S2→S2時、S2→S3時に
→
S2
0.3
[ 0.1]
0.6
S2
→
観測される出力がB,C,Aの場合
S2 → S 3
{
S1→S3
S2 → S2
{
S1 → S 2
{
A
b= [B]
C
0. 2
0.2
[ 0.7 ]
0.1
総対確率Πaijbj(k) = 0.7×0.5×0.2×0.6×0.8×0.7
= 0.02352
HMMの勝ち馬は何処で
各語彙毎に持っ
ているHMMの
ここ(最終総対
確率)の大小を
比較する
判定するのか?
状態
(声道の形
状に対応
したもの) (見える信号
の加工物)
出力
A
↓
S1
1.0
0.3×0.2
C
0.06
0.7×0.2
0.7×0.3
S2
B
0.21
0.2×0.6
0.03372
0.8×0.2
0.8×0.1
S3
0.168
※
S1(始点状態)からS3(終点状態)にA、
C、Bと言う出力を出しながら遷移する
パスと言っても
に示すように多い
1.0×0.1
ないし
0.022
内の数字は
状態Siから状態Snまでの総対確率
(パスの交わり時は確率をたす。但し、トレリスと言っ
て総体確率に関して対数を取って確率的に望みの
ない経路は枝刈り(切り捨てる)する方法も多い)
2語彙間だけでの認識結果の比較
状態
↓ 出力 →
語彙
S1
∈
1.0
A
C
B
a11×b11(A)
∈M1
∈M1
a22×b22(C)
∈M1
M1
∈M1
M1
a12×b12(C)
S2
∈M1
∈M1
∈M1
S3
∈M1
∈M1
∈M1
a33×b33(B)
∈M1
S1
∈
語彙 M2
M2
S2
1.0
PLM1
∈M1
a11×b11(A)
∈M2
∈M2
a12×b12(C)
∈M2
大
小
比
較
∈M2
a22×b22(C)
∈M2
∈M2
a23×b23(B)
∈M2
∈M2
S3
∈M1
a23×b23(C)
∈M1
∈M2
a23×b23(B)
∈M2
a23×b23(C)
∈M2
∈M2
a33×b33(B)
∈M2
∈M2
PLM2
モデルは、どんな単位で作るの
か?
単語単位
/okada/
長所
単語単位の場合は調音結合の
問題が回避できるので、
高い認識率が得られる
音素単位
/o/ /k/ /a/
語彙数の増加に伴う辞書の記憶容量・
計算量・学習処理の増加が少ない。
トライフォンの 音素単位よりは多いが
音素単位
辞書も単語単位よりは少なくて済む
/*-O-k/
/o-K-a/
/k-A-d/
短所
語彙数が増すと、辞書としての標準
パターンの記憶容量・認識の計算量・
学習処理の労力が大きくなる。
連続音声認識の場合に、
単語間の調音結合を考慮するの
が難しい。
音素単位への区分化や認識の
誤りが、全体としての認識率を低下
させる
きめこまやかなモデルなので、
音素単位よりは精度が出る。
出力としてのケプストラムの定義は?
音声波形の数十ms内の単位ごとに時間窓を
かけて短時間フーリエ変換された振幅スペクトル
(絶対値モード)の対数の逆フーリエ変換
↓
こうしておけば、音声の声道要素と音源要素を分離可
音声 = 声道の共振周波数 * 声帯の開閉(振動)周波数
<スペクトル包絡>
<微細構造>
(ありがたさ)⇒低ケフレンシー部
と 高ケフレンシー部に分離可
発話時
(万人に共通の特徴)
(個人に依存する特徴)
* : 畳み込み(Convolusion)
ケプストラムを求めるまでの
ソフトでの具体的な計算過程は?
1) 音声区間の検出
(波形の上り区間と下げ区間で
Latchを2段階いれて
(Latch間時間距離が300ms前後)
励起・非励起の保存性をチェック)
2) サンプル値に1 - az
-1
(0.93 <=
a <= 0.97)
の差分フィルターをかませ、音声区間内に
おいて、音声を聴覚とSensitivityを同期させ
るために、高域強調する。
3) 標本化定理を満たすサンプリング周波数
の音声のサンプル値に対して30~50ms
ごとに、10msずつにオーバーラップさせ
ながら、フレームを作る。
(まとめるサンプリング数=2^n (n:整数))
4) ハミングウィンドーを上記関数にかける
WH(n)=0.54-0.46COS(2nπ/(N-1))
フレーム周期
フレーム長
※ 理想のシフトレシオは
30~40%程度
5) フレーム時間内での自己相関係数の算出
N-1-|m|
φ(m) = Σx(n)x(n+|m|)
n=0
(|m| = 0,1,,,,N-1)
6) PARCOR(偏自己相関)分析
5)の係数を使って、フレーム範囲内での
PARCOR係数(前向き予測残差と後ろ向き
予測残差との相関係数)を希望n次数分出す
副産物とし、線形予測係数(αn)も算出する
7) LPCケプストラムの前記n次数分の算出
c1 = -α1
n-1
cn = -αn-Σ(1-(m/n))αm cn-m
(1 < n ≦ p)
m=1
p
cn = -Σ(1-(m/n))αm cn-m
m=1
(p ≦n)
但し、5)、6)、7)は
・ 4)で出来た関数に関して
FFT(高速フーリエ変換)をしてやって、
・ その後振幅スペクトルの対数化
・ メル尺度変換
ωm = log2(1+ω/1000)
ω:周波数
・ さらに高調波成分を取り除くために
DCT(離散的COS変換)する
方法もある。
ケプストラムのArrangeの理想系は?
20~30次のベクトルに。
少なくともΔケプストラムは入れる。
(例) 10次 : ケプストラム
10次 : Δケプストラム
10次 : ΔΔケプストラム
}
同一ベクトルに組み込む
cf. δCn(t)/δt = ΔCn(t)
K
K
k=-K
k=-K
= Σkcn(t+k) / Σ(k^2)
※ 微係数と言うよりは
前後のフレームも動員
しての平滑化の概念
ΔΔの場合は
Cn→ΔCnに置き換え
ケプストラムのコードブックへの
保存は?
コードブックとは ⇒ 選ばれる代表点が
入れられる符号帳
量子化
⇒ 代表選手だけ入れること
要はどのレベルに入って
来るかのまとめ分けの作業
量子化の方法 ⇒ HMMでは少しでもメモリを
稼ぎたいので、スカラ量子
化を使わず、ベクトル量子化
モデルの
パラメータはどう確定するか?
モデルごとに各aijとbj(k)は
どう確定するのか?
↓
状態遷移系列が非観測であるから
推定せざるを得ない
(最尤推定が効かず)
パラメータ推定のお膳立て・定義
観測シンボルytを
yt={y1, y2, , , yT}とする
(N個の連続ベクトル)
N
Sj+1
Sj
Sj-1
※ πi : 飛んで来れるか
来れないかを示す
初期確率 (0 or 1)
パラメータセット{ΠP(y
t |πi,aij, bij(k)}
t=1
を最大化するパラメータセットを求める
時刻t=1か 今からt=Tま
ら今までに起 でに起こるだ
こった過去 ろう未来
今、自分が立っている状態Sから眺
めて、過去と未来に一体何が起こっ
たかを考え、漸化式を立ててみよう
S
その漸化式とは?(3つ)
・フォワード変数: 時刻tに観測シンボルytを出力し、
(前(過去)向き)
状態qiにある確率
α(i,t) = πi
(t=0)
= Σα(j,t-1)ajibji(yt)
(t=1,2,,,T)
j
・バックワード変数: 時刻tに状態qiにあって、 以降
(後ろ(未来)向き)
観測シンボルyt+1を出力する確率
β(i,t) = Σaijbij(yt)β(j,t+1)
(t=T-1,,,2,1)
j
※Σj とは状態1から今の状態Sの次の状態までの、または状態Sから最後の状態Sl
までのどんなパスを通ったかはDon’t careのSummation。iも状態1から最後の
状態までのパス問わずの何処かの状態(1からSまでかSからSlまでを指す
・生起確率の期待値: HMMのモデルMがyiTを
出力する場合に、時刻tに
状態qiからqjに遷移し出力yt
を出力する確率
γ(i,j,t) =
Σα(j,t-1)ajibji(yt)β(j,t+1)
j
---式(A)
P(yT|M)
注) 本来、このγ(i,j,t)はα(i,t)Xβ(i,t) / P(yT|M) より
γ(i,j,t) =
Σα(j,t-1)(aji^2)(bji(yt)^2)β(j,t+1)
j
P(yT|M)
であるが、上記(A)式でも各パス間における状態遷移確率
×出力確率の大小関係のバランスが崩れないので問題ない
aijとbij(k)の最推定の式は?
Σγ(i,j,1)
π^i =
j
ΣΣγ(i,j,1)
i
j
T
Σα(i,t-1)aijbij(yt)β(j,t)
a^ij =
t=1
Σα(i,t)β(i,t)
t
b^ij(k) =
Σt,ytγ(i,j,t)
=k
Σγ(i,j,t)
t
Σγ(i,j,t)
t
=
ΣΣγ(i,j,t)
t
j
実際はまだ確定していない
パラメータをどう推定するのか?
- 最初はパラメーターに適当な値を仮に入れる
==> 例えば
・ aijを遷移パス数で
等分割り
・ bij(yt)も量子化可能性で
等分割り
- あとはaijと bij(yt)を少しずつ変えて何回も
計算を廻してγに対する時間での総積の
最高点への収束を待つだけ
どう言うループで回す
A) 全ての学習サンプルに対して、
α(i,t)とβ(i,t)より
まだ推定段階での状態遷移確率
a^ijと出力確率b^ij(k)を計算
B) 生起確率γ(i,j,t)を求める
C) A),B)を繰り返し、生起確率の
一番大きかったものに関する
aij、bij(k)を実際のaij、bij(k)に決める
実発話語彙からのサンプリング
値(振幅)の引きこみルーチン
for (j=0;j<331010;j++)
{
/* Start Search for Utterance 44.1kHzデータに対して*/
/* 3秒以内の発話の単語・短文・音素を捉える
*/
ThreshH1 = *((char*)pPlaybackBuffer+j);
fputc(ThreshH1,fi);
Samp[j] = ThreshH1
/* For Noise Subtruction '2002.Jan.20th */
a[j] = Samp[j];
if (ThreshH1 > 0)
/* 電圧的に-側の信号も+側におり返し*/
ThreshH1=128-ThreshH1;
else
ThreshH1=(ThreshH1+128);
/* 実データの部分はX’80’を中心に入って
いるので、絶対値として実振幅に補正してやる */
}
close(fi);
/* (録音したければの話だが)Wave Fileでの取りこみ終了 */
HMM各ルーチン(ケプストラムを
求めるまで)
HMMVRange(*Samp, StV, EnV);
HMMPreEn;
HMMFrameWinSft;
if (Cep == LPC)
{
HMMSelfC;
HMMPARCOR;
HMMLPCCep;
}
else
{
HMMFFT;
HMMLog;
HMMMelBandFilter;
HMMDCT;
HMMIFFT;
}
/* 発話区間確定
In : Samp[i] Out : StV, EnV
*/
/* 高域強調
In : StV,EnV Out : DF[i]
*/
/* ハミング窓で窓かけして、フレーム周期10ms、フレーム
長30msのフレームを作る
In: DF[i]
Out : Overwrapped Windowed Frame */
/* 出力としてLPCケプストラムを計算?
*/
/* Yes, LPCケプストラムで
*/
/* 自己相関関数算出
*/
/* 偏自己相関分析
*/
/* 出て来た線形予測係数を使い、ケプストラム算出 */
/* No, FFTケプストラムで
*/
/* FFT
*/
/* 振幅スペクトルを対数化する
*/
/* fを聴覚に合せるためメルスケール帯域フィルタ通す*/
/* 高調波成分を取り除くため離散余弦変換 */
/* 逆高速フーリエ変換
*/
HMM各ルーチン(学習・運用)
/** Learning (学習) **/
for (n=1,n<=ModelNo;n++)
/* モデルの数で廻す */
for (l=1;l=LearnNo;l++)
/* 学習回数で廻す */
{
Iteration:;
HMMaijjjySet
/* 適当な仮のaijbj(yt)をセット */
HMMReEstAlpha;
/* 後ろ(過去)向き関数を求める */
HMMReEstBeta;
/* 前(未来)向き関数を求める */
HMMReEstGamma; /* モデルの確からしさの期待値としてγを求める */
if (Gamma == Max)
/* γは最高値としてサチった? */
break;
/* Yes, aijとbj(yt)を固定化させて止めよう*/
else
/* No, aijとbj(yt)を少しずらして再推定に */
HMMReadjustaijbjyt;goto Iteration;
}
/** Recognizing (実際の認識の運用) **/
for (n=1,n<=ModelNo;n++)
HMMCompPath;
/* モデル毎に通り得る全部のパスの総体確率を求める */
HMMJudge
/* モデル間での勝ち馬(最尤度の語彙)を求める */
HMMは業界でよく使われる
認識手法と言っても、絶対か?
HMMは不特定話者認識においても安定している
但し...
とにかく、学習時、運用(認識)時とも
膨大なメモリと学習の労力を要する
⇒ CodeのHandlability、小メモリ化、運用
の小回り性、等から、HMMよりも認識率
を落とさないAlternative(代替法)も
求められる