In [2]:
from sklearn.cluster import KMeans, AffinityPropagation, SpectralClustering
from sklearn import metrics
from sklearn.datasets.samples_generator import make_blobs
import librosa

In [3]:
from python_speech_features import mfcc
from python_speech_features import logfbank
import scipy.io.wavfile as wav
import os
import numpy as np

In [4]:
data_dir = '../data/esc-50'
sample_dir = os.path.join(data_dir, 'sample')
train_dir = os.path.join(data_dir, 'train')
test_dir = os.path.join(data_dir, 'test')

In [5]:
print 'Sound Sample Classes'
print '--------------------'
for d in os.listdir(sample_dir):
    print d


Sound Sample Classes
--------------------
rooster
coughing
insects
laughing

In [6]:
samples_dict = dict()
for d in os.listdir(sample_dir):
    sample_class_dir = os.path.join(sample_dir, d)
    samples_dict[d] = [os.path.join(sample_class_dir, f) for f in os.listdir(sample_class_dir)]
print samples_dict


{'insects': ['../data/esc-50/sample/insects/2-82077-A.ogg', '../data/esc-50/sample/insects/3-110913-D.ogg', '../data/esc-50/sample/insects/4-130891-A.ogg', '../data/esc-50/sample/insects/1-46938-A.ogg', '../data/esc-50/sample/insects/3-110913-A.ogg', '../data/esc-50/sample/insects/1-73585-A.ogg', '../data/esc-50/sample/insects/5-198278-C.ogg', '../data/esc-50/sample/insects/5-195517-A.ogg', '../data/esc-50/sample/insects/4-191246-B.ogg', '../data/esc-50/sample/insects/2-81970-A.ogg', '../data/esc-50/sample/insects/5-198278-B.ogg', '../data/esc-50/sample/insects/2-160128-A.ogg', '../data/esc-50/sample/insects/1-7973-A.ogg', '../data/esc-50/sample/insects/1-17585-A.ogg', '../data/esc-50/sample/insects/5-233787-A.ogg', '../data/esc-50/sample/insects/2-81970-C.ogg', '../data/esc-50/sample/insects/3-104761-A.ogg', '../data/esc-50/sample/insects/2-99955-A.ogg', '../data/esc-50/sample/insects/3-105236-A.ogg', '../data/esc-50/sample/insects/5-194932-A.ogg', '../data/esc-50/sample/insects/1-19501-A.ogg', '../data/esc-50/sample/insects/2-99955-C.ogg', '../data/esc-50/sample/insects/1-80785-A.ogg', '../data/esc-50/sample/insects/2-81970-B.ogg', '../data/esc-50/sample/insects/5-198278-A.ogg', '../data/esc-50/sample/insects/4-182314-B.ogg', '../data/esc-50/sample/insects/3-110913-C.ogg', '../data/esc-50/sample/insects/4-182314-A.ogg', '../data/esc-50/sample/insects/4-143118-B.ogg', '../data/esc-50/sample/insects/5-197446-A.ogg', '../data/esc-50/sample/insects/3-105235-A.ogg', '../data/esc-50/sample/insects/3-110913-B.ogg', '../data/esc-50/sample/insects/4-143118-A.ogg', '../data/esc-50/sample/insects/3-104761-B.ogg', '../data/esc-50/sample/insects/1-46938-B.ogg', '../data/esc-50/sample/insects/1-75189-A.ogg', '../data/esc-50/sample/insects/4-191246-A.ogg', '../data/esc-50/sample/insects/2-99955-B.ogg'], 'coughing': ['../data/esc-50/sample/coughing/3-151212-A.ogg', '../data/esc-50/sample/coughing/1-52266-A.ogg', '../data/esc-50/sample/coughing/5-207681-A.ogg', '../data/esc-50/sample/coughing/1-30830-A.ogg', '../data/esc-50/sample/coughing/2-108017-A.ogg', '../data/esc-50/sample/coughing/2-87794-A.ogg', '../data/esc-50/sample/coughing/4-152995-A.ogg', '../data/esc-50/sample/coughing/2-123896-A.ogg', '../data/esc-50/sample/coughing/2-85292-A.ogg', '../data/esc-50/sample/coughing/4-171396-A.ogg', '../data/esc-50/sample/coughing/2-87412-A.ogg', '../data/esc-50/sample/coughing/2-87799-A.ogg', '../data/esc-50/sample/coughing/5-251489-A.ogg', '../data/esc-50/sample/coughing/1-19118-A.ogg', '../data/esc-50/sample/coughing/4-155650-B.ogg', '../data/esc-50/sample/coughing/5-178997-A.ogg', '../data/esc-50/sample/coughing/1-53663-A.ogg', '../data/esc-50/sample/coughing/3-125418-A.ogg', '../data/esc-50/sample/coughing/2-98676-A.ogg', '../data/esc-50/sample/coughing/5-204604-A.ogg', '../data/esc-50/sample/coughing/5-208761-A.ogg', '../data/esc-50/sample/coughing/5-184871-A.ogg', '../data/esc-50/sample/coughing/4-177835-A.ogg', '../data/esc-50/sample/coughing/3-145487-A.ogg', '../data/esc-50/sample/coughing/1-19111-A.ogg', '../data/esc-50/sample/coughing/3-132601-A.ogg', '../data/esc-50/sample/coughing/5-211197-A.ogg', '../data/esc-50/sample/coughing/4-154443-A.ogg', '../data/esc-50/sample/coughing/3-146873-A.ogg', '../data/esc-50/sample/coughing/3-149042-A.ogg', '../data/esc-50/sample/coughing/4-155650-A.ogg', '../data/esc-50/sample/coughing/1-63679-A.ogg', '../data/esc-50/sample/coughing/3-142604-A.ogg', '../data/esc-50/sample/coughing/4-157296-A.ogg', '../data/esc-50/sample/coughing/2-87795-A.ogg', '../data/esc-50/sample/coughing/1-52323-A.ogg', '../data/esc-50/sample/coughing/5-209719-A.ogg', '../data/esc-50/sample/coughing/3-151213-A.ogg', '../data/esc-50/sample/coughing/1-58792-A.ogg', '../data/esc-50/sample/coughing/4-169726-A.ogg'], 'laughing': ['../data/esc-50/sample/laughing/2-60791-A.ogg', '../data/esc-50/sample/laughing/1-33658-A.ogg', '../data/esc-50/sample/laughing/3-118487-A.ogg', '../data/esc-50/sample/laughing/5-253534-A.ogg', '../data/esc-50/sample/laughing/5-263775-A.ogg', '../data/esc-50/sample/laughing/1-1791-A.ogg', '../data/esc-50/sample/laughing/3-126113-A.ogg', '../data/esc-50/sample/laughing/4-132816-A.ogg', '../data/esc-50/sample/laughing/4-132803-A.ogg', '../data/esc-50/sample/laughing/1-36164-A.ogg', '../data/esc-50/sample/laughing/5-242932-B.ogg', '../data/esc-50/sample/laughing/1-36164-B.ogg', '../data/esc-50/sample/laughing/2-79775-A.ogg', '../data/esc-50/sample/laughing/5-263775-B.ogg', '../data/esc-50/sample/laughing/1-72695-A.ogg', '../data/esc-50/sample/laughing/3-132747-A.ogg', '../data/esc-50/sample/laughing/4-164243-A.ogg', '../data/esc-50/sample/laughing/4-132810-A.ogg', '../data/esc-50/sample/laughing/5-242932-A.ogg', '../data/esc-50/sample/laughing/2-109759-A.ogg', '../data/esc-50/sample/laughing/1-73123-A.ogg', '../data/esc-50/sample/laughing/3-119459-A.ogg', '../data/esc-50/sample/laughing/3-107123-A.ogg', '../data/esc-50/sample/laughing/1-30043-A.ogg', '../data/esc-50/sample/laughing/3-152997-A.ogg', '../data/esc-50/sample/laughing/3-152912-A.ogg', '../data/esc-50/sample/laughing/4-133674-A.ogg', '../data/esc-50/sample/laughing/3-110536-A.ogg', '../data/esc-50/sample/laughing/2-109759-B.ogg', '../data/esc-50/sample/laughing/2-62226-A.ogg', '../data/esc-50/sample/laughing/5-244526-A.ogg', '../data/esc-50/sample/laughing/1-30039-A.ogg', '../data/esc-50/sample/laughing/4-167571-A.ogg', '../data/esc-50/sample/laughing/4-181599-A.ogg', '../data/esc-50/sample/laughing/4-155670-A.ogg', '../data/esc-50/sample/laughing/5-259514-A.ogg', '../data/esc-50/sample/laughing/2-60794-A.ogg', '../data/esc-50/sample/laughing/2-79769-A.ogg', '../data/esc-50/sample/laughing/5-171118-A.ogg', '../data/esc-50/sample/laughing/2-60795-A.ogg'], 'rooster': ['../data/esc-50/sample/rooster/1-40730-A.ogg', '../data/esc-50/sample/rooster/2-65750-A.ogg', '../data/esc-50/sample/rooster/3-154957-A.ogg', '../data/esc-50/sample/rooster/4-208021-A.ogg', '../data/esc-50/sample/rooster/3-116135-A.ogg', '../data/esc-50/sample/rooster/4-164021-A.ogg', '../data/esc-50/sample/rooster/1-43382-A.ogg', '../data/esc-50/sample/rooster/2-95258-A.ogg', '../data/esc-50/sample/rooster/4-164064-A.ogg', '../data/esc-50/sample/rooster/5-200339-A.ogg', '../data/esc-50/sample/rooster/1-39923-A.ogg', '../data/esc-50/sample/rooster/5-194930-B.ogg', '../data/esc-50/sample/rooster/3-149189-A.ogg', '../data/esc-50/sample/rooster/3-107219-A.ogg', '../data/esc-50/sample/rooster/2-71162-A.ogg', '../data/esc-50/sample/rooster/3-145382-A.ogg', '../data/esc-50/sample/rooster/5-234879-A.ogg', '../data/esc-50/sample/rooster/5-234879-B.ogg', '../data/esc-50/sample/rooster/5-200334-A.ogg', '../data/esc-50/sample/rooster/4-164064-C.ogg', '../data/esc-50/sample/rooster/5-233160-A.ogg', '../data/esc-50/sample/rooster/2-95035-A.ogg', '../data/esc-50/sample/rooster/2-96460-A.ogg', '../data/esc-50/sample/rooster/4-164064-B.ogg', '../data/esc-50/sample/rooster/5-200334-B.ogg', '../data/esc-50/sample/rooster/3-137152-A.ogg', '../data/esc-50/sample/rooster/1-27724-A.ogg', '../data/esc-50/sample/rooster/1-44831-A.ogg', '../data/esc-50/sample/rooster/3-163288-A.ogg', '../data/esc-50/sample/rooster/1-26806-A.ogg', '../data/esc-50/sample/rooster/4-164859-A.ogg', '../data/esc-50/sample/rooster/1-34119-A.ogg', '../data/esc-50/sample/rooster/3-134049-A.ogg', '../data/esc-50/sample/rooster/4-170078-A.ogg', '../data/esc-50/sample/rooster/1-34119-B.ogg', '../data/esc-50/sample/rooster/2-95258-B.ogg', '../data/esc-50/sample/rooster/2-100786-A.ogg', '../data/esc-50/sample/rooster/5-194930-A.ogg']}

In [7]:
sample_insect = samples_dict.get('insects')[0]
ts, sr = librosa.load(sample_insect)

mfcc_feat_insect = mfcc(ts, sr)
# fbank_feat = logfbank(sig,rate)

print mfcc_feat_insect.shape

print(mfcc_feat_insect[1:3,:])

print np.mean(mfcc_feat_insect, axis=0)


(500, 13)
[[ -4.68614246  12.62423878 -24.97087085   6.03759623 -27.55374851
  -11.81426764 -28.00337788 -13.32439396 -27.37921945 -25.95990156
  -31.98620766 -25.91547358  -5.94544254]
 [ -4.59113579  16.04960039 -22.70048431  13.46216773 -21.45153629
   -0.65244403 -20.716485    -5.09580855 -22.62683579 -18.44728867
  -23.76891668 -11.43795649   5.51002662]]
[ -3.72910268  18.22257038 -15.26249055  10.25543244 -15.56550214
  -6.17518359 -12.04130746  -0.9019003  -19.86614078 -17.49182495
 -18.15052032 -10.77752176  -0.78273398]

In [8]:
def extract_feature(file_name):
    X, sample_rate = librosa.load(file_name)
    stft = np.abs(librosa.stft(X))
    mfccs = np.mean(librosa.feature.mfcc(y=X, sr=sample_rate, n_mfcc=40).T,axis=0)
    chroma = np.mean(librosa.feature.chroma_stft(S=stft, sr=sample_rate).T,axis=0)
    mel = np.mean(librosa.feature.melspectrogram(X, sr=sample_rate).T,axis=0)
    contrast = np.mean(librosa.feature.spectral_contrast(S=stft, sr=sample_rate).T,axis=0)
    tonnetz = np.mean(librosa.feature.tonnetz(y=librosa.effects.harmonic(X), sr=sample_rate).T,axis=0)
    return mfccs,chroma,mel,contrast,tonnetz

In [9]:
features = np.empty((0,193))
for k, v in samples_dict.iteritems():
    if k not in ['insects', 'rooster']:
        continue
    for i in v:
        mfccs, chroma, mel, contrast,tonnetz = extract_feature(i)
        ext_features = np.hstack([mfccs,chroma,mel,contrast,tonnetz])
        features = np.vstack([features,ext_features])
features = np.array(features)

In [10]:
print features.shape
print features


(76, 193)
[[ -2.71008667e+02   1.11177134e+02  -2.66969894e+01 ...,  -2.03544718e-01
    5.38986268e-02   1.56129083e-02]
 [ -1.56407503e+02   9.77251668e+01  -1.07476905e+01 ...,  -2.87953000e-02
    1.67113321e-02  -1.69867642e-02]
 [ -3.29452760e+02   8.12510017e+01  -1.36530716e+01 ...,   5.45740443e-02
    3.79722129e-03   1.49923403e-03]
 ..., 
 [ -3.63268630e+02   6.90050961e+01  -3.72877700e+01 ...,   5.50453641e-02
    1.28585464e-02   2.33410783e-02]
 [ -3.84840993e+02   1.69023967e+01  -5.72822369e+01 ...,  -2.54607864e-02
    2.36396857e-03   1.05883214e-02]
 [ -4.02324001e+02   5.29785707e+01  -1.98304410e+01 ...,   1.55105148e-02
    2.81266963e-04   2.88463003e-03]]

In [11]:
km = KMeans(2).fit(features)
# cluster_centers_indices = af.cluster_centers_indices_
labels = km.labels_
print labels


[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
 0 0]

In [12]:
af = AffinityPropagation(damping=0.5, preference=None).fit(features)
cluster_centers_indices = af.cluster_centers_indices_
labels = af.labels_
print labels


[ 0  2  1  1  1  2  2  7  1  1  2  1  1  1  7  7  1  7  1  1  7  7  3  1  2
  1  1  1  1  2  1  1  1  1  1  2  2  8  7  9  4  5  8  7  9  7  7  9  7  5
  6  8  8  9  7  7  5  7  7  8  7  8  9  7  7  7  7 10 11  8  7  7  8  7  7
  7]

In [13]:
spectral = SpectralClustering(2).fit(features)
labels = spectral.labels_
print labels


[0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0
 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0
 0 0]
/home/sanket/anaconda/lib/python2.7/site-packages/sklearn/manifold/spectral_embedding_.py:229: UserWarning: Graph is not fully connected, spectral embedding may not work as expected.
  warnings.warn("Graph is not fully connected, spectral embedding"

In [14]:
from sklearn.decomposition import PCA

pca = PCA(n_components=2)
X_r = pca.fit(features).transform(features)

In [15]:
print X_r.shape
labels = ['insects', 'rooster']
y = np.array([0] * 38 + [1] * 38)
print y.shape


(76, 2)
(76,)

In [17]:
import matplotlib.pyplot as plt

# Percentage of variance explained for each components
print('explained variance ratio (first two components): %s'
      % str(pca.explained_variance_ratio_))

plt.figure()
colors = ['navy', 'darkorange']
lw = 2

for color, i, target_name in zip(colors, [0, 1], labels):
    plt.scatter(X_r[y == i, 0], X_r[y == i, 1], color=color, alpha=.8, lw=lw,
                label=target_name)
plt.legend(loc='best', shadow=False, scatterpoints=1)
plt.title('PCA of sample sound dataset')
plt.show()


explained variance ratio (first two components): [ 0.50755213  0.19593257]

In [ ]: