3

まず、私がやろうとしていることを大まかに述べ、アドバイスを求めます。次に、現在のアプローチを説明し、現在の問題に対する回答を求めます。


問題

話している人の MP3 ファイルがあります。文またはフレーズにほぼ対応するセグメントに分割したいと思います。(手動で行いますが、何時間ものデータについて話しているのです。)

これをプログラム的に、または既存のユーティリティで行う方法についてアドバイスがあれば、ぜひ聞かせてください。(私は音声アクティビティ検出を認識しており、少し調べましたが、自由に利用できるユーティリティは見当たりませんでした。)


現在のアプローチ

最も簡単な方法は、一定の間隔で MP3 をスキャンし、平均音量があるしきい値を下回っている場所を特定することだと思いました。次に、既存のユーティリティを使用して、それらの場所で mp3 をカットします。

私は pymad をいじっていましたが、mp3 の各フレームの PCM (パルス符号変調) データを正常に抽出できたと思います。PCM データが相対ボリュームにどのように変換されるかについて頭を悩ませているように見えないため、今は行き詰まっています。複数のチャネル、ビッグエンディアンとリトルエンディアンなど、他の複雑な要因についても認識しています。

pcm サンプルのグループを相対ボリュームにマッピングする方法に関するアドバイスが重要です。

ありがとう!

4

3 に答える 3

3

PCM は、サウンドのタイム フレーム ベースのエンコードです。時間枠ごとに、ピーク レベルが得られます。(これに対する物理的な参照が必要な場合: ピーク レベルは、マイク メンブレンがその特定の時間に静止位置から移動した距離に対応します。) PCM は 8 ビット サンプルに符号なしの値を使用できることを忘れて、符号付きに注目します。値。値が > 0 の場合、メンブレンは静止位置の片側にあり、< 0 の場合は反対側にありました。安静時からの脱臼が大きいほど(どちら側でも)、音は大きくなります。

ほとんどの音声分類方法は、1 つの非常に単純なステップから始まります。ピーク レベルをしきい値レベルと比較します。ピーク レベルがしきい値を下回る場合、その音はバックグラウンド ノイズと見なされます。Audacity の Silence Finder のパラメータを見ると、silence levelそのしきい値になっているはずです。次のパラメーター はMinimum silence duration、明らかに、休憩 (またはあなたの場合は文の終わり) をマークするために必要な無音期間の長さです。

同様のツールを自分でコーディングしたい場合は、次のアプローチをお勧めします。

  1. サウンド サンプルを特定の長さの個別のセットに分割します。1/10、1/20、または 1/100 秒から始めます。
  2. これらのセットのそれぞれについて、最大ピーク レベルを計算します。
  3. この最大ピークをしきい値 ( silence levelAudacity 内) と比較します。しきい値は、サウンド サンプルの詳細 (ラウドネス、バックグラウンド ノイズなど) に基づいて、自分で決定する必要があるものです。最大ピークがしきい値を下回る場合、このセットは無音です。
  4. 次に、分類された一連のセットを分析します。録音の無音の長さを計算します。(長さ = サイレント セットの数 * セットの長さ)。より上にMinimum silence durationある場合は、ここに文の終わりがあると想定します。

Audacity を使い続けるのではなく、これを自分でコーディングする主なポイントは、高度な分析方法を使用して分類を改善できることです。適用できる非常に単純な測定基準の 1 つはゼロ クロッシング レートと呼ばれ、指定されたピーク レベルのセットで符号が切り替わる頻度 (つまり、値が 0 ラインを横切る) をカウントするだけです。他にもたくさんあり、どれもより複雑ですが、努力する価値があるかもしれません。たとえば、離散コサイン変換を見てください...

于 2010-06-24T20:02:17.140 に答える
0

これを更新したかっただけです。私は Audacity の Silence Finder を使用してある程度の成功を収めています。しかし、私はまだこの問題に興味があります。ありがとう。

于 2010-04-13T03:39:24.530 に答える
-1

PCM は、正弦波をエンコードする方法です。これは一連のビットとしてエンコードされます。ビットの 1 つ (1、私は推測します) は関数の増加を示し、0 は減少を示します。この関数は、1 と 0 を交互に繰り返すことでほぼ一定に保つことができます。

振幅を推定するには、sin 波をプロットし、x 軸で正規化します。次に、さまざまなポイントでの正弦波の振幅を推定できるはずです。それができたら、振幅が低いスポットを見つけられるはずです。

フーリエ変換を使用して、信号が最も異なる場所を推定することもできます。

于 2010-04-13T00:57:31.083 に答える