import os
import soundfile
import librosa
import sklearn
import numpy as np
import matplotlib.pyplot as plt
from scipy.io.wavfile import read, write
from IPython.display import Audio
from numpy.fft import fft, ifft
%matplotlib inline
directory = os.fsencode('Kick Drums')
featureSet = np.zeros((5, 1))
def extract_features(x, fs, file):
fileName = os.path.split(file)[1]
y, sr = librosa.load(file)
hop_length = 256
frame_length = 512
#zero crossing rate
zcr = librosa.zero_crossings(x).sum()
#energy
energy = np.array([
sum(abs(x[i:i+frame_length]**2))
for i in range(0, len(x), hop_length)
])
#spectral things
centroid = np.asarray(librosa.feature.spectral_centroid(y=y, sr=sr))
bandwidth = np.asarray(librosa.feature.spectral_bandwidth(y=y, sr=sr))
#return np.array([zcr, energy, centroid, bandwidth, fileName])
return np.array([1, [10, 20, 30, 40], [50, 60, 70, 90, 90], 4, fileName])
for filename in os.listdir(directory):
#doing file things
fileStr = os.path.join(directory, filename)
print(fileStr)
data, samplerate = soundfile.read(fileStr)
#os.remove(fileStr)
soundfile.write(fileStr, data, samplerate, subtype='PCM_16')
x, fs = librosa.load(fileStr)
features = extract_features(x, fs, fileStr)
featureSet = np.column_stack((featureSet, features))
for element in featureSet:
if type(element) is np.ndarray:
element = np.transpose(element)
element = *element,
print(featureSet)
#clustering!
model = sklearn.cluster.KMeans(n_clusters=2)
labels = model.fit_predict(featureSet)
print("pre-labels")
#print(labels)
print("post-labels")
aW1wb3J0IG9zCmltcG9ydCBzb3VuZGZpbGUKaW1wb3J0IGxpYnJvc2EKaW1wb3J0IHNrbGVhcm4KaW1wb3J0IG51bXB5IGFzIG5wCmltcG9ydCBtYXRwbG90bGliLnB5cGxvdCBhcyBwbHQKZnJvbSBzY2lweS5pby53YXZmaWxlIGltcG9ydCByZWFkLCB3cml0ZQpmcm9tIElQeXRob24uZGlzcGxheSBpbXBvcnQgQXVkaW8KZnJvbSBudW1weS5mZnQgaW1wb3J0IGZmdCwgaWZmdAolbWF0cGxvdGxpYiBpbmxpbmUKCmRpcmVjdG9yeSA9IG9zLmZzZW5jb2RlKCdLaWNrIERydW1zJykKZmVhdHVyZVNldCA9IG5wLnplcm9zKCg1LCAxKSkKCmRlZiBleHRyYWN0X2ZlYXR1cmVzKHgsIGZzLCBmaWxlKToKICAgIGZpbGVOYW1lID0gb3MucGF0aC5zcGxpdChmaWxlKVsxXQogICAgeSwgc3IgPSBsaWJyb3NhLmxvYWQoZmlsZSkKICAgIGhvcF9sZW5ndGggPSAyNTYKICAgIGZyYW1lX2xlbmd0aCA9IDUxMgogICAgI3plcm8gY3Jvc3NpbmcgcmF0ZQogICAgemNyID0gbGlicm9zYS56ZXJvX2Nyb3NzaW5ncyh4KS5zdW0oKQogICAgI2VuZXJneQogICAgZW5lcmd5ID0gbnAuYXJyYXkoWwogICAgICAgIHN1bShhYnMoeFtpOmkrZnJhbWVfbGVuZ3RoXSoqMikpCiAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKHgpLCBob3BfbGVuZ3RoKQogICAgXSkKICAgICNzcGVjdHJhbCB0aGluZ3MKICAgIGNlbnRyb2lkID0gbnAuYXNhcnJheShsaWJyb3NhLmZlYXR1cmUuc3BlY3RyYWxfY2VudHJvaWQoeT15LCBzcj1zcikpCiAgICBiYW5kd2lkdGggPSBucC5hc2FycmF5KGxpYnJvc2EuZmVhdHVyZS5zcGVjdHJhbF9iYW5kd2lkdGgoeT15LCBzcj1zcikpCgogICAgI3JldHVybiBucC5hcnJheShbemNyLCBlbmVyZ3ksIGNlbnRyb2lkLCBiYW5kd2lkdGgsIGZpbGVOYW1lXSkKICAgIHJldHVybiBucC5hcnJheShbMSwgWzEwLCAyMCwgMzAsIDQwXSwgWzUwLCA2MCwgNzAsIDkwLCA5MF0sIDQsIGZpbGVOYW1lXSkKICAgIApmb3IgZmlsZW5hbWUgaW4gb3MubGlzdGRpcihkaXJlY3RvcnkpOgogICAgCiAgICAjZG9pbmcgZmlsZSB0aGluZ3MKICAgIGZpbGVTdHIgPSBvcy5wYXRoLmpvaW4oZGlyZWN0b3J5LCBmaWxlbmFtZSkKICAgIHByaW50KGZpbGVTdHIpCiAgICBkYXRhLCBzYW1wbGVyYXRlID0gc291bmRmaWxlLnJlYWQoZmlsZVN0cikKICAgICNvcy5yZW1vdmUoZmlsZVN0cikKICAgIHNvdW5kZmlsZS53cml0ZShmaWxlU3RyLCBkYXRhLCBzYW1wbGVyYXRlLCBzdWJ0eXBlPSdQQ01fMTYnKQogICAgeCwgZnMgPSBsaWJyb3NhLmxvYWQoZmlsZVN0cikKICAgIGZlYXR1cmVzID0gZXh0cmFjdF9mZWF0dXJlcyh4LCBmcywgZmlsZVN0cikKICAgIGZlYXR1cmVTZXQgPSBucC5jb2x1bW5fc3RhY2soKGZlYXR1cmVTZXQsIGZlYXR1cmVzKSkKCmZvciBlbGVtZW50IGluIGZlYXR1cmVTZXQ6CiAgICBpZiB0eXBlKGVsZW1lbnQpIGlzIG5wLm5kYXJyYXk6CiAgICAgICAgZWxlbWVudCA9IG5wLnRyYW5zcG9zZShlbGVtZW50KQogICAgICAgIGVsZW1lbnQgPSAqZWxlbWVudCwKCiAgICAgICAgCnByaW50KGZlYXR1cmVTZXQpCiNjbHVzdGVyaW5nIQptb2RlbCA9IHNrbGVhcm4uY2x1c3Rlci5LTWVhbnMobl9jbHVzdGVycz0yKQpsYWJlbHMgPSBtb2RlbC5maXRfcHJlZGljdChmZWF0dXJlU2V0KQpwcmludCgicHJlLWxhYmVscyIpCiNwcmludChsYWJlbHMpCnByaW50KCJwb3N0LWxhYmVscyIpCg==