mfcc 機能と隠れマルコフ モデルを使用して、Java で音声分類システムを開発しようとしています。私はこの研究論文に従っています: http://acccn.net/cr569/Rstuff/keys/bathSoundMonitoring.pdf .
アルゴリズムは次のように説明されています。
サウンド イベントのサンプルに対応する各サウンド ファイルは、事前に強調され、50% のオーバーラップでハミング ウィンドウ (25 ミリ秒) によってウィンドウ化されたフレームで処理されました。各フレームを特徴付ける 13 次の MFCC で構成される特徴ベクトル。左から右への 6 状態連続密度 HMM を使用して、状態スキップなしで各サウンドをモデル化しました。各 HMM 状態は、2 つのガウス混合成分で構成されていました。モデルの初期化段階が完了した後、すべての HMM モデルが 3 回の反復サイクルでトレーニングされました。
サンプルサウンドからの特徴抽出である最初の部分は既に動作しています。その結果、各行の 13 列で構成される double の 2 次元配列が得られます (各行はサウンドのフレームを表します)。今私の問題は、このデータを使用してうーんを訓練する方法です。
jahmm ライブラリを使用しています。これまで、ライブラリがどのように機能するかを一般的に理解するために、いくつかのサンプル コードを作成しました。
/**Some sample data to act as the mfcc data. Here each line terminated by a new space
* is one observation. I don't know whether each line should be one row from the mfcc values
* (representing one frame) or each line should be representing a set of features from one audio file.
*/
String realSequences = "1.1;2.2;3.3;4.4;5.5;6.6;7.7;8.8;9.9;10.0;11.1;12.2;13.3;\n"
+ "1.1;2.2;3.3;4.4;5.5;6.6;7.7;8.8;9.9;10.0;11.1;12.2;13.3;\n"
+ "1.1;2.2;3.3;4.4;5.5;6.6;7.7;8.8;9.9;10.0;11.1;12.2;13.3;\n"
+ "1.1;2.2;3.3;4.4;5.5;6.6;7.7;8.8;9.9;10.0;11.1;12.2;13.3;\n"
+ "1.1;2.2;3.3;4.4;5.5;6.6;7.7;8.8;9.9;10.0;11.1;12.2;13.3;\n"
+ "1.1;2.2;3.3;4.4;5.5;6.6;7.7;8.8;9.9;10.0;11.1;12.2;13.3;\n"
+ "1.1;2.2;3.3;4.4;5.5;6.6;7.7;8.8;9.9;10.0;11.1;12.2;13.3;\n"
+ "1.1;2.2;3.3;4.4;5.5;6.6;7.7;8.8;9.9;10.0;11.1;12.2;13.3;\n"
+ "1.1;2.2;3.3;4.4;5.5;6.6;7.7;8.8;9.9;10.0;11.1;12.2;13.3;\n"
+ "1.1;2.2;3.3;4.4;5.5;6.6;7.7;8.8;9.9;10.0;11.1;12.2;13.3;\n"
+ "1.1;2.2;3.3;4.4;5.5;6.6;7.7;8.8;9.9;10.0;11.1;12.2;13.3;\n"
+ "1.1;2.2;3.3;4.4;5.5;6.6;7.7;8.8;9.9;10.0;11.1;12.2;13.3;\n"
+ "1.1;2.2;3.3;4.4;5.5;6.6;7.7;8.8;9.9;10.0;11.1;12.2;13.3;\n"
+ "1.1;2.2;3.3;4.4;5.5;6.6;7.7;8.8;9.9;10.0;11.1;12.2;13.3;\n"
+ "1.1;2.2;3.3;4.4;5.5;6.6;7.7;8.8;9.9;10.0;11.1;12.2;13.3;\n"
+ "1.1;2.2;3.3;4.4;5.5;6.6;7.7;8.8;9.9;10.0;11.1;12.2;13.3;\n"
+ "1.1;2.2;3.3;4.4;5.5;6.6;7.7;8.8;9.9;10.0;11.1;12.2;13.3;\n"
+ "1.1;2.2;3.3;4.4;5.5;6.6;7.7;8.8;9.9;10.0;11.1;12.2;13.3;\n"
+ "1.1;2.2;3.3;4.4;5.5;6.6;7.7;8.8;9.9;10.0;11.1;12.2;13.3;\n"
+ "1.1;2.2;3.3;4.4;5.5;6.6;7.7;8.8;9.9;10.0;11.1;12.2;13.3;\n"
+ "1.1;2.2;3.3;4.4;5.5;6.6;7.7;8.8;9.9;10.0;11.1;12.2;13.3;\n";
/**
* This is the reader class that reads the data and puts then in a relevant collection format
*
*/
Reader reader = new StringReader(realSequences);
List<? extends List<ObservationReal>> sequences =
ObservationSequencesReader.readSequences(new ObservationRealReader(), reader);
reader.close();
/**
* As the description states that each state is composed of two Gaussian mixture components.
*/
OpdfGaussianMixtureFactory gMixtureFactory = new OpdfGaussianMixtureFactory(2);
/**
* The manual for jahmm says that KMeans learner is a good way to initialize the hmm. It has 6 states
* and uses the two gaussian mixture models created above.
*/
KMeansLearner<ObservationReal> kml = new KMeansLearner<ObservationReal>(6, gMixtureFactory, sequences);
Hmm<ObservationReal> initHmm = kml.iterate();
/*
* As the papers states the hmm is trained in 3 iterative cycles.
*/
BaumWelchLearner bwl = new BaumWelchLearner();
Hmm<ObservationReal> learntHmm = null;
for (int i = 0; i < 3; i++) {
learntHmm = bwl.iterate(initHmm, sequences);
}
私の質問は次のとおりです。
Q1: hmm をトレーニングするために、mfcc データをどの形式で渡す必要がありますか? (realSeuqences 行のコメントを参照)
Q2: 音声認識では、同じ単語を 10 回繰り返してシステムをトレーニングする必要がある場合があります。それらの 10 個のサンプルでうーん 1 つをトレーニングするということですか? はいの場合、同じ音の異なるサンプルを使用して 1 つのうーんをトレーニングする方法。それとも、10個の個別に訓練されたものですが、その言葉でラベル付けされていますか?
Q3: 音声認識に関して 2 つの hmm モデルを比較する方法。viterbi または Kullback Leibler Distance を使用する方が良いですか?