Методы извлечения функций Librosa с помощью PySpark - PullRequest
0 голосов
/ 27 мая 2018

Я долго искал, но не вижу никакой реализации методов извлечения музыкальных функций (таких как спектральный центроид , спектральная полоса пропускания и т. Д.), Интегрированных с Apache Spark.Я работаю с этими методами извлечения функций, и процесс занимает много времени для музыки.Я хочу распараллелить и ускорить этот процесс с помощью 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 для этого процесса, но также не смог реализовать это.Может ли кто-нибудь помочь мне понять, что я делаю неправильно?

...