為了幫助剪輯小姐姐少熬夜,我用 Python 硬肝了一次短視頻音頻創(chuàng)作
2. 介紹
是一款簡(jiǎn)單、方便且強(qiáng)大的 音頻處理庫(kù)
項(xiàng)目地址:
日常音頻剪輯處理工具,都可以使用它來(lái)完成,比如:提取音頻、音頻切斷、音效處理、響度控制、聲道配置、音頻合成等
首先,安裝依賴包
#?安裝依賴
pip3?install?pydub
3. 常見(jiàn)操作
接下來(lái),我們來(lái)聊聊 常見(jiàn)的操作
3- 對(duì)象
最重要的一個(gè)類是:
它是一個(gè)不可變的對(duì)象,代表一個(gè)音頻段對(duì)象
首先,我們實(shí)例化一個(gè) 對(duì)象,它內(nèi)置有多種實(shí)現(xiàn)方式
比如,我們從本地加載一個(gè) wav 的音頻文件
from?pydub?import?AudioSegment
#?音頻路徑
audio_path?=?"./raw/1.wav"
#?指定音頻格式,這里以wav音頻為例
format='wav'
#?實(shí)例化一個(gè)AudioSegment對(duì)象
audio_segment?=?AudioSegment.from_file(audio_path,?format)
3-2裁剪某段音頻
針對(duì)對(duì)象,使用中括號(hào)指定開(kāi)始時(shí)間和結(jié)束時(shí)間,即可以快速提取某一段音頻
PS:時(shí)間以毫秒為單位
#?某一段音頻文件
#?指定開(kāi)始時(shí)間、結(jié)束時(shí)間
#?時(shí)間以毫秒為單位
audio_part?=?audio_segment[start_time:end_time]
3-3合并音頻
使用 合并多段音頻非常便捷,只需要使用符號(hào)+,將三段音頻的對(duì)象加起來(lái)即可
def?sound_compound(one_audio_segment,?*other):
????"""
????合并兩段音頻
????:param?one_audio_segment:
????:param?other_audio_segment:
????:return:
????"""
????result?=?one_audio_segment
????#?使用符號(hào)+,一段一段合并
????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音頻常見(jiàn)屬性
音頻比較常見(jiàn)的屬性包含:
對(duì)于音頻的時(shí)長(zhǎng),有 2 種獲取方式,即:
#?音頻常見(jiàn)屬性
#?實(shí)例化AudioSegment對(duì)象
as?=?AudioSegment.from_file("sound1.wav")
# duration_seconds:在內(nèi)部調(diào)用了 len()?,單位為秒
#?方式一,duration_seconds,以秒為單位
as_duration1?=?as.duration_seconds
#?方式二:len(as),以毫秒為單位
as_duration2?=?(len(as)?/?1000.0)
其他原始數(shù)據(jù)都可以從 對(duì)象相應(yīng)的屬性中獲取:
#?音頻常見(jiàn)屬性
#?實(shí)例化AudioSegment對(duì)象
as?=?AudioSegment.from_file("sound1.wav")
#?2、音頻響度
as_loudness?=?as.dBFS
#?3、聲道數(shù)
as_channel_num?=?as.channels
#?4、幀速率
#?一般值為?44100?(CD),?48000?(DVD),?22050,?24000,?12000?和?11025
as_frame_rate?=?sound.frame_rate
#?5、音頻的原始數(shù)據(jù)
as_raw_data?=?sound.raw_data
3-5 單條音頻淡入淡出
視頻剪輯中,經(jīng)常需要對(duì)音頻做淡入淡出處理,使音效播放更加自然
比如:針對(duì)單個(gè)音頻,在開(kāi)頭使用淡入,結(jié)束使用淡出,并指定淡入和淡出的時(shí)間
PS:?jiǎn)挝灰院撩霝閱挝?/p>
def?sound_fade_in_and_out(one_audio_segment,?fade_in=0,?fade_out=0):
????"""
????單段音頻設(shè)置開(kāi)頭淡入、結(jié)尾淡出
????可以把許多運(yùn)算符連成一串使用,因?yàn)檫\(yùn)算符都會(huì)返回一個(gè)AudioSegment對(duì)象
????:param?one_audio_segment:
????:param?fade_in:淡入時(shí)間(毫秒)
????:param?fade_out:淡出時(shí)間(毫秒)
????:return:
????"""
????return?one_audio_segment.fade_in(fade_in).fade_out(fade_out)
audio_segment?=?AudioSegment.from_file("./raw/1.wav",?format='wav')
#?單條視頻開(kāi)頭淡入,結(jié)束淡出
sound_fade_in_and_out(audio_segment,2000,2000)
需要指出的是, 對(duì)象內(nèi)置的fade() 函數(shù),可以更加靈活地實(shí)現(xiàn)淡入淡出效果
sound?=?AudioSegment.from_file("./sound.wav")
#?fade實(shí)現(xiàn)淡入/淡出效果
#?1、從1s開(kāi)始,持續(xù)2s,執(zhí)行淡化效果,并從0dB逐漸增加到3dB
sound_fade1?=?sound.fade(to_gain=+3.0,?start=1000,?duration=2000)
#?2、從1s開(kāi)始,一直到4s,中間1s的時(shí)間內(nèi)執(zhí)行淡化效果,從0db逐漸降低-2dB
sound_fade2?=?sound1.fade(to_gain=-2,?start=1000,?end=4000)
3-6調(diào)整音頻播放速度
視頻剪輯中,音頻速度的調(diào)整很常見(jiàn)
比如:在視頻結(jié)尾,調(diào)整最后的畫(huà)面幀為慢動(dòng)作,同樣需要同步調(diào)慢音頻的播放速度
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調(diào)整為之前速度的0.8
audio_new?=?speed_change(self.audio_segment,?0.8)
3-7播放音頻
AudioSegment?對(duì)象使用?pydub 內(nèi)置的 play() 方法,可以播放音頻,在調(diào)試代碼的時(shí)候非常方便
from?pydub.playback?import?play
sound1?=?AudioSegment.from_file("./1.wav")
#?播放音頻
play(sound1)
3-8??音量增益及降低
要調(diào)整一段音頻的音量,可以直接對(duì)?AudioSegment 實(shí)例加、減對(duì)應(yīng)的分貝數(shù)目即可
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()?方法,可以將多段音頻對(duì)象進(jìn)行合并,并添加交叉淡化的效果
PS:使用 crossfade 參數(shù)指定交叉淡化的持續(xù)時(shí)間,單位為毫秒
def?sound_overlap_effect(one_audio_segment,?other_audio_segment,?overlap_during):
????"""
????兩段音頻合并的同時(shí),使用交叉淡化的效果
????: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')
#?合并兩段音頻,并添加效果
#?持續(xù)時(shí)間:2000毫秒
result?=?sound_overlap_effect(audio_segment1,?audio_segment2,?2000)
3-10多聲道音頻
利用nts()函數(shù),可以一個(gè)軌道上創(chuàng)建多聲道音頻
def?create_multichannel_as(self):
????"""
????創(chuàng)建多聲道音頻(支持2個(gè)或者多個(gè))
????:return:
????"""
????# PS:每個(gè)單聲道音頻段都應(yīng)該有相同的時(shí)長(zhǎng)以及幀速率
????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提取音頻及導(dǎo)出音頻
在 3-1 中實(shí)例化 方式,方法同樣適用于視頻,即:我們可以從視頻中提取 音頻對(duì)象
使用對(duì)象的(,)方法,就可以將音頻保存到本地了
#?1、從視頻中提取一個(gè)AudioSegment音頻對(duì)象
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、導(dǎo)出音頻到本地
save_audio(result,?'./result.wav',?'wav')
4. 實(shí)戰(zhàn)一下
對(duì)搞笑類短視頻,經(jīng)常會(huì)采用這種剪輯手法,即:將視頻尾部,對(duì)最后一段對(duì)話降低速度并重新播放一次
準(zhǔn)備一段視頻素材,下面通過(guò) 來(lái)實(shí)現(xiàn)它
video_path?=?'./raw.mp4'
#?注意:加載視頻不需要指定format
audio_sgement?=?AudioSegment.from_file(video_path)
#?截取尾部?jī)?nèi)容
audio_end?=?audio_sgement[70?*?1000:70?*?1000?+?3000]
#?變慢速度,具體根據(jù)視頻速度去調(diào)整
audio_end2?=?speed_change(audio_end,?0.55)
#?合并兩段音頻
audio_result?=?audio_end?+?audio_end2
#?尾部淡出處理
audio_result.fade_out(1000)
#?視頻導(dǎo)出
audio_result.export("result.wav",?format='wav')
最后生成的音頻內(nèi)容如下:
5. 最后
文中僅僅對(duì) 常用的操作進(jìn)行了講解,更多騷操作可以閱讀官方文檔去解鎖
音視頻的一些常見(jiàn)操作都可以做成自動(dòng)化,讓自己從重復(fù)的剪輯工作中抽離出來(lái)
我已經(jīng)將文中完整源碼文件傳到后臺(tái),關(guān)注公眾號(hào),后臺(tái)回復(fù)「」即可獲得
如果你覺(jué)得文章還不錯(cuò),請(qǐng)大家點(diǎn)贊、分享、留言下,因?yàn)檫@將是我持續(xù)輸出更多優(yōu)質(zhì)文章的最強(qiáng)動(dòng)力!
留言送書(shū)
本周贈(zèng)書(shū):《 圖解機(jī)器學(xué)習(xí)》
內(nèi)容簡(jiǎn)介:本書(shū)覆蓋了機(jī)器學(xué)習(xí)領(lǐng)域的監(jiān)督學(xué)習(xí)、半監(jiān)督學(xué)習(xí)、無(wú)監(jiān)督學(xué)習(xí)、增強(qiáng)學(xué)習(xí)和機(jī)器學(xué)習(xí)新算法等內(nèi)容,構(gòu)成了機(jī)器學(xué)習(xí)從經(jīng)典到現(xiàn)代的體系框架,每章也可獨(dú)立閱讀。限于篇幅,書(shū)中沒(méi)有講解 語(yǔ)言的基礎(chǔ)知識(shí),如果讀者沒(méi)有 語(yǔ)言的基礎(chǔ),建議先學(xué)習(xí) 語(yǔ)言入門(mén)知識(shí),這樣可以更好地學(xué)習(xí)本書(shū)內(nèi)容
PS:中獎(jiǎng)名單將在交流群公布,可以掃描下方二維碼,備注【交流群】,加入技術(shù)交流群!
聲明:本站所有文章資源內(nèi)容,如無(wú)特殊說(shuō)明或標(biāo)注,均為采集網(wǎng)絡(luò)資源。如若本站內(nèi)容侵犯了原著者的合法權(quán)益,可聯(lián)系本站刪除。