2. 介紹

是一款簡單、方便且強大的 音頻處理庫

項目地址:

日常音頻剪輯處理工具,都可以使用它來完成,比如:提取音頻、音頻切斷、音效處理、響度控制、聲道配置、音頻合成等

首先,安裝依賴包

#?安裝依賴
pip3?install?pydub

3. 常見操作

接下來,我們來聊聊 常見的操作

3- 對象

最重要的一個類是:

它是一個不可變的對象,代表一個音頻段對象

剪輯視頻后視頻和聲音不同步_剪輯視頻后視頻和聲音不同步_剪輯視頻后視頻和聲音不同步

首先,我們實例化一個 對象,它內置有多種實現方式

比如,我們從本地加載一個 wav 的音頻文件

from?pydub?import?AudioSegment

#?音頻路徑
audio_path?=?"./raw/1.wav"

#?指定音頻格式,這里以wav音頻為例
format='wav'

#?實例化一個AudioSegment對象
audio_segment?=?AudioSegment.from_file(audio_path,?format)

3-2裁剪某段音頻

針對對象,使用中括號指定開始時間和結束時間,即可以快速提取某一段音頻

PS:時間以毫秒為單位

#?某一段音頻文件
#?指定開始時間、結束時間
#?時間以毫秒為單位
audio_part?=?audio_segment[start_time:end_time]

3-3合并音頻

使用 合并多段音頻非常便捷,只需要使用符號+,將三段音頻的對象加起來即可

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對象
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)

需要指出的是, 對象內置的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多聲道音頻

利用nts()函數,可以一個軌道上創建多聲道音頻

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 中實例化 方式,方法同樣適用于視頻,即:我們可以從視頻中提取 音頻對象

使用對象的(,)方法,就可以將音頻保存到本地了

#?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. 實戰一下

對搞笑類短視頻,經常會采用這種剪輯手法,即:將視頻尾部,對最后一段對話降低速度并重新播放一次

準備一段視頻素材,下面通過 來實現它

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. 最后

文中僅僅對 常用的操作進行了講解,更多騷操作可以閱讀官方文檔去解鎖

音視頻的一些常見操作都可以做成自動化,讓自己從重復的剪輯工作中抽離出來

我已經將文中完整源碼文件傳到后臺,關注公眾號,后臺回復「」即可獲得

如果你覺得文章還不錯,請大家點贊、分享、留言下,因為這將是我持續輸出更多優質文章的最強動力!

留言送書

本周贈書:《 圖解機器學習》

內容簡介:本書覆蓋了機器學習領域的監督學習、半監督學習、無監督學習、增強學習和機器學習新算法等內容,構成了機器學習從經典到現代的體系框架,每章也可獨立閱讀。限于篇幅,書中沒有講解 語言的基礎知識,如果讀者沒有 語言的基礎,建議先學習 語言入門知識,這樣可以更好地學習本書內容

PS:中獎名單將在交流群公布,可以掃描下方二維碼,備注【交流群】,加入技術交流群!

剪輯視頻后視頻和聲音不同步_剪輯視頻后視頻和聲音不同步_剪輯視頻后視頻和聲音不同步