利用PySpark进行Librosa特征提取方法

时间:2018-05-27 02:51:58

标签: apache-spark pyspark feature-extraction spectrogram librosa

我一直在搜索很长时间,但无法看到与Apache Spark集成的音乐特征提取技术(如spectral centroidspectral bandwidth等)的任何实现。我正在使用这些特征提取技术,这个过程需要花费大量时间来播放音乐。我想通过使用Spark来并行化并加速这个过程。我做了一些工作,但无法加快速度。我想获得光谱质心法的算术平均值和标准偏差。这是我到目前为止所做的。

from pyspark import SparkContext
import librosa
import numpy as np
import time

parts=4
print("Parts: ", parts)
sc = SparkContext('local['+str(parts)+']', 'pyspark tutorial')

def spectral(iterator):
    l=list(iterator)
    cent=librosa.feature.spectral_centroid(np.array(l), hop_length=256)
    ort=np.average(cent)
    std=np.std(cent)
    return (ort, std) 

y, sr=librosa.load("classical.00080.au")  #This loads the song.

start1=time.time()
normal=librosa.feature.spectral_centroid(np.array(y), hop_length=256)  #This is normal technique without spark
end1=time.time()

print("\nOrt: \t", np.average(normal))
print("Std: \t", np.std(normal))
print("Time elapsed: %.5f" % (end1-start1))

#This is where my spark implementation appears.
rdd = sc.parallelize(y)
start2=time.time()
result=rdd.mapPartitions(spectral).collect()
end2=time.time()
result=np.array(result)

total_avg, total_std = 0, 0
for i in range(0, parts*2, 2):
    total_avg += result[i]
    total_std += result[i+1]
spark_avg = total_avg/parts
spark_std = total_std/parts

print("\nOrt:", spark_avg)
print("Std:", spark_std)
print("Time elapsed: %.5f" % (end2-start2))

该计划的输出如下。

Ort:     971.8843380584146
Std:     306.75410601230413
Time elapsed: 0.17665

Ort:     971.3152955225721
Std:     207.6510740703993
Time elapsed: 4.58174

所以,即使我将数组y(音乐信号数组)并行化,我也无法加速这个过程。这需要更长的时间。我无法理解为什么。我是Spark概念的新手。我想在这个过程中使用GPU,但也无法实现。谁能帮我理解我做错了什么?

0 个答案:

没有答案