{"cells":[{"metadata":{"trusted":true},"cell_type":"code","source":"print(\"test GPU\")","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import os\nimport numpy as np\nfrom scipy.fftpack import fft\nfrom scipy.io import wavfile\nfrom scipy import signal\nfrom glob import glob\nimport re\nimport pandas as pd\nimport gc\nfrom scipy.io import wavfile\nfrom datetime import datetime\n\nfrom keras import optimizers, losses, activations, models\nfrom keras.layers import Convolution2D, Dense, Input, Flatten, Dropout, MaxPooling2D, BatchNormalization\nfrom sklearn.model_selection import train_test_split\nimport keras","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def custom_fft(y, fs):\n    T = 1.0 / fs\n    N = y.shape[0]\n    yf = fft(y)\n    xf = np.linspace(0.0, 1.0 / (2.0 * T), N // 2)\n    # FFT is simmetrical, so we take just the first half\n    # FFT is also complex, to we take just the real part (abs)\n    vals = 2.0 / N * np.abs(yf[0:N // 2])\n    return xf, vals\n\n\ndef log_specgram(audio, sample_rate, window_size=20,\n                 step_size=10, eps=1e-10):\n    nperseg = int(round(window_size * sample_rate / 1e3))\n    noverlap = int(round(step_size * sample_rate / 1e3))\n    freqs, times, spec = signal.spectrogram(audio,\n                                            fs=sample_rate,\n                                            window='hann',\n                                            nperseg=nperseg,\n                                            noverlap=noverlap,\n                                            detrend=False)\n    return freqs, times, np.log(spec.T.astype(np.float32) + eps)\n\n\ndef list_wavs_fname(dirpath, ext='wav'):\n    print(dirpath)\n    fpaths = glob(os.path.join(dirpath, r'*/*' + ext))\n    pat = r'.+/(\\w+)/\\w+\\.' + ext + '$'\n    labels = []\n    for fpath in fpaths:\n        r = re.match(pat, fpath)\n        if r:\n            labels.append(r.group(1))\n    pat = r'.+/(\\w+\\.' + ext + ')$'\n    fnames = []\n    for fpath in fpaths:\n        r = re.match(pat, fpath)\n        if r:\n            fnames.append(r.group(1))\n    return labels, fnames\n\n\ndef pad_audio(samples):\n    if len(samples) >= L:\n        return samples\n    else:\n        return np.pad(samples, pad_width=(L - len(samples), 0), mode='constant', constant_values=(0, 0))\n\n\ndef chop_audio(samples, L=16000, num=20):\n    for i in range(num):\n        beg = np.random.randint(0, len(samples) - L)\n        yield samples[beg: beg + L]\n\n\ndef label_transform(labels):\n    nlabels = []\n    for label in labels:\n        if label == '_background_noise_':\n            nlabels.append('silence')\n        elif label not in legal_labels:\n            nlabels.append('unknown')\n        else:\n            nlabels.append(label)\n    return pd.get_dummies(pd.Series(nlabels))\n\n\ndef model_cnn(x_train, y_train):\n    input_shape = (99, 81, 1)\n    nclass = 12\n    inp = Input(shape=input_shape)\n    norm_inp = BatchNormalization()(inp)\n    img_1 = Convolution2D(8, kernel_size=2, activation=activations.relu)(norm_inp)\n    img_1 = Convolution2D(8, kernel_size=2, activation=activations.relu)(img_1)\n    img_1 = MaxPooling2D(pool_size=(2, 2))(img_1)\n    img_1 = Dropout(rate=0.2)(img_1)\n    img_1 = Convolution2D(16, kernel_size=3, activation=activations.relu)(img_1)\n    img_1 = Convolution2D(16, kernel_size=3, activation=activations.relu)(img_1)\n    img_1 = MaxPooling2D(pool_size=(2, 2))(img_1)\n    img_1 = Dropout(rate=0.2)(img_1)\n    img_1 = Convolution2D(32, kernel_size=3, activation=activations.relu)(img_1)\n    img_1 = MaxPooling2D(pool_size=(2, 2))(img_1)\n    img_1 = Dropout(rate=0.2)(img_1)\n    img_1 = Flatten()(img_1)\n\n    dense_1 = BatchNormalization()(Dense(128, activation=activations.relu)(img_1))\n    dense_1 = BatchNormalization()(Dense(128, activation=activations.relu)(dense_1))\n    dense_1 = Dense(nclass, activation=activations.softmax)(dense_1)\n\n    model = models.Model(inputs=inp, outputs=dense_1)\n    opt = optimizers.Adam()\n\n    model.compile(optimizer=opt, loss=losses.binary_crossentropy)\n    model.summary()\n\n    x_train, x_valid, y_train, y_valid = train_test_split(x_train, y_train, test_size=0.1, random_state=2017)\n    model.fit(x_train, y_train, batch_size=16, validation_data=(x_valid, y_valid), epochs=3, shuffle=True, verbose=2)\n\n    model.save(os.path.join(model_path, 'cnn.model'))\n\n    return model\n\n\ndef test_data_generator(batch=16):\n    fpaths = glob(os.path.join(test_data_path, '*wav'))\n    i = 0\n    for path in fpaths:\n        if i == 0:\n            imgs = []\n            fnames = []\n        i += 1\n        rate, samples = wavfile.read(path)\n        samples = pad_audio(samples)\n        resampled = signal.resample(samples, int(new_sample_rate / rate * samples.shape[0]))\n        _, _, specgram = log_specgram(resampled, sample_rate=new_sample_rate)\n        imgs.append(specgram)\n        fnames.append(path.split('\\\\')[-1])\n        if i == batch:\n            i = 0\n            imgs = np.array(imgs)\n            imgs = imgs.reshape(tuple(list(imgs.shape) + [1]))\n            yield fnames, imgs\n    if i < batch:\n        imgs = np.array(imgs)\n        imgs = imgs.reshape(tuple(list(imgs.shape) + [1]))\n        yield fnames, imgs\n    raise StopIteration()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"if __name__ == \"__main__\":\n    gc.collect()    \n    L = 16000\n    legal_labels = 'yes no up down left right on off stop go silence unknown'.split()\n\n    # src folders\n    root_path = r'..'\n    out_path = r'.'\n    model_path = r'.'\n    train_data_path = os.path.join(root_path, 'input', 'train', 'audio')\n    test_data_path = os.path.join(root_path, 'test', 'audio')\n    \n    print(train_data_path)\n    \n    task_begin = datetime.now()\n    print(str(task_begin) + \" task begin\")\n\n    labels, fnames = list_wavs_fname(train_data_path)\n\n    new_sample_rate = 8000\n    y_train = []\n    x_train = []\n\n    xy_begin = datetime.now()\n    print(str(xy_begin) + \" xy begin\")\n\n    for label, fname in zip(labels, fnames):\n        sample_rate, samples = wavfile.read(os.path.join(train_data_path, label, fname))\n        samples = pad_audio(samples)\n        if len(samples) > 16000:\n            n_samples = chop_audio(samples)\n        else:\n            n_samples = [samples]\n        for samples in n_samples:\n            resampled = signal.resample(samples, int(new_sample_rate / sample_rate * samples.shape[0]))\n            _, _, specgram = log_specgram(resampled, sample_rate=new_sample_rate)\n            y_train.append(label)\n            x_train.append(specgram)\n\n    reshape_begin = datetime.now()\n    print(str(reshape_begin) + \" reshape begin\")\n    #print(os.listdir('../input/train/audio/'))\n    \n    x_train = np.array(x_train)\n    x_train = x_train.reshape(tuple(list(x_train.shape) + [1]))\n    y_train = label_transform(y_train)\n    label_index = y_train.columns.values\n    y_train = y_train.values\n    y_train = np.array(y_train)\n    del labels, fnames\n    gc.collect()\n\n    model_begin = datetime.now()\n    print(str(model_begin) + \" model begin\")\n    model = model_cnn(x_train, y_train)\n\n    predict_begin = datetime.now()\n    print(str(predict_begin) + \" predict begin\")\n\n    del x_train, y_train\n    gc.collect()","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"language":"python","name":"python3","display_name":"Python 3"},"language_info":{"name":"python","file_extension":".py","codemirror_mode":{"version":3,"name":"ipython"},"version":"3.6.3","nbconvert_exporter":"python","mimetype":"text/x-python","pygments_lexer":"ipython3"}},"nbformat":4,"nbformat_minor":1}