2

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 を使用する方が良いですか?

4

1 に答える 1

2

Q1:うーんをトレーニングするためにmfccデータをどのような形式で渡す必要がありますか?(realSeuqences行によるコメントを参照してください)

MFCCデータは次のように表す必要があります。

List<? extends List<ObservationVector>> sequences

これはデータシーケンスのリストです。各シーケンスは単語サンプルに対応し、ベクトルのリストです。各ベクトルはフレームを表し、13個のMFCC値を含みます。

Q2:音声認識では、同じ単語を10回繰り返すことで、システムをトレーニングする必要がある場合があります。それはそれらの10個のサンプルで1つのうーんを訓練することを意味しますか?

入力データは、各単語のシーケンスのリストです。このリストは一緒に処理されます。

はいの場合、同じサウンドの異なるサンプルで1つのうーんをトレーニングする方法。それとも、別々に訓練された10のうーん、その単語でラベル付けされていますか?

それは1つのHMMです。うーんトレーニングアルゴリズムは、各単語のいくつかのサンプルで機能します。実際には、10を超える非常に多くのサンプルが必要です。

Q3:音認識の観点から2つのhmmモデルを比較する方法。viterbiまたはKullbackLeiblerDistanceを使用する方が良いですか?

ここで「比較」とはどういう意味かははっきりしていません。一方のHMMの状態をもう一方のHMMよりも少なくしたいですか。比較するためにどのプロパティを使用しますか。答えはそれに依存します。

また、音声認識HMMトレーニングには特定の機能があることに注意することが重要です(状態の数を選択する方法、使用する機能、HMMを初期化する方法)。最高のパフォーマンスを得るには、一般的なツールキットではなく、CMUSphinx(http://cmusphinx.sourceforge.net)などの専用ツールキットを使用することをお勧めします。

于 2012-05-30T06:01:30.333 に答える