librosa实现音频格式转换(单曲批量) | MP3转wav
文章目錄
- step1:環(huán)境要求
- ①安裝ffmpeg
- ②安裝librosa
- ③安裝soundfile
- step2:4行代碼完成一首歌的格式轉(zhuǎn)換
- ①導(dǎo)包
- ②讀入需要處理的MP3文件
- ③用soundfile重寫成wav
- 綜上,完整代碼如下:
- 注:MP3批量轉(zhuǎn)WAV(保持源文件名不變)
- step1:編寫轉(zhuǎn)換函數(shù)
- step2:調(diào)用轉(zhuǎn)換函數(shù)
- step3:運(yùn)行
- 擴(kuò)展
- 解決報(bào)錯小故事1
- 更多報(bào)錯故事待更……
step1:環(huán)境要求
①安裝ffmpeg
這一步很關(guān)鍵。如果沒有ffmpeg,librosa讀取MP3文件時就會報(bào)錯。
見筆者的文章:ffmpeg安裝
②安裝librosa
pip install librosa③安裝soundfile
pip install soundfilestep2:4行代碼完成一首歌的格式轉(zhuǎn)換
①導(dǎo)包
import librosa import soundfile②讀入需要處理的MP3文件
y,sr = librosa.load("./dataset/sample_data/Sakamoto_MerryChristmasMr_Lawrence.mp3")③用soundfile重寫成wav
soundfile.write("./dataset/sample_data/Sakamoto_MerryChristmasMr_Lawrence.wav",y,sr)綜上,完整代碼如下:
import librosa y,sr = librosa.load("./dataset/sample_data/Sakamoto_MerryChristmasMr_Lawrence.mp3")import soundfile soundfile.write("./dataset/sample_data/Sakamoto_MerryChristmasMr_Lawrence.wav",y,sr)注:MP3批量轉(zhuǎn)WAV(保持源文件名不變)
批量保存文件夾中的文件名,參見筆者的文章。
step1:編寫轉(zhuǎn)換函數(shù)
def audio_mp3_to_wav():# 原MP3文件所在的文件夾audio_path = "C:/Users/24061/Desktop/MERcode/EMOPIA_cls-main/emopia_retrain/dataset/EMOPIA_1.0/EMOPIA_1.0/song"# WAV想要保存的文件夾save_path = "C:/Users/24061/Desktop/MERcode/EMOPIA_cls-main/emopia_retrain/dataset/EMOPIA_1.0/EMOPIA_1.0/song_wav"# 把MP3文件名存儲在csv文件中,并將文件名存入列表中songs_id_all = pd.read_csv("C:/Users/24061/Desktop/MERcode/EMOPIA_cls-main/emopia_retrain/dataset/EMOPIA_1.0/EMOPIA_1.0/songs_lists/metadata_by_song_new.csv",index_col=0)songs_id_all_list = []for i in songs_id_all.index:songs_id_all_list.append(i)# 遍歷文件夾for fn in tqdm(songs_id_all_list):# 加載文件waveform, source_sr = librosa.load(Path(audio_path, fn + ".mp3"))# 想要保存的文件名pt_path = Path(save_path, fn + ".wav")# 采樣后數(shù)據(jù)的保存位置。如果沒有此文件夾,就創(chuàng)建一個文件夾if not os.path.exists(os.path.dirname(pt_path)):os.makedirs(os.path.dirname(pt_path))# 將音頻寫成WAVsoundfile.write((pt_path),waveform,source_sr)step2:調(diào)用轉(zhuǎn)換函數(shù)
import os from pathlib import Path from tqdm.notebook import tqdm import librosa import soundfileaudio_mp3_to_wav()step3:運(yùn)行
等待寫入:
寫好的文件如圖所示:
轉(zhuǎn)換完成:
擴(kuò)展
使用此方法進(jìn)行mp3轉(zhuǎn)wav,可以解決很多報(bào)錯問題,如:
解決報(bào)錯小故事1
報(bào)錯
筆者在做實(shí)驗(yàn)時,遇到如下報(bào)錯:raise RuntimeError(prefix + _ffi.string(err_str).decode('utf-8', 'replace'))
……
RuntimeError: Error opening 'D:\\xxx.wav': File contains data in an unknown format.
分析網(wǎng)絡(luò)上的解決方法
搜索了很多資料,很多博主給出的解決方法是:
……
BUT!筆者想說,安裝ffmpeg確實(shí)是一個方法,它適用于你的音頻均是MP3,想要讓代碼讀取的情況。但如果正確安裝ffmpeg后依舊沒有解決問題,很可能是因?yàn)?你的音頻源文件有問題(一些你尚未發(fā)現(xiàn)的小問題)。
筆者的方法
不過不要擔(dān)心,這里筆者想提出一個通用的解決辦法,不妨試試~。
方法就是:對音頻源文件進(jìn)行處理。采用本文提出的方法,將音頻全部重新生成新的WAV文件。
筆者的報(bào)錯解決故事
從上述報(bào)錯中,細(xì)心的讀者可能已經(jīng)發(fā)現(xiàn)了,筆者報(bào)錯代碼提示“無法識別wav格式”,欸?有點(diǎn)奇怪了吼!無法識別mp3我理解,無法識別wav我就黑人問號了(因?yàn)楝F(xiàn)有音頻處理軟件幾乎都是支持WAV的,幾乎不存在不識別WAV的情況)。于是,筆者打開音頻源文件查看了一下:
誰家WAV就幾kB呀?這個音頻應(yīng)該是個假wav【所謂“假wav”:即,你將一個MP3文件通過修改后綴的方式,得到一個WAV后綴的音頻文件,但音頻實(shí)質(zhì)上還是MP3】【筆者的音頻是由pydub的AudioSegment得來的,查了查,這個包輸出的音頻是MP3格式,而筆者的命名是xxx.wav,報(bào)錯原因可能就出在這里】。
使用本文提出的方法,將音頻全部重新生成新的WAV文件,再次實(shí)驗(yàn),果然,報(bào)錯解決了!
更多報(bào)錯故事待更……
總結(jié)
以上是生活随笔為你收集整理的librosa实现音频格式转换(单曲批量) | MP3转wav的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: postman中文设置以及Test断言设
- 下一篇: 常见音视频的编码方式和封装格式