gpt4 book ai didi

python - 无法对 librosa Melspectrogram 使用多线程

转载 作者:行者123 更新时间:2023-12-01 01:04:38 29 4
gpt4 key购买 nike

我有超过1000个音频文件(这只是一个初步开发,将来会有更多的音频文件),并且想将它们转换为梅尔谱图。

由于我的工作站配备了 Intel® Xeon® 处理器 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。)

最佳答案

我建议使用joblib与 librosa 并行处理。我相信 librosa 在内部使用它,所以这可能会避免一些冲突。下面是一个工作示例,基于我经常用来处理一些 10k 文件的代码。

import os.path
import joblib
import librosa
import numpy

def compute(inpath, outpath):
y, sr = librosa.load(inpath)
S = librosa.feature.melspectrogram(y=y, sr=sr, n_mels=128, fmax=8000)
numpy.save(outpath, S)
return outpath

out_dir = 'temp/'
n_jobs=8
verbose=1

# as an reproducable example just processes the same input file
# but making sure to give them unique output names
inputs = [ librosa.util.example_audio_file() ] * 10
outputs = [ os.path.join(out_dir, '{}.npy'.format(n)) for n in range(len(inputs)) ]

jobs = [ joblib.delayed(compute)(i, o) for i,o in zip(inputs, outputs) ]
out = joblib.Parallel(n_jobs=n_jobs, verbose=verbose)(jobs)

print(out)

输出

[Parallel(n_jobs=8)]: Using backend LokyBackend with 8 concurrent workers.
[Parallel(n_jobs=8)]: Done 6 out of 10 | elapsed: 10.4s remaining: 6.9s
[Parallel(n_jobs=8)]: Done 10 out of 10 | elapsed: 13.2s finished
['temp/0.npy', 'temp/1.npy', 'temp/2.npy', 'temp/3.npy', 'temp/4.npy', 'temp/5.npy', 'temp/6.npy', 'temp/7.npy', 'temp/8.npy', 'temp/9.npy']

关于python - 无法对 librosa Melspectrogram 使用多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55487391/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com