0

所以基本上我有一个以每秒 29.97 帧的速度录制的视频剪辑。
它包含以 44100 Hz 频率录制的语音。

每帧包含 1/29.97 = 0.0333667 秒的音频,转换为每帧 1471.47147 个音频样本。

我提取语音并使用以下参数生成对数梅尔频谱图:

  • 窗口长度:1472 个样本。
  • 跳跃长度:736 个样本。
  • N_Mels = 80

由于我只能对这些参数使用非负值,因此我每秒有大约15.84个样本的错位((1472-1471.47147)*29.97)

由于我实验的性质,我需要我的音频尽可能接近视频帧同步。我能想到的一个快速解决方案是丢弃最后几个视频帧(通常是 1-10 个,因为它们最终由于未对齐而没有音频信息)。显然这不是理想的,所以我很想就如何最好地对抗错位提出一些建议或建议。我还在下面附上了我当前的代码:

import cv2
os.chdir(dir)
cap = cv2.VideoCapture("0.mp4")
length = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
print( length )

os.chdir(dirHome)

signal, sr = librosa.load("0.wav", sr=None, mono=True)
print(signal.shape)

#librosa.display.waveplot(scale, sr=sr);

n_fft = 1472
hop_length = 736
print(sr)

 #1 frame = 1/29.97 * 44100 = 1471.47147 samples => windowsize=1472, overlap=736, (mis-align = 15.84 sample / 1s)


mel_spectrogram = librosa.feature.melspectrogram(signal, sr=sr, n_fft=n_fft, hop_length=hop_length, n_mels=80)
log_mel_spectrogram = librosa.power_to_db(mel_spectrogram)

print(log_mel_spectrogram.shape)
print(mel_spectrogram.shape)

import matplotlib.pyplot as plt
fig, ax = plt.subplots()
S_dB = librosa.power_to_db(mel_spectrogram, ref=np.max)
img = librosa.display.specshow(S_dB, x_axis='time',
                         y_axis='mel', sr=sr,
                         ax=ax, hop_length=hop_length)
fig.colorbar(img, ax=ax, format='%+2.0f dB')
ax.set(title='Mel-frequency spectrogram')
plt.show()
4

0 回答 0