3. 常见操作接下来,我们来聊聊 pydub 常见的操作 3-1 AudioSegment 对象 pudub 最重要的一个类是:AudioSegment 它是一个不可变的对象,代表一个音频段对象
首先,我们实例化一个 AudioSegment 对象,它内置有多种实现方式
比如,我们从本地加载一个 wav 的音频文件
from pydub import AudioSegment
# 音频路径 audio_path = "./raw/1.wav"
# 指定音频格式,这里以wav音频为例 format='wav'
# 实例化一个AudioSegment对象 audio_segment = AudioSegment.from_file(audio_path, format)
3-2 裁剪某段音频 针对 AudioSegment 对象,使用中括号指定开始时间和结束时间,即可以快速提取某一段音频 PS:时间以毫秒为单位 # 某一段音频文件 # 指定开始时间、结束时间 # 时间以毫秒为单位 audio_part = audio_segment[start_time:end_time]
3-3 合并音频 使用 pydub 合并多段音频非常便捷,只需要使用符号 +,将三段音频的 AudioSegment 对象加起来即可
def sound_compound(one_audio_segment, *other): """ 合并两段音频 :param one_audio_segment: :param other_audio_segment: :return: """ result = one_audio_segment
# 使用符号+,一段一段合并 for segment in other: result += segment return result
# 合并3段音频 audio_segment1 = AudioSegment.from_file('./1.wav', 'wav') audio_segment2 = AudioSegment.from_file('./2.wav', 'wav') audio_segment3 = AudioSegment.from_file('./3.wav', 'wav')
# 合并3段音频文件 audio_segment_result = sound_compound(audio_segment1, audio_segment2, audio_segment3) 3-4 音频常见属性 音频比较常见的属性包含: 对于音频的时长,有 2 种获取方式,即: # 音频常见属性 # 实例化AudioSegment对象 as = AudioSegment.from_file("sound1.wav")
# duration_seconds:在内部调用了 len() ,单位为秒 # 方式一,duration_seconds,以秒为单位 as_duration1 = as.duration_seconds
# 方式二:len(as),以毫秒为单位 as_duration2 = (len(as) / 1000.0)
其他原始数据都可以从 AudioSegment 对象相应的属性中获取 :
# 音频常见属性 # 实例化AudioSegment对象 as = AudioSegment.from_file("sound1.wav")
# 2、音频响度 as_loudness = as.dBFS
# 3、声道数 as_channel_num = as.channels
# 4、帧速率 # 一般值为 44100 (CD), 48000 (DVD), 22050, 24000, 12000 和 11025 as_frame_rate = sound.frame_rate
# 5、音频的原始数据 as_raw_data = sound.raw_data
3-5 单条音频淡入淡出 视频剪辑中,经常需要对音频做淡入淡出处理,使音效播放更加自然 比如:针对单个音频,在开头使用淡入,结束使用淡出,并指定淡入和淡出的时间 PS:单位以毫秒为单位 def sound_fade_in_and_out(one_audio_segment, fade_in=0, fade_out=0): """ 单段音频设置开头淡入、结尾淡出 可以把许多运算符连成一串使用,因为运算符都会返回一个AudioSegment对象 :param one_audio_segment: :param fade_in:淡入时间(毫秒) :param fade_out:淡出时间(毫秒) :return: """ return one_audio_segment.fade_in(fade_in).fade_out(fade_out)
audio_segment = AudioSegment.from_file("./raw/1.wav", format='wav')
# 单条视频开头淡入,结束淡出 sound_fade_in_and_out(audio_segment,2000,2000)
需要指出的是,AudioSegment 对象内置的 fade() 函数,可以更加灵活地实现淡入淡出效果
sound = AudioSegment.from_file("./sound.wav")
# fade实现淡入/淡出效果 # 1、从1s开始,持续2s,执行淡化效果,并从0dB逐渐增加到3dB sound_fade1 = sound.fade(to_gain=+3.0, start=1000, duration=2000)
# 2、从1s开始,一直到4s,中间1s的时间内执行淡化效果,从0db逐渐降低-2dB sound_fade2 = sound1.fade(to_gain=-2, start=1000, end=4000)
3-6 调整音频播放速度 视频剪辑中,音频速度的调整很常见 比如:在视频结尾,调整最后的画面帧为慢动作,同样需要同步调慢音频的播放速度 def speed_change(sound, speed=1.0): """ 改变音频的速度 :param sound: :param speed: :return: """ sound_with_altered_frame_rate = sound._spawn(sound.raw_data, overrides={ "frame_rate": int(sound.frame_rate * speed) }) return sound_with_altered_frame_rate.set_frame_rate(sound.frame_rate)
# 改变音频的播放速度 # 比如:0.8调整为之前速度的0.8 audio_new = speed_change(self.audio_segment, 0.8)
3-7 播放音频 AudioSegment 对象使用 pydub 内置的 play() 方法,可以播放音频,在调试代码的时候非常方便from pydub.playback import play
sound1 = AudioSegment.from_file("./1.wav")
# 播放音频 play(sound1)
3-8 音量增益及降低 要调整一段音频的音量,可以直接对 AudioSegment 实例加、减对应的分贝数目即可def sound_gain(audio_segment, db_value): """ 声音增益 :param audio_segment: :param db_value 分贝 :return: """ return audio_segment + db_value
def sound_reduce(audio_segment, db_value): """ 降低音量 :param audio_segment: :param db_value 分贝 :return: """ return audio_segment - db_value
# 降低音量,-10分贝 audio_segment_temp = sound_reduce(audio_segment, 10)
# 增加音量,+10分贝 audio_segment_temp1 = sound_gain(audio_segment, 10)
3-9 交叉淡化效果 使用 append() 方法,可以将多段音频对象进行合并,并添加交叉淡化的效果PS:使用 crossfade 参数指定交叉淡化的持续时间,单位为毫秒def sound_overlap_effect(one_audio_segment, other_audio_segment, overlap_during): """ 两段音频合并的同时,使用交叉淡化的效果 :param one_audio_segment:第一段 :param other_audio_segment:第二段 :param overlap_during:单位毫秒 :return: """ return one_audio_segment.append(other_audio_segment, crossfade=overlap_during)
# 两段音频 audio_segment1 = AudioSegment.from_file('./1.wav', 'wav') audio_segment2 = AudioSegment.from_file('./2.wav', 'wav')
# 合并两段音频,并添加效果 # 持续时间:2000毫秒 result = sound_overlap_effect(audio_segment1, audio_segment2, 2000)
3-10 多声道音频 利用 from_mono_audiosegments() 函数,可以一个轨道上创建多声道音频 def create_multichannel_as(self): """ 创建多声道音频(支持2个或者多个) :return: """ # PS:每个单声道音频段都应该有相同的时长以及帧速率 one_as = AudioSegment.from_wav("./1.wav") other_as = AudioSegment.from_wav("./2.wav")
# 合成多声道音频 return AudioSegment.from_mono_audiosegments(one_as, other_as)
3-11 提取音频及导出音频 在 3-1 中实例化 AudioSegment 方式,方法同样适用于视频,即:我们可以从视频中提取 AudioSegment 音频对象 使用 AudioSegment 对象的 export(filename,format) 方法,就可以将音频保存到本地了 # 1、从视频中提取一个AudioSegment音频对象 audio_segment = AudioSegment.from_file(video)
def save_audio(audio_segment, filename, format): """ 保存音频文件到本地 :param audio_segment: :param filename: :param format: :return: """ audio_segment.export(filename, format=format)
# 2、导出音频到本地 save_audio(result, './result.wav', 'wav') 4. 实战一下对搞笑类短视频,经常会采用这种剪辑手法,即:将视频尾部,对最后一段对话降低速度并重新播放一次 准备一段视频素材,下面通过 pydub 来实现它 video_path = './raw.mp4'
# 注意:加载视频不需要指定format audio_sgement = AudioSegment.from_file(video_path)
# 截取尾部内容 audio_end = audio_sgement[70 * 1000:70 * 1000 + 3000]
# 变慢速度,具体根据视频速度去调整 audio_end2 = speed_change(audio_end, 0.55)
# 合并两段音频 audio_result = audio_end + audio_end2
# 尾部淡出处理 audio_result.fade_out(1000)
# 视频导出 audio_result.export("result.wav", format='wav')
最后生成的音频内容如下: 5. 最后文中仅仅对 pydub 常用的操作进行了讲解,更多骚操作可以阅读官方文档去解锁 音视频的一些常见操作都可以做成自动化,让自己从重复的剪辑工作中抽离出来
|