{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))","metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","execution":{"iopub.status.busy":"2022-04-30T10:43:26.830434Z","iopub.execute_input":"2022-04-30T10:43:26.831119Z","iopub.status.idle":"2022-04-30T10:43:26.841444Z","shell.execute_reply.started":"2022-04-30T10:43:26.83107Z","shell.execute_reply":"2022-04-30T10:43:26.840241Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from os.path import isdir, join\nfrom pathlib import Path\nimport pandas as pd\n\n# Math\nimport numpy as np\nfrom scipy.fftpack import fft\nfrom scipy import signal\nfrom scipy.io import wavfile\nimport librosa\n\nfrom sklearn.decomposition import PCA\n\n# Visualization\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport IPython.display as ipd\nimport librosa.display\n\nimport plotly.offline as py\npy.init_notebook_mode(connected=True)\nimport plotly.graph_objs as go\nimport plotly.tools as tls\nimport pandas as pd\n\n%matplotlib inline","metadata":{"execution":{"iopub.status.busy":"2022-04-30T10:43:26.844175Z","iopub.execute_input":"2022-04-30T10:43:26.845144Z","iopub.status.idle":"2022-04-30T10:43:29.274115Z","shell.execute_reply.started":"2022-04-30T10:43:26.845083Z","shell.execute_reply":"2022-04-30T10:43:29.273027Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport librosa   #for audio processing\nimport IPython.display as ipd\nimport matplotlib.pyplot as plt\nimport numpy as np\nfrom scipy.io import wavfile #for audio processing\nimport warnings\nwarnings.filterwarnings(\"ignore\")","metadata":{"_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","execution":{"iopub.status.busy":"2022-04-30T10:43:29.279138Z","iopub.execute_input":"2022-04-30T10:43:29.281951Z","iopub.status.idle":"2022-04-30T10:43:29.291488Z","shell.execute_reply.started":"2022-04-30T10:43:29.281903Z","shell.execute_reply":"2022-04-30T10:43:29.290289Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!apt-get install -y p7zip-full\n!7z x ../input/tensorflow-speech-recognition-challenge/train.7z","metadata":{"execution":{"iopub.status.busy":"2022-04-30T10:43:29.29832Z","iopub.execute_input":"2022-04-30T10:43:29.301364Z","iopub.status.idle":"2022-04-30T10:45:41.972447Z","shell.execute_reply.started":"2022-04-30T10:43:29.301317Z","shell.execute_reply":"2022-04-30T10:45:41.971336Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_audio_path = '../input/tensorflow-speech-recognition-challenge/train/audio/'","metadata":{"execution":{"iopub.status.busy":"2022-04-30T10:45:41.978024Z","iopub.execute_input":"2022-04-30T10:45:41.978407Z","iopub.status.idle":"2022-04-30T10:45:41.985081Z","shell.execute_reply.started":"2022-04-30T10:45:41.978371Z","shell.execute_reply":"2022-04-30T10:45:41.983598Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def 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)","metadata":{"execution":{"iopub.status.busy":"2022-04-30T10:45:41.987416Z","iopub.execute_input":"2022-04-30T10:45:41.988267Z","iopub.status.idle":"2022-04-30T10:45:42.360936Z","shell.execute_reply.started":"2022-04-30T10:45:41.988219Z","shell.execute_reply":"2022-04-30T10:45:42.359615Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_audio_path = 'train/audio/'\nfilename = 'yes/0a7c2a8d_nohash_0.wav'\nsample_rate, samples = wavfile.read(str(train_audio_path) + filename)\n\nfreqs, times, spectrogram = log_specgram(samples, sample_rate)\n\nfig = plt.figure(figsize=(14, 8))\nax1 = fig.add_subplot(211)\nax1.set_title('Raw wave of ' + filename)\nax1.set_ylabel('Amplitude')\nax1.plot(np.linspace(0, sample_rate/len(samples), sample_rate), samples)\n\nax2 = fig.add_subplot(212)\nax2.imshow(spectrogram.T, aspect='auto', origin='lower', \n           extent=[times.min(), times.max(), freqs.min(), freqs.max()])\nax2.set_yticks(freqs[::16])\nax2.set_xticks(times[::16])\nax2.set_title('Spectrogram of ' + filename)\nax2.set_ylabel('Freqs in Hz')\nax2.set_xlabel('Seconds')","metadata":{"execution":{"iopub.status.busy":"2022-04-30T10:45:42.365012Z","iopub.execute_input":"2022-04-30T10:45:42.36582Z","iopub.status.idle":"2022-04-30T10:45:42.888124Z","shell.execute_reply.started":"2022-04-30T10:45:42.365731Z","shell.execute_reply":"2022-04-30T10:45:42.886869Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"mean = np.mean(spectrogram, axis=0)\nstd = np.std(spectrogram, axis=0)\nspectrogram = (spectrogram - mean) / std","metadata":{"execution":{"iopub.status.busy":"2022-04-30T10:45:42.889597Z","iopub.execute_input":"2022-04-30T10:45:42.890021Z","iopub.status.idle":"2022-04-30T10:45:42.898078Z","shell.execute_reply.started":"2022-04-30T10:45:42.889979Z","shell.execute_reply":"2022-04-30T10:45:42.89688Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# We'll need numpy for some mathematical operations\nimport numpy as np\n\n# matplotlib for displaying the output\nimport matplotlib.pyplot as plt\n%matplotlib inline\n\n# and IPython.display for audio output\nimport IPython.display\n\n# Librosa for audio\nimport librosa\n# And the display module for visualization\nimport librosa.display","metadata":{"execution":{"iopub.status.busy":"2022-04-30T10:45:42.89961Z","iopub.execute_input":"2022-04-30T10:45:42.900376Z","iopub.status.idle":"2022-04-30T10:45:42.91166Z","shell.execute_reply.started":"2022-04-30T10:45:42.900328Z","shell.execute_reply":"2022-04-30T10:45:42.910369Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\naudio_path = librosa.util.example_audio_file()\n\n# or uncomment the line below and point it at your favorite song:\n#\n# audio_path = '/path/to/your/favorite/song.mp3'\n\ny, sr = librosa.load(audio_path)","metadata":{"execution":{"iopub.status.busy":"2022-04-30T10:45:42.913329Z","iopub.execute_input":"2022-04-30T10:45:42.914029Z","iopub.status.idle":"2022-04-30T10:45:47.74872Z","shell.execute_reply.started":"2022-04-30T10:45:42.913979Z","shell.execute_reply":"2022-04-30T10:45:47.74758Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n# Let's make and display a mel-scaled power (energy-squared) spectrogram\nS = librosa.feature.melspectrogram(y, sr=sr, n_mels=128)\n\n# Convert to log scale (dB). We'll use the peak power (max) as reference.\nlog_S = librosa.power_to_db(S, ref=np.max)\n\n# Make a new figure\nplt.figure(figsize=(12,4))\n\n# Display the spectrogram on a mel scale\n# sample rate and hop length parameters are used to render the time axis\nlibrosa.display.specshow(log_S, sr=sr, x_axis='time', y_axis='mel')\n\n# Put a descriptive title on the plot\nplt.title('mel power spectrogram')\n\n# draw a color bar\nplt.colorbar(format='%+02.0f dB')\n\n# Make the figure layout compact\nplt.tight_layout()","metadata":{"execution":{"iopub.status.busy":"2022-04-30T10:45:47.750656Z","iopub.execute_input":"2022-04-30T10:45:47.751088Z","iopub.status.idle":"2022-04-30T10:45:48.427333Z","shell.execute_reply.started":"2022-04-30T10:45:47.751045Z","shell.execute_reply":"2022-04-30T10:45:48.426154Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"mfcc = librosa.feature.mfcc(S=log_S, n_mfcc=13)\n\n# Let's pad on the first and second deltas while we're at it\ndelta2_mfcc = librosa.feature.delta(mfcc, order=2)\n\nplt.figure(figsize=(12, 4))\nlibrosa.display.specshow(delta2_mfcc)\nplt.ylabel('MFCC coeffs')\nplt.xlabel('Time')\nplt.title('MFCC')\nplt.colorbar()\nplt.tight_layout()","metadata":{"execution":{"iopub.status.busy":"2022-04-30T10:45:48.429168Z","iopub.execute_input":"2022-04-30T10:45:48.42992Z","iopub.status.idle":"2022-04-30T10:45:48.685225Z","shell.execute_reply.started":"2022-04-30T10:45:48.429869Z","shell.execute_reply":"2022-04-30T10:45:48.683989Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ipd.Audio(samples, rate=sample_rate)\nsamples_cut = samples[4000:13000]\nipd.Audio(samples_cut, rate=sample_rate)","metadata":{"execution":{"iopub.status.busy":"2022-04-30T10:45:48.686906Z","iopub.execute_input":"2022-04-30T10:45:48.687589Z","iopub.status.idle":"2022-04-30T10:45:48.705685Z","shell.execute_reply.started":"2022-04-30T10:45:48.687527Z","shell.execute_reply":"2022-04-30T10:45:48.70461Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"freqs, times, spectrogram_cut = log_specgram(samples_cut, sample_rate)\n\nfig = plt.figure(figsize=(14, 8))\nax1 = fig.add_subplot(211)\nax1.set_title('Raw wave of ' + filename)\nax1.set_ylabel('Amplitude')\nax1.plot(samples_cut)\n\nax2 = fig.add_subplot(212)\nax2.set_title('Spectrogram of ' + filename)\nax2.set_ylabel('Frequencies * 0.1')\nax2.set_xlabel('Samples')\nax2.imshow(spectrogram_cut.T, aspect='auto', origin='lower', \n           extent=[times.min(), times.max(), freqs.min(), freqs.max()])\nax2.set_yticks(freqs[::16])\nax2.set_xticks(times[::16])\nax2.text(0.06, 1000, 'Y', fontsize=18)\nax2.text(0.17, 1000, 'E', fontsize=18)\nax2.text(0.36, 1000, 'S', fontsize=18)\n\nxcoords = [0.025, 0.11, 0.23, 0.49]\nfor xc in xcoords:\n    ax1.axvline(x=xc*16000, c='r')\n    ax2.axvline(x=xc, c='r')","metadata":{"execution":{"iopub.status.busy":"2022-04-30T10:45:48.709342Z","iopub.execute_input":"2022-04-30T10:45:48.709631Z","iopub.status.idle":"2022-04-30T10:45:49.148897Z","shell.execute_reply.started":"2022-04-30T10:45:48.709603Z","shell.execute_reply":"2022-04-30T10:45:49.147483Z"},"trusted":true},"execution_count":null,"outputs":[]},{"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    vals = 2.0/N * np.abs(yf[0:N//2])  # FFT is simmetrical, so we take just the first half\n    # FFT is also complex, to we take just the real part (abs)\n    return xf, vals","metadata":{"execution":{"iopub.status.busy":"2022-04-30T10:45:49.150828Z","iopub.execute_input":"2022-04-30T10:45:49.151609Z","iopub.status.idle":"2022-04-30T10:45:49.161114Z","shell.execute_reply.started":"2022-04-30T10:45:49.151567Z","shell.execute_reply":"2022-04-30T10:45:49.159559Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"filename = '/happy/0b09edd3_nohash_0.wav'\nnew_sample_rate = 8000\n\nsample_rate, samples = wavfile.read(str(train_audio_path) + filename)\nresampled = signal.resample(samples, int(new_sample_rate/sample_rate * samples.shape[0]))","metadata":{"execution":{"iopub.status.busy":"2022-04-30T10:45:49.163073Z","iopub.execute_input":"2022-04-30T10:45:49.163955Z","iopub.status.idle":"2022-04-30T10:45:49.177871Z","shell.execute_reply.started":"2022-04-30T10:45:49.163892Z","shell.execute_reply":"2022-04-30T10:45:49.176793Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ipd.Audio(samples, rate=sample_rate)","metadata":{"execution":{"iopub.status.busy":"2022-04-30T10:45:49.179728Z","iopub.execute_input":"2022-04-30T10:45:49.180572Z","iopub.status.idle":"2022-04-30T10:45:49.194963Z","shell.execute_reply.started":"2022-04-30T10:45:49.180521Z","shell.execute_reply":"2022-04-30T10:45:49.193674Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ipd.Audio(resampled, rate=new_sample_rate)","metadata":{"execution":{"iopub.status.busy":"2022-04-30T10:45:49.197394Z","iopub.execute_input":"2022-04-30T10:45:49.198181Z","iopub.status.idle":"2022-04-30T10:45:49.207599Z","shell.execute_reply.started":"2022-04-30T10:45:49.198119Z","shell.execute_reply":"2022-04-30T10:45:49.206316Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"xf, vals = custom_fft(samples, sample_rate)\nplt.figure(figsize=(12, 4))\nplt.title('FFT of recording sampled with ' + str(sample_rate) + ' Hz')\nplt.plot(xf, vals)\nplt.xlabel('Frequency')\nplt.grid()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-04-30T10:45:49.215799Z","iopub.execute_input":"2022-04-30T10:45:49.21612Z","iopub.status.idle":"2022-04-30T10:45:49.423143Z","shell.execute_reply.started":"2022-04-30T10:45:49.216088Z","shell.execute_reply":"2022-04-30T10:45:49.421844Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"xf, vals = custom_fft(resampled, new_sample_rate)\nplt.figure(figsize=(12, 4))\nplt.title('FFT of recording sampled with ' + str(new_sample_rate) + ' Hz')\nplt.plot(xf, vals)\nplt.xlabel('Frequency')\nplt.grid()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-04-30T10:45:49.425114Z","iopub.execute_input":"2022-04-30T10:45:49.425826Z","iopub.status.idle":"2022-04-30T10:45:49.631703Z","shell.execute_reply.started":"2022-04-30T10:45:49.425776Z","shell.execute_reply":"2022-04-30T10:45:49.630516Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"filenames = ['on/004ae714_nohash_0.wav', 'on/0137b3f4_nohash_0.wav']\nfor filename in filenames:\n    sample_rate, samples = wavfile.read(str(train_audio_path) + filename)\n    xf, vals = custom_fft(samples, sample_rate)\n    plt.figure(figsize=(12, 4))\n    plt.title('FFT of speaker ' + filename[4:11])\n    plt.plot(xf, vals)\n    plt.xlabel('Frequency')\n    plt.grid()\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2022-04-30T10:45:49.633363Z","iopub.execute_input":"2022-04-30T10:45:49.634071Z","iopub.status.idle":"2022-04-30T10:45:50.035133Z","shell.execute_reply.started":"2022-04-30T10:45:49.634026Z","shell.execute_reply":"2022-04-30T10:45:50.033857Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('Speaker ' + filenames[0][4:11])\nipd.Audio(join(train_audio_path, filenames[0]))","metadata":{"execution":{"iopub.status.busy":"2022-04-30T10:45:50.036954Z","iopub.execute_input":"2022-04-30T10:45:50.037619Z","iopub.status.idle":"2022-04-30T10:45:50.053641Z","shell.execute_reply.started":"2022-04-30T10:45:50.037573Z","shell.execute_reply":"2022-04-30T10:45:50.052068Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('Speaker ' + filenames[1][4:11])\nipd.Audio(join(train_audio_path, filenames[1]))","metadata":{"execution":{"iopub.status.busy":"2022-04-30T10:45:50.055643Z","iopub.execute_input":"2022-04-30T10:45:50.056138Z","iopub.status.idle":"2022-04-30T10:45:50.071206Z","shell.execute_reply.started":"2022-04-30T10:45:50.056092Z","shell.execute_reply":"2022-04-30T10:45:50.069695Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"filename = '/yes/01bb6a2a_nohash_1.wav'\nsample_rate, samples = wavfile.read(str(train_audio_path) + filename)\nfreqs, times, spectrogram = log_specgram(samples, sample_rate)\n\nplt.figure(figsize=(10, 7))\nplt.title('Spectrogram of ' + filename)\nplt.ylabel('Freqs')\nplt.xlabel('Time')\nplt.imshow(spectrogram.T, aspect='auto', origin='lower', \n           extent=[times.min(), times.max(), freqs.min(), freqs.max()])\nplt.yticks(freqs[::16])\nplt.xticks(times[::16])\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-04-30T10:45:50.072996Z","iopub.execute_input":"2022-04-30T10:45:50.073669Z","iopub.status.idle":"2022-04-30T10:45:50.465639Z","shell.execute_reply.started":"2022-04-30T10:45:50.073622Z","shell.execute_reply":"2022-04-30T10:45:50.46447Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dirs = [f for f in os.listdir(train_audio_path) if isdir(join(train_audio_path, f))]\ndirs.sort()\nprint('Number of labels: ' + str(len(dirs)))","metadata":{"execution":{"iopub.status.busy":"2022-04-30T10:45:50.467372Z","iopub.execute_input":"2022-04-30T10:45:50.467923Z","iopub.status.idle":"2022-04-30T10:45:50.477168Z","shell.execute_reply.started":"2022-04-30T10:45:50.467883Z","shell.execute_reply":"2022-04-30T10:45:50.475775Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"num_of_shorter = 0\nfor direct in dirs:\n    waves = [f for f in os.listdir(join(train_audio_path, direct)) if f.endswith('.wav')]\n    for wav in waves:\n        sample_rate, samples = wavfile.read(train_audio_path + direct + '/' + wav)\n        if samples.shape[0] < sample_rate:\n            num_of_shorter += 1\nprint('Number of recordings shorter than 1 second: ' + str(num_of_shorter))","metadata":{"execution":{"iopub.status.busy":"2022-04-30T10:45:50.47918Z","iopub.execute_input":"2022-04-30T10:45:50.480004Z","iopub.status.idle":"2022-04-30T10:45:54.192318Z","shell.execute_reply.started":"2022-04-30T10:45:50.479958Z","shell.execute_reply":"2022-04-30T10:45:54.191058Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"to_keep = 'yes no up down left right on off stop go'.split()\ndirs = [d for d in dirs if d in to_keep]\n\nprint(dirs)\n\nfor direct in dirs:\n    vals_all = []\n    spec_all = []\n\n    waves = [f for f in os.listdir(join(train_audio_path, direct)) if f.endswith('.wav')]\n    for wav in waves:\n        sample_rate, samples = wavfile.read(train_audio_path + direct + '/' + wav)\n        if samples.shape[0] != 16000:\n            continue\n        xf, vals = custom_fft(samples, 16000)\n        vals_all.append(vals)\n        freqs, times, spec = log_specgram(samples, 16000)\n        spec_all.append(spec)\n\n    plt.figure(figsize=(14, 4))\n    plt.subplot(121)\n    plt.title('Mean fft of ' + direct)\n    plt.plot(np.mean(np.array(vals_all), axis=0))\n    plt.grid()\n    plt.subplot(122)\n    plt.title('Mean specgram of ' + direct)\n    plt.imshow(np.mean(np.array(spec_all), axis=0).T, aspect='auto', origin='lower', \n               extent=[times.min(), times.max(), freqs.min(), freqs.max()])\n    plt.yticks(freqs[::16])\n    plt.xticks(times[::16])\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2022-04-30T10:45:54.197519Z","iopub.execute_input":"2022-04-30T10:45:54.200114Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def violinplot_frequency(dirs, freq_ind):\n    \"\"\" Plot violinplots for given words (waves in dirs) and frequency freq_ind\n    from all frequencies freqs.\"\"\"\n\n    spec_all = []  # Contain spectrograms\n    ind = 0\n    for direct in dirs:\n        spec_all.append([])\n\n        waves = [f for f in os.listdir(join(train_audio_path, direct)) if\n                 f.endswith('.wav')]\n        for wav in waves[:100]:\n            sample_rate, samples = wavfile.read(\n                train_audio_path + direct + '/' + wav)\n            freqs, times, spec = log_specgram(samples, sample_rate)\n            spec_all[ind].extend(spec[:, freq_ind])\n        ind += 1\n\n    # Different lengths = different num of frames. Make number equal\n    minimum = min([len(spec) for spec in spec_all])\n    spec_all = np.array([spec[:minimum] for spec in spec_all])\n\n    plt.figure(figsize=(13,7))\n    plt.title('Frequency ' + str(freqs[freq_ind]) + ' Hz')\n    plt.ylabel('Amount of frequency in a word')\n    plt.xlabel('Words')\n    sns.violinplot(data=pd.DataFrame(spec_all.T, columns=dirs))\n    plt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"violinplot_frequency(dirs, 20)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"violinplot_frequency(dirs, 50)\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"violinplot_frequency(dirs, 120)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fft_all = []\nnames = []\nfor direct in dirs:\n    waves = [f for f in os.listdir(join(train_audio_path, direct)) if f.endswith('.wav')]\n    for wav in waves:\n        sample_rate, samples = wavfile.read(train_audio_path + direct + '/' + wav)\n        if samples.shape[0] != sample_rate:\n            samples = np.append(samples, np.zeros((sample_rate - samples.shape[0], )))\n        x, val = custom_fft(samples, sample_rate)\n        fft_all.append(val)\n        names.append(direct + '/' + wav)\n\nfft_all = np.array(fft_all)\n\n# Normalization\nfft_all = (fft_all - np.mean(fft_all, axis=0)) / np.std(fft_all, axis=0)\n\n# Dim reduction\npca = PCA(n_components=3)\nfft_all = pca.fit_transform(fft_all)\n\ndef interactive_3d_plot(data, names):\n    scatt = go.Scatter3d(x=data[:, 0], y=data[:, 1], z=data[:, 2], mode='markers', text=names)\n    data = go.Data([scatt])\n    layout = go.Layout(title=\"Anomaly detection\")\n    figure = go.Figure(data=data, layout=layout)\n    py.iplot(figure)\n    \ninteractive_3d_plot(fft_all, names)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('Recording go/0487ba9b_nohash_0.wav')\nipd.Audio(join(train_audio_path, 'go/0487ba9b_nohash_0.wav'))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('Recording yes/e4b02540_nohash_0.wav')\nipd.Audio(join(train_audio_path, 'yes/e4b02540_nohash_0.wav'))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('Recording seven/e4b02540_nohash_0.wav')\nipd.Audio(join(train_audio_path, 'seven/b1114e4f_nohash_0.wav'))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"samples=np.array(samples, dtype='float64')\n\nsamples = librosa.resample(samples, sample_rate, 8000)\nipd.Audio(samples, rate=8000)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\nlabels=os.listdir(train_audio_path)\n\n#find count of each label and plot bar graph\nno_of_recordings=[]\nfor label in labels:\n    waves = [f for f in os.listdir(train_audio_path + '/'+ label) if f.endswith('.wav')]\n    no_of_recordings.append(len(waves))\n    \n#plot\nplt.figure(figsize=(30,5))\nindex = np.arange(len(labels))\nplt.bar(index, no_of_recordings)\nplt.xlabel('Commands', fontsize=12)\nplt.ylabel('No of recordings', fontsize=12)\nplt.xticks(index, labels, fontsize=15, rotation=60)\nplt.title('No. of recordings for each command')\nplt.show()\n\nlabels=[\"yes\", \"no\", \"up\", \"down\", \"left\", \"right\", \"on\", \"off\", \"stop\", \"go\"]","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\nduration_of_recordings=[]\nfor label in labels:\n    waves = [f for f in os.listdir(train_audio_path + '/'+ label) if f.endswith('.wav')]\n    for wav in waves:\n        sample_rate, samples = wavfile.read(train_audio_path + '/' + label + '/' + wav)\n        duration_of_recordings.append(float(len(samples)/sample_rate))\n    \nplt.hist(np.array(duration_of_recordings))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_audio_path = 'train/audio/'\n\nall_wave = []\nall_label = []\nfor label in labels:\n    print(label)\n    waves = [f for f in os.listdir(train_audio_path + '/'+ label) if f.endswith('.wav')]\n    for wav in waves:\n        samples, sample_rate = librosa.load(train_audio_path + '/' + label + '/' + wav, sr = 16000)\n        samples = librosa.resample(samples, sample_rate, 8000)\n        if(len(samples)== 8000) : \n            all_wave.append(samples)\n            all_label.append(label)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.preprocessing import LabelEncoder\nle = LabelEncoder()\ny=le.fit_transform(all_label)\nclasses= list(le.classes_)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from keras.utils import np_utils\ny=np_utils.to_categorical(y, num_classes=len(labels))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"all_wave = np.array(all_wave).reshape(-1,8000,1)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\nx_tr, x_val, y_tr, y_val = train_test_split(np.array(all_wave),np.array(y),stratify=y,test_size = 0.2,random_state=777,shuffle=True)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from keras.layers import Dense, Dropout, Flatten, Conv1D, Input, MaxPooling1D\nfrom keras.models import Model\nfrom keras.callbacks import EarlyStopping, ModelCheckpoint\nfrom keras import backend as K\nK.clear_session()\n\ninputs = Input(shape=(8000,1))\n\n#First Conv1D layer\nconv = Conv1D(8,13, padding='valid', activation='relu', strides=1)(inputs)\nconv = MaxPooling1D(3)(conv)\nconv = Dropout(0.2)(conv)\n\n#Second Conv1D layer\nconv = Conv1D(16, 11, padding='valid', activation='relu', strides=1)(conv)\nconv = MaxPooling1D(3)(conv)\nconv = Dropout(0.2)(conv)\n\n#Third Conv1D layer\nconv = Conv1D(32, 9, padding='valid', activation='relu', strides=1)(conv)\nconv = MaxPooling1D(3)(conv)\nconv = Dropout(0.2)(conv)\n\n#Fourth Conv1D layer\nconv = Conv1D(64, 7, padding='valid', activation='relu', strides=1)(conv)\nconv = MaxPooling1D(3)(conv)\nconv = Dropout(0.2)(conv)\n\n#Flatten layer\nconv = Flatten()(conv)\n\n#Dense Layer 1\nconv = Dense(256, activation='relu')(conv)\nconv = Dropout(0.2)(conv)\n\n#Dense Layer 2\nconv = Dense(128, activation='relu')(conv)\nconv = Dropout(0.2)(conv)\n\noutputs = Dense(len(labels), activation='softmax')(conv)\n\nmodel = Model(inputs, outputs)\nmodel.summary()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.compile(loss='categorical_crossentropy',optimizer='sgd',metrics=['accuracy'])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"es = EarlyStopping(monitor='val_loss', mode='min', verbose=1, patience=10, min_delta=0.00001) \nmc = ModelCheckpoint('best_model.hdf5', monitor='val_acc', verbose=1, save_best_only=True, mode='max')","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history=model.fit(x_tr, y_tr ,epochs=100, callbacks=[es,mc], batch_size=32, validation_data=(x_val,y_val))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from matplotlib import pyplot \npyplot.plot(history.history['loss'], label='train') \npyplot.plot(history.history['val_loss'], label='test') \npyplot.legend()\npyplot.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def predict(audio):\n    prob=model.predict(audio.reshape(1,8000,1))\n    index=np.argmax(prob[0])\n    return classes[index]","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import random\nindex=random.randint(0,len(x_val)-1)\nsamples=x_val[index].ravel()\nprint(\"Audio:\",classes[np.argmax(y_val[index])])\nipd.Audio(samples, rate=8000)\nprint(\"Text:\",predict(samples))","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}