声学、音乐计算常用工具总结(soundfile、librosa、pydub、madmom、spleeter)
文章目錄
- 一、soundfile
- 二、librosa
- 三、pydub
- 四、madmom
- 五、spleeter
?? 學習必須要經常總結,通過總結梳理才能記得牢,也方便以后用到的時候回頭查閱,這也是我寫CSDN的主要目的。剛參加了音樂節拍檢測的比賽,由于是初次接觸計算音樂學這個領域,我學習了一些常用的工具,怕以后不用忘了,趕緊趁熱總結一下。
一、soundfile
soundfile常用于音頻文件讀寫:
import soundfile as sfdata, samplerate = sf.read('existing_file.wav') sf.write('new_file.flac', data, samplerate) #sf.write('new_file.wav', data, samplerate)flac是一種無損壓縮音樂格式
二、librosa
??librosa是常用的音頻處理庫,注意librosa安裝時要先裝ffmpeg。在docker ubuntu中安裝:
apt-get update && apt-get install -y ffmpeg pip install librosa我這次主要用librosa來進行加載音頻和重采樣:
wav,sr = librosa.load(file,sr=44100) drums = librosa.resample(drums, orig_sr=44100, target_sr=22050, fix=True, scale=False)此外,librosa還常用來提取音頻特征,例如梅爾頻譜和梅爾倒譜:
librosa.feature.melspectrogram()
librosa.feature.mfcc()
三、pydub
??pydub是一個非常強大的音頻處理和編輯工具。我這次主要用來增加減少音強,和合成多個音軌:
#合成音軌 bass = AudioSegment.from_file('bass.wav').set_frame_rate(22050).set_channels(1) other = AudioSegment.from_file('other.wav').set_frame_rate(22050).set_channels(1) vocals = AudioSegment.from_file('vocals.wav').set_frame_rate(22050).set_channels(1) NoDrum_audio = bass.overlay(other).overlay(vocals) nodrum_wav = np.frombuffer(NoDrum_audio.raw_data,np.short)/32768 #增加5個分貝 NoDrum_audio_5 = NoDrum_audio + 5??使用時必須要先加載成AudioSegment類的數據,然后再用overlay,合成后可以用上面np.frombuffer的方式再轉換為和librosa加載后相同的numpy數組。
四、madmom
??madmom是一個強大的音樂分析工具,專用來分析音樂。我這次主要用它來提取特征和使用它的HMM包來提取beat和downbeat(即音樂節拍和強拍)并計算多種評價指標得分。
#提取特征,這里用madmom的多線程器提取頻譜特征以及頻譜的一階差分, #分成三組參數[1024, 2048, 4096],[3, 6, 12]提取后再合并。 from madmom.audio.signal import SignalProcessor, FramedSignalProcessor from madmom.audio.stft import ShortTimeFourierTransformProcessor from madmom.audio.spectrogram import (FilteredSpectrogramProcessor, LogarithmicSpectrogramProcessor,SpectrogramDifferenceProcessor) from madmom.processors import ParallelProcessor, Processor, SequentialProcessor def madmom_feature(wav):sig = SignalProcessor(num_channels=1, sample_rate=44100 )multi = ParallelProcessor([])frame_sizes = [1024, 2048, 4096]num_bands = [3, 6, 12]for frame_size, num_bands in zip(frame_sizes, num_bands):frames = FramedSignalProcessor(frame_size=frame_size, fps=100)stft = ShortTimeFourierTransformProcessor() # caching FFT windowfilt = FilteredSpectrogramProcessor(num_bands=num_bands, fmin=30, fmax=17000, norm_filters=True)spec = LogarithmicSpectrogramProcessor(mul=1, add=1)diff = SpectrogramDifferenceProcessor(diff_ratio=0.5, positive_diffs=True, stack_diffs=np.hstack)# process each frame size with spec and diff sequentiallymulti.append(SequentialProcessor((frames, stft, filt, spec, diff)))# stack the features and processes everything sequentiallypre_processor = SequentialProcessor((sig, multi, np.hstack))feature = pre_processor.process( wav)return feature下面用madmom自帶的HMM模塊處理beat和downbeat聯合檢測算法生成的激活值
from madmom.features.downbeats import DBNDownBeatTrackingProcessor as DownBproc hmm_proc = DownBproc(beats_per_bar = [3,4], num_tempi = 80, transition_lambda = 180, observation_lambda = 21, threshold = 0.5, fps = 100) #act是用神經網絡等音頻節拍檢測算法處理得到的激活值 beat_fuser_est = hmm_proc(act) beat_pred = beat_fuser_est[:,0] downbeat_pred = beat_pred[beat_fuser_est[:,1]==1]下面對節拍檢測結果和節拍標注值計算多種評估指標:
from madmom.evaluation.beats import BeatEvaluation scr = BeatEvaluation(beat_pred,beat_true) print(scr.fmeasure,scr.pscore,scr.cemgil,scr.cmlc,scr.cmlt,scr.amlc,scr.amlt)五、spleeter
??spleeter是一款效果非常不錯的音樂音軌分離工具。可以分成兩音軌,四音軌或五音軌,它本身是用tensorflow寫的,必須要先下載預訓練權重,第一次使用會自動下載。我安裝時發現它和madmom版本沖突,多次嘗試后發現用一個較早的版本1.4.9版才可以。安裝時用pip install spleeter==1.4.9即可。
??網上給出的用法都是在命令行中調用,我琢磨了一個在python代碼中調用的方法:
注意,由于spleeter的預訓練權重是在44100采樣頻率下訓練的,所以使用時也必須44100Hz加載音樂。
總結
以上是生活随笔為你收集整理的声学、音乐计算常用工具总结(soundfile、librosa、pydub、madmom、spleeter)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用pytorch及numpy计算成对余弦
- 下一篇: 【论文学习】RepVGG: Making