【发布时间】:2019-04-03 04:59:56
【问题描述】:
我有超过 1000 个音频文件(这只是一个初步的开发,未来会有更多的音频文件),并且想将它们转换为 melspectrogram。
由于我的工作站有一个英特尔® 至强® 处理器 E5-2698 v3,它有 32 个线程,我想使用多线程来完成我的工作。
我的代码
import os
import librosa
from librosa.display import specshow
from natsort import natsorted
import numpy as np
import sys
# Libraries for multi thread
from multiprocessing.dummy import Pool as ThreadPool
import subprocess
pool = ThreadPool(20)
songlist = os.listdir('../opensmile/devset_2015/')
songlist= natsorted(songlist)
def get_spectrogram(song):
print("start")
y, sr = librosa.load('../opensmile/devset_2015/' + song)
## Add some function to cut y
y_list = y
##
for i, y_i in enumerate([y_list]): # can remove for loop if no audio is cut
S = librosa.feature.melspectrogram(y=y, sr=sr, n_mels=128,fmax=8000)
try:
np.save('./Test/' + song + '/' + str(i), S)
except:
os.makedirs('./Test/' + song)
np.save('./Test/' + song + '/' + str(i), S)
print("done saving")
pool.map(get_spectrogram, songlist)
我的问题
但是,我的脚本在完成第一次转换后冻结。
为了调试正在发生的事情,我注释掉了 S = librosa.feature.melspectrogram(y=y, sr=sr, n_mels=128,fmax=8000) 并将其替换为 S=0。
那么多线程代码就可以正常工作了。
librosa.feature.melspectrogram 函数有什么问题?不支持多线程吗?还是ffmpeg的问题? (使用librosa时,它要求我先安装ffmpeg。)
【问题讨论】:
标签: python multithreading ffmpeg librosa