為了幫助剪輯小姐姐少熬夜,我用 Python 硬肝了一次短視頻音頻創作
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)
其他原始數據都可以從 對象相應的屬性中獲?。?/p>
#?音頻常見屬性
#?實例化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:中獎名單將在交流群公布,可以掃描下方二維碼,備注【交流群】,加入技術交流群!
聲明:本站所有文章資源內容,如無特殊說明或標注,均為采集網絡資源。如若本站內容侵犯了原著者的合法權益,可聯系本站刪除。