2

私はMatlabを初めて使用し、単純な周波数ベースの音声検出アルゴリズムを作成しようとしています。最終的な目標は、wav ファイルでスクリプトを実行し、各音声セグメントの開始/終了時間を出力させることです。コードを使用する場合:

fr = 128;
[ audio, fs, nbits ] = wavread(audioPath);
spectrogram(audio,fr,120,fr,fs,'yaxis')

次のような有用な周波数強度対時間グラフを取得します。

ここに画像の説明を入力

それを見ると、発話がいつ発生するかが非常に簡単にわかります。各 x 軸フレームを見て、どの周波数が優勢な (強度が最も高い) かを判断し、優勢な周波数が十分に特定の強度しきい値 (グラフの黄色と赤の違い)、そのフレームを音声または非音声としてラベル付けします。フレームにラベルが付けられると、各音声セグメントの開始/終了時間を簡単に取得できます。

私の問題は、そのデータにアクセスする方法がわからないことです。コードを使用できます:

[S,F,T,P] = spectrogram(audio,fr,120,fr,fs);

スペクトログラムのすべての機能を取得しますが、そのコードの結果は私には意味がありません. S、F、T、P 配列と行列の境界は、グラフに表示されるものとは相関しません。ヘルプ ファイルと API を調べましたが、アルゴリズムの名前と頭字語が飛び交うと混乱します。私の DSP のバックグラウンドはかなり限られています。

このスペクトログラム分析の各フレームの周波数強度値の配列を取得するにはどうすればよいですか? そこから残りを理解できます。適切なデータを取得する方法を知る必要があるだけです。

4

4 に答える 4

2

あなたがやろうとしていることは、発話活動検出と呼ばれます。これには多くのアプローチがありますが、最も単純なのは単純なバンドパス フィルターで、音声が最も強い周波数 (1kHz から 8kHz の間) を通過させます。次に、総信号エネルギーをバンドパス制限と比較し、エネルギーの大部分が音声帯域にある場合は、フレームを音声として分類します。それは 1 つのオプションですが、他にもあります。

ピークの周波数を取得するには、FFT を使用してスペクトルを取得してから、peakdetect.mを使用します。しかし、ベース サインの高調波周波数に属する多くのピークが得られるため、これは非常に単純なアプローチです。

理論的には、ある種のケプストラム (スペクトルのスペクトルとも呼ばれます) を使用する必要があります。これは、スペクトル内の高調波の周期性を基本周波数に減らし、それをピーク検出で使用します。または、praatなど、それを行う既存のツールを使用することもできます。

音声分析は通常、約 30 ミリ秒のフレームで 10 ミリ秒単位で実行されることに注意してください。N 連続フレームでフォルマントが確実に検出されるようにすることで、誤検出をさらに除外できます。

于 2013-06-09T09:08:15.757 に答える
0

組み込みの STFT 関数をまだ使用している場合は、次のコマンドを使用して最大値をプロットできます

plot(T,(floor(abs(max(S,[],1)))))
于 2014-11-14T23:07:25.827 に答える