5

私はインターネットから毎日2分間のラジオ放送を録音しています。開始時と終了時のジングルは常に同じです。ラジオ放送の正確な時間は多かれ少なかれ6分と異なるかもしれないので、私は約15分のラジオを録音しなければなりません。

これらのジングルが15分のレコードにある正確な時間を特定したいので、必要なオーディオの部分を抽出できます。

MP3をPCMデータにデコードし、PCMデータをhttp://www.codeproject.com/KB/audio-video/SoundCatcher.aspxに基づくスペクトログラムに変換するC#アプリケーションを既に開始しました。

PCMデータで相互相関アルゴリズムを使用しようとしましたが、アルゴリズムは10msのステップで約6分と非常に遅く、ジングルの開始時刻が見つからない場合があります。

2つのスペクトログラムを比較して一致させるアルゴリズムのアイデアはありますか?または、そのジングルの開始時間を見つけるためのより良い方法はありますか?

ありがとう、

更新、遅れてすみません

まず、すべての回答者に感謝します。それらのほとんどは、関連性のある、または興味深いアイデアでした。

fonzoが提案したShazamアルゴリズムを実装してみました。しかし、スペクトログラムのピークを検出できませんでした。これは、3つの異なるレコードからの開始ジングルの3つのスペクトログラムです。ブロブフィルターを使用してAForge.NETを試しました(ただし、ピークを特定できませんでした)。画像をぼかし、高さの違いを確認し、ラプラス変換、勾配分析を行って、一連の垂直バーを検出しました(ただし、偽が多すぎました)。ポジティブ)...

その間、私はDaveAaronSmithによって提案されたHoughアルゴリズムを試しました。ここで、各列のRMSを計算します。はいはい各列、それはO(N * M)ですが、M << Nです(列が約8kのサンプルであることに注意してください)。したがって、全体としてはそれほど悪くはありませんが、アルゴリズムには約3分かかりますが、失敗することはありません。

私はその解決策を採用することもできますが、可能であれば、ShazamがO(N)であり、おそらくはるかに高速(そしてより低温)であるため、Shazamを使用することをお勧めします。コメントを追加することで、これらのスペクトログラムで常に同じポイントを検出するアルゴリズム(ピークである必要はありません)を知っている人はいますか?

FFTスタートジングル1

FFTスタートジングル2

FFT Start Jingle 3

新しいアップデート

最後に、上記で説明したアルゴリズムを使用して、Shazamアルゴリズムを実装しようとしましたが、スペクトログラムで適切なピークを見つけることができませんでした。特定されたポイントは、サウンドファイル間で一定ではありません。理論的には、Shazamアルゴリズムはその種の問題の解決策です。Dave Aaron Smithによって提案されたハフアルゴリズムは、より安定していて効果的でした。約400個のファイルを分割しましたが、正しく分割できないのはそのうちの20個だけです。8GBから1GBの場合のディスク容量。

ご協力いただきありがとうございます。

4

4 に答える 4

4

shazamサービス(ノイズの多い短いサンプルが与えられた音楽を識別する)で使用されるアルゴリズムの説明がここにあります:http
://www.ee.columbia.edu/~dpwe/papers/Wang03-shazam.pdf 私から理解されているように、最初に行われることは、スペクトログラムのピークを分離することです(均一なカバレッジを保証するためにいくつかの調整を行います)。これにより、最初のスペクトログラムから値のペア(時間;周波数)の「コンステレーション」が得られます。完了すると、サンプルのコンステレーションは、サンプルの長さのウィンドウを最初から最後まで変換し、相関点の数を数えることによって、フルトラックのコンステレーションと比較されます。
次に、このペーパーでは、膨大な数のトラックのコレクションを使用しても、比較を高速に実行できることがわかった技術的なソリューションについて説明します。

于 2011-04-14T11:29:03.570 に答える
2

ハフ変換を使用できるかどうか疑問に思います。まず、オープニングシーケンスの各ステップをカタログ化します。10ミリ秒のステップを使用し、オープニングシーケンスの長さが50ミリ秒であるとします。各ステップでいくつかのメトリックを計算し、

1 10 1 17 5

次に、オーディオを調べて、同じメトリックについて10ミリ秒の各ステップを分析します。この配列を呼び出すhave_audio

8 10 8 7 5 1 10 1 17 6 2 10...

次に、と同じ長さの新しい空の配列を作成しますhave_audio。それを呼び出しますstart_votes。これには、オープニングシーケンスの開始に対する「投票」が含まれます。1が表示されている場合は、オープニングシーケンスの1番目または3番目のステップにいる可能性があるため、1ステップ前に開始するオープニングシーケンスに1票、3ステップ前に開始するオープニングシーケンスに1票があります。10が表示された場合、2ステップ前に開始したオープニングシーケンスに1票、4ステップ前に17票というようになります。

したがって、その例have_audioでは、次のvotesようになります

2 0 0 1 0 4 0 0 0 0 0 1 ...

ポジション6で多くの票を獲得しているので、オープニングシーケンスがそこから始まる可能性があります。

オープニングシーケンス全体をわざわざ分析しないことで、パフォーマンスを向上させることができます。オープニングシーケンスの長さが10秒の場合、最初の5秒を検索できます。

于 2011-04-13T16:40:53.787 に答える
2

これはまさにこれを行う優れたPythonパッケージです:

https://code.google.com/p/py-astm/

特定のアルゴリズムを探している場合、使用するのに適した検索用語は「音響指紋」または「知覚的ハッシュ」です。

使用できる別のPythonパッケージは次のとおりです。

http://rudd-o.com/new-projects/python-audioprocessing/documentation/manuals/algorithms/butterscotch-signatures

于 2011-04-13T18:55:26.453 に答える
1

ジングルシーケンスをすでに知っている場合は、15分のトラック全体間の相互相関ではなく、シーケンスとの相関を分析できます。

(短い)シーケンスに対する相関をすばやく計算するには、ウィーナーフィルターを使用することをお勧めします。

編集:ウィーナーフィルターは、ノイズのあるシーケンス内の信号を見つける方法です。このアプリケーションでは、「ジングルではない」ものをノイズと見なしています(読者への質問:ノイズが白く、相関していないと仮定できますか?)。

探していたリファレンスが見つかりました!覚えていた数式が少しずれていたので、今すぐ削除します

関連するページはウィーナーデコンボリューションです。h(t)アイデアは、インパルス応答がジングルと同じ波形を持つシステムを定義でき、システムがインパルスを受信した(つまり、ジングルを放出した)ノイズの多いシーケンス内のポイントを特定する必要があるということです。

ジングルは既知であるため、そのパワースペクトルを計算できますH(f)。また、記録されたシーケンスに1つのジングルが現れると想定できるため、未知の入力はパルスの形状をしており、各周波数x(t)でパワー密度が一定であると言えます。 S(f)

上記の知識があれば、式を使用して、ジングルを演奏したときに出力が最も高くなる「ジングルパス」フィルターを取得できます(たとえば、ジングルのような形状の信号のみが通過できます)。

于 2011-04-13T16:00:37.143 に答える