Python利用Pydub實(shí)現(xiàn)自動(dòng)分割音頻
隨著短視頻應(yīng)用的普及,越來(lái)越多人開始了解并嘗試制作自己的短視頻作品。而在制作短視頻時(shí),背景音樂(lè)的選擇和使用也是非常重要的一步。很多人喜歡選擇一首長(zhǎng)音樂(lè),再通過(guò)剪輯軟件將其剪成多段來(lái)使用,這種做法雖然可行,但效率較低。
在這種情況下,我們可以使用音頻分割技術(shù)來(lái)快速剪輯出需要的音頻段,以便于在短視頻中使用。在 Python 中,我們可以使用 Pydub 庫(kù)來(lái)進(jìn)行音頻分割。
I. 簡(jiǎn)介
pydub是Python的一個(gè)音頻處理庫(kù),可以處理各種音頻格式,如mp3、wav、flv等等。它是一個(gè)輕量級(jí)、快速且易于使用的庫(kù)。silence庫(kù)是pydub的一個(gè)擴(kuò)展庫(kù),可以在音頻文件中根據(jù)靜默部分進(jìn)行分割,非常方便。
II. 安裝
使用pip安裝pydub庫(kù):
pip install pydub
III. 使用
下面是一個(gè)使用pydub=分割音頻文件的示例代碼:
from pydub import AudioSegment from pydub.silence import split_on_silence # 讀取音頻文件 audio = AudioSegment.from_file("audio.mp3", format="mp3") # 設(shè)置分割參數(shù) min_silence_len = 700 # 最小靜音長(zhǎng)度 silence_thresh =-10 # 靜音閾值,越小越嚴(yán)格 keep_silence = 600 # 保留靜音長(zhǎng)度 # 識(shí)別計(jì)算分割歌曲數(shù)量 num_segments = int(audio.duration_seconds/60/3) # 每首歌曲大概三分鐘,計(jì)算歌曲數(shù)量 # 分割音頻文件 for i in range(-10, 0): segments = split_on_silence(audio, min_silence_len=min_silence_len, silence_thresh=i, keep_silence=keep_silence) if len(segments) <= num_segments: print(f"分割成功,共分割出 {len(segments)} 段") break else: print(f"當(dāng)前閾值為 {i},分割出 {len(segments)} 段,繼續(xù)嘗試")
上面的代碼首先使用AudioSegment類從audio.mp3文件中讀取音頻數(shù)據(jù),然后設(shè)置了分割參數(shù)min_silence_len、silence_thresh和keep_silence。min_silence_len是最小靜音長(zhǎng)度,silence_thresh是靜音閾值,keep_silence是保留靜音長(zhǎng)度。這些參數(shù)的具體含義可以根據(jù)實(shí)際情況進(jìn)行調(diào)整。最后,根據(jù)分割參數(shù)使用split_on_silence函數(shù)對(duì)音頻文件進(jìn)行分割。
分割成功后,我們可以輸出分割后的音頻文件,驗(yàn)證是否達(dá)到了我們預(yù)期的效果。至此,我們就完成了音頻文件的自動(dòng)分割,可以將分割后的文件用于其他需要使用的場(chǎng)景了。
補(bǔ)充
除了利用Pydub實(shí)現(xiàn)自動(dòng)分割音頻,本文還為大家整理了其他Python實(shí)現(xiàn)音頻分割的方法,希望對(duì)大家有所幫助
方法一:
from pydub import AudioSegment from pydub.utils import make_chunks import os, re # # 循環(huán)目錄下所有文件 for each in os.listdir("D:/PycharmProjects/拾音器/"): # 循環(huán)目錄 filename = re.findall(r"(.*?)\.mp3", each) # 取出.mp3后綴的文件名 print(each) if each: mp3 = AudioSegment.from_file('D:/PycharmProjects/拾音器//{}'.format(each), "mp3") # 打開mp3文件 # # # mp3[17*1000+500:].export(filename[0], format="mp3") # 切割前17.5秒并覆蓋保存,與以下代碼不可同時(shí)使用 size = 10000 # 切割的毫秒數(shù) 10s=10000 chunks = make_chunks(mp3, size) # 將文件切割為10s一塊 for i, chunk in enumerate(chunks): chunk_name = "{}-{}.mp3".format(each.split(".")[0], i) # 也可以自定義名字 print(chunk_name) chunk.export('D:/PycharmProjects/拾音器2/{}'.format(chunk_name), format="mp3") # 新建的保存文件夾
方法二:
""" 把原音頻,按csv中的標(biāo)注結(jié)果分割成幾個(gè)音頻,如text是無(wú),忽略。否則從sDate到eDate 進(jìn)行分割。 """ import os import pandas as pd import json from pydub import AudioSegment csv_url = "D:\csv\\" wav_url = "D:\標(biāo)注音頻與示例\\" save_wav = "D:\wav\\new_wav\\" for path in os.listdir(csv_url): data_frame = pd.read_csv(csv_url + path, encoding='utf-8') name_list = data_frame["storeFileName"] result_list = data_frame["finalResult"] for nl, rl in zip(name_list, result_list): new_wav_url = save_wav + nl.split(".")[0] + "\\" if not os.path.exists(new_wav_url): os.makedirs(new_wav_url) result = json.loads(rl) txt_url = new_wav_url + nl.split(".")[0]+".txt" with open(txt_url, "w", encoding='utf-8') as fn: fn.write(nl+"\n") fn.write(rl) fn.close() audio = AudioSegment.from_wav(wav_url + nl) for text in result['text']: if text['defData']['text'] != '無(wú)': sTime = text['defData']['sTime'] * 1000 dTime = text['defData']['dTime'] * 1000 eTime = sTime + dTime # 音頻切割按開始時(shí)間到結(jié)束時(shí)間切割 audio_chunk = audio[sTime:eTime] audio_chunk.export(new_wav_url + nl.split(".")[0] + "-" + str(text['id']) + ".wav", format="wav")
到此這篇關(guān)于Python利用Pydub實(shí)現(xiàn)自動(dòng)分割音頻的文章就介紹到這了,更多相關(guān)Python Pydub分割音頻內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Python下Flask-ApScheduler快速指南
Flask是Python社區(qū)非常流行的一個(gè)Web開發(fā)框架,本文將嘗試將介紹APScheduler應(yīng)用于Flask之中,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2018-11-11Python基礎(chǔ)學(xué)習(xí)之常見的內(nèi)建函數(shù)整理
所謂的內(nèi)建函數(shù),可以直接使用,而不需要import。下面這篇文章主要給大家整理介紹了關(guān)于Python基礎(chǔ)學(xué)習(xí)之常見的一些內(nèi)建函數(shù),文中通過(guò)示例代碼為大家介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面跟著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09OpenCV 表盤指針自動(dòng)讀數(shù)的示例代碼
這篇文章主要介紹了OpenCV 表盤指針自動(dòng)讀數(shù)的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04pycharm激活碼免費(fèi)分享適用最新pycharm2020.2.3永久激活
免費(fèi)為大家分享Pycharm激活碼,適用最新版pycharm2020.2.3永久激活,pycharm2018,pycharm2019也可永久激活,可成功激活到2089年2020-11-11Python將json文件寫入ES數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了Python將json文件寫入ES數(shù)據(jù)庫(kù)的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2019-04-04關(guān)于Django Models CharField 參數(shù)說(shuō)明
這篇文章主要介紹了關(guān)于Django Models CharField 參數(shù)說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03Python實(shí)現(xiàn)模擬登錄及表單提交的方法
這篇文章主要介紹了Python實(shí)現(xiàn)模擬登錄及表單提交的方法,涉及Python正則匹配、cookie及URL操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07