3

非常に些細なことに大きな問題を抱えているようです。

目標: 2 つの Wav ファイルを比較して、一方 (小さいファイル) がもう一方 (大きいファイル) の一部であるかどうかを確認してください。

テスト: まず、1 分間のオーディオを取り、30 秒間を別のファイルにエクスポートしました。最初に単純に byte[] データを読み込んでログで確認しようとしましたが、両方が同じソース ファイルからのものであるにもかかわらず、相関関係はまったくありませんか? 次に、WavFile や MusicG などのライブラリを使用してみましたが、2 つの「指紋」または 2 つのファイルから出力される生の byte[] データの間に相関関係がまったく見られないのですか?

質問:これら 2 つの Wav ファイルの類似点を分析する最も簡単な方法は何ですか? それらが同じソースオーディオファイルからのものである場合、バイト単位で同一である必要があることを読みました。したがって、それぞれのサンプルを取り、それらは同じである必要がありますか? それは起こっていることではありませんか?

今、私はすでにこの問題をかなり検索しましたが、ほとんどすべての回答が 25 ~ 50% しか完了していないため、どこかに大きなセグメントが欠けているように感じます。

あなたが提供できる解決策をありがとう!

[編集]ソース オーディオ ファイルはわずか 1 分間の Wav ファイルです... 最初の 30 秒を抽出して小さいファイルを作成しました。次に、ショート (30 秒) とロング (1 分) を比較します。どちらも Audacity から 1141kbps、16bit、Wav でエクスポートしました。これは、フォーマットの問題を回避しようとするものでした...私は思った

コードについては、この未回答の質問を見てください: Wav 比較、同じファイル

4

1 に答える 1

3

ここで奇妙なことが起こっています。詳細には触れずに、一部のプログラムが「抽出」と呼んでいるような単純な操作を実行する場合、正確なコピーを作成していないことだけを述べておきます。たとえば、libsndfile は、int サウンド ファイルから float (Audacity が内部で使用するもの) に変換するときに透過的に変換しません。Audacity が libsndfile を使用している場合 (使用していると確信しています)、ファイルの透過的なコピーが作成されないため、この方法は機能しません。例: 以下を試してください: wav ファイルを開き、同じパラメータを使用してエクスポートします。diff を使用して、入力と出力を比較します。おそらく、それらは異なるでしょう。詳細については、こちらをご覧ください: http://blog.bjornroche.com/2009/12/int-float-int-its-jungle-out-there.html

libsndfile の作成者は、ここで設計上の決定を弁護します: http://www.mega-nerd.com/libsndfile/FAQ.html#Q010

別のアプリを試すこともできますが、人々が大胆さを使用している場合でも、これが機能することを望んでいると思います.

コメントの 1 つは、相互相関を示唆していました。音声フィンガープリンティングを使用することもできます。ただし、これらのソリューションはどちらもやや複雑です。

おそらく最も簡単な解決策は、データをネイティブ形式で読み取ることです。たとえば、ファイルが 16 ビットの場合、バイトではなく 16 ビットの整数を読み取ります。次に、それを短いものと比較しますが、いくつかのエラーを許容して比較します(頭の中で、1つ以上ずれてはいけないと確信していますが、それは大胆さを通過するたびにです)。したがって、「これらの値は等しいか」と尋ねる代わりに、「これらの値は互いにイプシロン内にあるか」と尋ねる必要があります。もちろん、無音部分が多いものについては、ある種の例外を作りたいと思うでしょう。

audacity がディザを使用している可能性もあるので、それがオフになっていることを確認してください。ディザは重大なノイズを追加する可能性があるため、それを方程式に使用したい場合は、別のソリューションが必要になります。

于 2012-08-05T01:28:40.727 に答える