14

2 つの異なるマイク (たとえば、WAV 形式) による同じ信号の 2 つのオーディオ録音がありますが、そのうちの 1 つは、たとえば数秒の遅延で録音されます。

これらの信号をある種の波形ビューアーで表示すると、このような遅延を視覚的に簡単に識別できます。つまり、すべての信号で最初に目に見えるピークを見つけて、それらが同じ形状であることを確認するだけです。


(出典:greycat.ru

しかし、プログラムでそれを行うにはどうすればよいですか - この遅延 (t) が何であるかを調べますか? 2 つのデジタル化された信号はわずかに異なります (マイクロフォンが異なる、ADC のセットアップが原因で位置が異なるなど)。

少し調べてみたところ、この問題は通常「時間遅延推定」と呼ばれ、無数のアプローチがあることがわかりました。たとえば、そのうちの1つです

しかし、コマンドライン ユーティリティ、ライブラリ、簡単なアルゴリズムなど、簡単で既製のソリューションはありますか?

結論: 簡単な実装が見つからず、簡単なコマンドライン ユーティリティを自分で実行しました。https ://bitbucket.org/GreyCat/calc-sound-delay (GPLv3 ライセンス) で入手できます。Wikipediaで説明されている非常に単純な最大値検索アルゴリズムを実装しています。

4

3 に答える 3

14

あなたが探しているテクニックは相互相関と呼ばれます。2 つの類似した信号 (信号が同一である必要はありません) 間の時間差 (ラグ) の測定など、さまざまな問題を解決するために使用できる、ある程度計算集約的な手法であれば、これは非常に単純です。

ラグ値 (または少なくとも予想されるラグ値の範囲) について合理的な考えがあれば、計算の総量を大幅に減らすことができます。必要な精度に明確な制限を設けることができる場合も同様です。

于 2011-02-11T09:46:48.290 に答える
1

非常に簡単なことは、ピークがあるしきい値を超えているかどうかを確認することです。ライン A のハイピークとライン B のハイピークの間の時間は、おそらく遅延です。しきい値を少しいじってみてください。グラフが通常、投稿した写真と同じくらい明確であれば、問題ありません。

于 2011-02-11T09:37:45.190 に答える
1

同じ問題があり、ビデオ/オーディオ録音の開始を自動的に同期するツールを見つけることができなかったため、syncstart ( github ) を作成することにしました。

コマンドラインツールです。その背後にある基本的なコードは次のとおりです。

import numpy as np
from scipy import fft
from scipy.io import wavfile
r1,s1 = wavfile.read(in1)
r2,s2 = wavfile.read(in2)
assert r1==r2, "syncstart normalizes using ffmpeg"
fs = r1
ls1 = len(s1)
ls2 = len(s2)
padsize = ls1+ls2+1
padsize = 2**(int(np.log(padsize)/np.log(2))+1)
s1pad = np.zeros(padsize)
s1pad[:ls1] = s1
s2pad = np.zeros(padsize)
s2pad[:ls2] = s2
corr = fft.ifft(fft.fft(s1pad)*np.conj(fft.fft(s2pad)))
ca = np.absolute(corr)
xmax = np.argmax(ca)
if xmax > padsize // 2:
    file,offset = in2,(padsize-xmax)/fs
else:
    file,offset = in1,xmax/fs
于 2021-02-19T22:36:11.990 に答える