在Python中自动同步两个音频录音

9 投票
3 回答
8972 浏览
提问于 2025-04-18 17:52

我想用我的摄像机录制高质量的视频,但摄像机自带的麦克风录出来的音质不太好。与此同时,我想用一个音质更好的设备来录音。

然后,我希望能自动把外部录音和视频的声音对齐,让它们听起来一致。

我觉得这跟检测节拍有点像,但简单一些,因为不需要找出重复的部分,只需要把音频通道叠加在一起,看看哪里最匹配,或者检测某个特定的“同步声音”事件。

我比较喜欢用Python编程,如果有相关的Python代码或者可以作为起点的建议,我会非常感激。

更新:我找到了一款Python应用,还有一个配套的Android拍板,这可能能解决我的问题。它似乎是通过同步在视频文件和外部音频文件中都录到的特定声音来工作的。

更新二:还有一个Python项目,是用来同步在同一场音乐会录制的YouTube视频的。

3 个回答

1

因为没有找到可以同步视频和音频录制开始时间的工具,看到越来越多类似的问题,我决定自己做一个工具:syncstart。现在这个工具已经在githubpypi上发布了。

1

我用了这个文档,结果对我有效:

http://www.dsg-bielefeld.de/dsg_wp/wp-content/uploads/2014/10/video_syncing_fun.pdf

praat_command = '{} {} {} {}'.format(
    praat, praat_script, sound, sound_studio)
sound_offset_time = check_output(
    praat_command, shell=True).decode("utf-16")

这是一个Praat脚本:

form Cross Correlate two Sounds
    sentence input_sound_1
    sentence input_sound_2
    real start_time 0
    real end_time 30
endform

Open long sound file... 'input_sound_1$'
Extract part: 0, 30, "no"
Extract one channel... 1
sound1 = selected("Sound")
Open long sound file... 'input_sound_2$'
Extract part: 0, 30, "no"
Extract one channel... 1
sound2 = selected("Sound")

select sound1
plus sound2
Cross-correlate: "peak 0.99", "zero"
offset = Get time of maximum: 0,0, "Sinc70"

writeInfoLine: 'offset'
6

我现在测试了Allison Deal的Video sync(在问题的“更新 II”部分也有链接),看起来它能完成任务。

在这个项目的根目录下,有一个叫“alignment_by_row_channels.py”的文件。如果你在这个文件的最后部分把测试代码注释掉,它可以处理两个mp4视频,并打印出这两个视频音频之间的时间偏差。

我用佳能HF200摄像机和LG G2安卓手机进行了测试,录制了说话和打响指的声音,摄像机的音量非常低。然后我用Audacity手动分析了音轨。

alignment_by_row_channels.py脚本显示两个音轨之间的偏差是15.1893秒。我通过查看波形进行的手动分析得出的结果是15.181秒(Audacity默认情况下不会输出低于毫秒的分辨率)。

这个差异只有大约8.3毫秒,这似乎表明“alignment_by_row_channels.py”确实能完成任务。

(注意,这个git仓库文件比较大,可能是因为删除了很多大文件)

撰写回答