我有两个音轨,从两个视频中提取出来。
除了一些不同之处外,它们听起来几乎都是一样的。
我想知道是否有任何解决办法可以使这两条轨道相一致。
这就是我迄今为止尝试过的:
发布于 2020-05-29 09:37:41
发布于 2020-05-27 18:02:58
我会努力消除每一个场景之间的沉默差距,从两个音频,这样你就只剩下一对干净的音频剪辑清单为每个场景。
然后我会重新创建两个音频信号。伸展的信号在每个场景之间都会有一个恒定的长度间隔。原始(非拉伸)信号在场景之间会有可变的间隙,等于[length of constant gap] + [length of stretched scene - length of normal scene]。这将使每一个场景都在同一时间开始。
如果场景之间的间隙将音频信号降到一个完全零的水平,那么检测和消除这些空白应该是微不足道的。
否则,这可能是有点棘手(通常有一些直流偏移和/或一些背景噪声信号,使它有点难以检测“沉默”从时域波表示)。我以前成功地使用了声能计算,精确地检测音频信号的开始/结束位置。这意味着沿音频滑动傅里叶变换(确保使用带有Hann或Hamming窗口的锥形变换)。一旦获得转换结果,就可以通过执行以下计算来计算能量:
E = Sum(r[x]*r[x] + i[x]*i[x])其中x从0到傅里叶变换/2-1的长度,r代表每个结果bin的实部,i表示每个结果bin的虚部。
这种计算是在沿着音频滑动傅里叶变换的同时重复执行的,同时记录沿途的能量。通过适当的阈值处理,很可能成功地分离出每个场景的音频部分.
傅里叶变换的长度可以很小(可能在64-256的范围内就足够了,因为你不想要一个很好的频率分辨率,只是对某个时间点上的总能量的估计)。
下面是一个锥形傅里叶变换调用(使用fftw3库)计算频带范围内能量的例子:
double EnergyAnalyzer::GetEnergy(array<double>^ audioFrame, Int32 startIndex) {
if( startIndex + FrameSize > audioFrame->Length ) {
throw gcnew ArgumentException("The value of startIndex would overflow the array's boundary", "startIndex");
}
// Prepare input to the fourier transform. The signal is tapered using a Hann window
for( int i = 0; i < FrameSize; i++ ) {
_pIn[i] = audioFrame[startIndex + i] * _hann[i];
}
fftw_execute(_fftPlan);
double energy = 0.0;
for( int i = _binStart; i <= _binStop; i++ ) {
energy += _pOut[i][0] * _pOut[i][0] + _pOut[i][1] * _pOut[i][1];
}
return energy;
}https://stackoverflow.com/questions/62047916
复制相似问题