{"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":"\n! pip install py7zr\n# unpacking the dataset\nfrom py7zr import unpack_7zarchive \n\n#operating system libraries\nimport shutil\nimport warnings\nwarnings.filterwarnings(\"ignore\")\nimport tensorflow \nimport os\nimport librosa\nimport IPython.display as ipd\nimport matplotlib.pyplot as plt\nimport numpy as np\nfrom scipy.io import wavfile","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-12-08T16:55:22.352506Z","iopub.execute_input":"2022-12-08T16:55:22.353699Z","iopub.status.idle":"2022-12-08T16:55:34.192085Z","shell.execute_reply.started":"2022-12-08T16:55:22.353660Z","shell.execute_reply":"2022-12-08T16:55:34.190743Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"shutil.register_unpack_format('7zip', ['.7z'], unpack_7zarchive)\nshutil.unpack_archive('/kaggle/input/tensorflow-speech-recognition-challenge/train.7z', '/kaggle/working/tensorflow-speech-recognition-challenge/train/')","metadata":{"execution":{"iopub.status.busy":"2022-12-08T16:55:34.195001Z","iopub.execute_input":"2022-12-08T16:55:34.195482Z","iopub.status.idle":"2022-12-08T17:06:14.370135Z","shell.execute_reply.started":"2022-12-08T16:55:34.195438Z","shell.execute_reply":"2022-12-08T17:06:14.369009Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Data Exploration and Visualization\ntrain_audio_path = '/kaggle/working/tensorflow-speech-recognition-challenge/train/train/audio/'\nsamples, sample_rate = librosa.load(train_audio_path+'yes/0a7c2a8d_nohash_0.wav', sr = 16000)\nfig = plt.figure(figsize=(14, 8))\nax1 = fig.add_subplot(211)\nax1.set_title('Raw wave of ' + '/kaggle/working/tensorflow-speech-recognition-challenge/train/train/audio/')\nax1.set_xlabel('time')\nax1.set_ylabel('Amplitude')\nax1.plot(np.linspace(0, sample_rate/len(samples), sample_rate), samples)","metadata":{"execution":{"iopub.status.busy":"2022-12-08T17:06:14.372010Z","iopub.execute_input":"2022-12-08T17:06:14.372483Z","iopub.status.idle":"2022-12-08T17:06:15.551754Z","shell.execute_reply.started":"2022-12-08T17:06:14.372437Z","shell.execute_reply":"2022-12-08T17:06:15.550245Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Sampling rate\nipd.Audio(samples, rate=sample_rate)\nprint(sample_rate)","metadata":{"execution":{"iopub.status.busy":"2022-12-08T17:06:15.554565Z","iopub.execute_input":"2022-12-08T17:06:15.555457Z","iopub.status.idle":"2022-12-08T17:06:15.566489Z","shell.execute_reply.started":"2022-12-08T17:06:15.555413Z","shell.execute_reply":"2022-12-08T17:06:15.565210Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Understand the number of recordings\nlabels=os.listdir(train_audio_path)\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=(35,10))\nindex = np.arange(len(labels))\nplt.bar(index, no_of_recordings)\nplt.xlabel('Commands', fontsize=18)\nplt.ylabel('No of recordings', fontsize=18)\nplt.xticks(index, labels, fontsize=20, rotation=60)\nplt.title('No. of recordings for each command')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-12-08T17:06:15.568133Z","iopub.execute_input":"2022-12-08T17:06:15.568615Z","iopub.status.idle":"2022-12-08T17:06:16.105757Z","shell.execute_reply.started":"2022-12-08T17:06:15.568569Z","shell.execute_reply":"2022-12-08T17:06:16.104778Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Duration of recordings\nlabels=[\"yes\", \"no\", \"up\", \"down\", \"left\", \"right\", \"on\", \"off\", \"stop\", \"go\"]\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":{"execution":{"iopub.status.busy":"2022-12-08T17:06:16.106733Z","iopub.execute_input":"2022-12-08T17:06:16.107126Z","iopub.status.idle":"2022-12-08T17:06:17.998292Z","shell.execute_reply.started":"2022-12-08T17:06:16.107077Z","shell.execute_reply":"2022-12-08T17:06:17.996796Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"! pip install noisereduce\nimport noisereduce as nr\n# Noise Reduction\nfs=16000\nipd.Audio(samples, rate=fs)  #before noise reduction\nprint(\"Sample Rate:\",fs)\nsr=fs\n\ntime = np.linspace(0, len(samples - 1) / fs, len(samples - 1))\nreduced_noise1 = nr.reduce_noise(y=samples, sr=fs,stationary=True)\nplt.plot(time, reduced_noise1)  # plot in seconds\nplt.xlabel(\"Time [seconds]\")\nplt.ylabel(\"Voice amplitude\")\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-12-08T17:06:47.763209Z","iopub.execute_input":"2022-12-08T17:06:47.763614Z","iopub.status.idle":"2022-12-08T17:07:01.525658Z","shell.execute_reply.started":"2022-12-08T17:06:47.763582Z","shell.execute_reply":"2022-12-08T17:07:01.524610Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ipd.Audio(reduced_noise1, rate=sample_rate)","metadata":{"execution":{"iopub.status.busy":"2022-12-08T17:07:07.958179Z","iopub.execute_input":"2022-12-08T17:07:07.958637Z","iopub.status.idle":"2022-12-08T17:07:07.970940Z","shell.execute_reply.started":"2022-12-08T17:07:07.958598Z","shell.execute_reply":"2022-12-08T17:07:07.969222Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"! pip install webrtcvad\nimport malaya_speech\n#Silence Removal\nvad = malaya_speech.vad.webrtc()\ny=reduced_noise1\ny_= malaya_speech.resample(y, sr, 16000)\ny_ = malaya_speech.astype.float_to_int(y_)\nframes = malaya_speech.generator.frames(y, 30, sr)\nframes_ = list(malaya_speech.generator.frames(y_, 30, 16000, append_ending_trail = False))\nframes_webrtc = [(frames[no], vad(frame)) for no, frame in enumerate(frames_)]\ny_ = malaya_speech.combine.without_silent(frames_webrtc)","metadata":{"execution":{"iopub.status.busy":"2022-12-08T17:08:20.099724Z","iopub.execute_input":"2022-12-08T17:08:20.100146Z","iopub.status.idle":"2022-12-08T17:08:37.429475Z","shell.execute_reply.started":"2022-12-08T17:08:20.100105Z","shell.execute_reply":"2022-12-08T17:08:37.428329Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ipd.Audio(y_, rate = sr )     ","metadata":{"execution":{"iopub.status.busy":"2022-12-08T17:08:46.415133Z","iopub.execute_input":"2022-12-08T17:08:46.417360Z","iopub.status.idle":"2022-12-08T17:08:46.426779Z","shell.execute_reply.started":"2022-12-08T17:08:46.417303Z","shell.execute_reply":"2022-12-08T17:08:46.425495Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sr=8000   # sample rate\nvad = malaya_speech.vad.webrtc()\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":{"execution":{"iopub.status.busy":"2022-12-08T17:29:48.226910Z","iopub.execute_input":"2022-12-08T17:29:48.227330Z","iopub.status.idle":"2022-12-08T17:36:21.508797Z","shell.execute_reply.started":"2022-12-08T17:29:48.227298Z","shell.execute_reply":"2022-12-08T17:36:21.507248Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"shape of waves array\",np.array(all_wave).shape)\nprint(\"shape of labels array\",np.array(all_label).shape)\n\n#Inspecting random sample\ntime = np.linspace(0, len(signal - 1) / fs, len(signal - 1))\nplt.plot(time,np.array(all_wave)[2000,:])\nprint(np.array(all_label)[2000])\nipd.Audio(np.array(all_wave)[2000,:], rate = sr )","metadata":{"execution":{"iopub.status.busy":"2022-12-08T17:37:15.352272Z","iopub.execute_input":"2022-12-08T17:37:15.352763Z","iopub.status.idle":"2022-12-08T17:37:16.073550Z","shell.execute_reply.started":"2022-12-08T17:37:15.352721Z","shell.execute_reply":"2022-12-08T17:37:16.072340Z"},"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":{"execution":{"iopub.status.busy":"2022-12-08T17:38:21.029708Z","iopub.execute_input":"2022-12-08T17:38:21.030231Z","iopub.status.idle":"2022-12-08T17:38:21.045313Z","shell.execute_reply.started":"2022-12-08T17:38:21.030190Z","shell.execute_reply":"2022-12-08T17:38:21.043860Z"},"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":{"execution":{"iopub.status.busy":"2022-12-08T17:38:22.463230Z","iopub.execute_input":"2022-12-08T17:38:22.463692Z","iopub.status.idle":"2022-12-08T17:38:22.470428Z","shell.execute_reply.started":"2022-12-08T17:38:22.463653Z","shell.execute_reply":"2022-12-08T17:38:22.469121Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"all_wave = np.array(all_wave).reshape(-1,8000,1)","metadata":{"execution":{"iopub.status.busy":"2022-12-08T17:38:37.883254Z","iopub.execute_input":"2022-12-08T17:38:37.883708Z","iopub.status.idle":"2022-12-08T17:38:38.508380Z","shell.execute_reply.started":"2022-12-08T17:38:37.883669Z","shell.execute_reply":"2022-12-08T17:38:38.507224Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Split into train and validation set\nfrom 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.3,random_state=122,shuffle=True)","metadata":{"execution":{"iopub.status.busy":"2022-12-08T17:38:40.011242Z","iopub.execute_input":"2022-12-08T17:38:40.011647Z","iopub.status.idle":"2022-12-08T17:38:40.967150Z","shell.execute_reply.started":"2022-12-08T17:38:40.011605Z","shell.execute_reply":"2022-12-08T17:38:40.965896Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Model building\nfrom 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.4)(conv)\n\n#Second Conv1D layer\nconv = Conv1D(16, 11, padding='valid', activation='relu', strides=1)(conv)\nconv = MaxPooling1D(3)(conv)\nconv = Dropout(0.4)(conv)\n\n#Third Conv1D layer\nconv = Conv1D(32, 9, padding='valid', activation='relu', strides=1)(conv)\nconv = MaxPooling1D(3)(conv)\nconv = Dropout(0.4)(conv)\n\n#Fourth Conv1D layer\nconv = Conv1D(64, 7, padding='valid', activation='relu', strides=1)(conv)\nconv = MaxPooling1D(3)(conv)\nconv = Dropout(0.3)(conv)\n\n#Flatten layer\nconv = Flatten()(conv)\n\n#Dense Layer 1\nconv = Dense(256, activation='relu')(conv)\n\n#Dense Layer 2\nconv = Dense(128, activation='relu')(conv)\nconv = Dropout(0.4)(conv)\n\noutputs = Dense(len(labels), activation='softmax')(conv)\n\nmodel = Model(inputs, outputs)\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2022-12-08T17:38:45.543925Z","iopub.execute_input":"2022-12-08T17:38:45.545073Z","iopub.status.idle":"2022-12-08T17:38:46.410573Z","shell.execute_reply.started":"2022-12-08T17:38:45.545025Z","shell.execute_reply":"2022-12-08T17:38:46.409108Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy'])","metadata":{"execution":{"iopub.status.busy":"2022-12-08T17:38:52.079259Z","iopub.execute_input":"2022-12-08T17:38:52.079758Z","iopub.status.idle":"2022-12-08T17:38:52.099903Z","shell.execute_reply.started":"2022-12-08T17:38:52.079719Z","shell.execute_reply":"2022-12-08T17:38:52.098446Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"es = EarlyStopping(monitor='val_loss', mode='min', verbose=1, patience=10, min_delta=0.0001) \nmc = ModelCheckpoint('best_model.hdf5', monitor='val_acc', verbose=1, save_best_only=True, mode='max')","metadata":{"execution":{"iopub.status.busy":"2022-12-08T17:38:53.904386Z","iopub.execute_input":"2022-12-08T17:38:53.904869Z","iopub.status.idle":"2022-12-08T17:38:53.912006Z","shell.execute_reply.started":"2022-12-08T17:38:53.904830Z","shell.execute_reply":"2022-12-08T17:38:53.910631Z"},"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":{"execution":{"iopub.status.busy":"2022-12-08T17:38:54.964051Z","iopub.execute_input":"2022-12-08T17:38:54.964470Z","iopub.status.idle":"2022-12-08T18:06:39.168562Z","shell.execute_reply.started":"2022-12-08T17:38:54.964437Z","shell.execute_reply":"2022-12-08T18:06:39.167269Z"},"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":{"execution":{"iopub.status.busy":"2022-12-08T18:06:47.471730Z","iopub.execute_input":"2022-12-08T18:06:47.472195Z","iopub.status.idle":"2022-12-08T18:06:47.719754Z","shell.execute_reply.started":"2022-12-08T18:06:47.472157Z","shell.execute_reply":"2022-12-08T18:06:47.717895Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Loading the best model\nfrom keras.models import load_model\nmodel=load_model('best_model.hdf5')","metadata":{"execution":{"iopub.status.busy":"2022-12-08T18:06:54.396346Z","iopub.execute_input":"2022-12-08T18:06:54.396815Z","iopub.status.idle":"2022-12-08T18:06:54.456535Z","shell.execute_reply.started":"2022-12-08T18:06:54.396776Z","shell.execute_reply":"2022-12-08T18:06:54.454027Z"},"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":{"execution":{"iopub.status.busy":"2022-12-08T18:12:05.693959Z","iopub.execute_input":"2022-12-08T18:12:05.694546Z","iopub.status.idle":"2022-12-08T18:12:05.701361Z","shell.execute_reply.started":"2022-12-08T18:12:05.694501Z","shell.execute_reply":"2022-12-08T18:12:05.699890Z"},"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=16000)\nprint(\"Text:\",predict(samples))","metadata":{"execution":{"iopub.status.busy":"2022-12-08T18:12:06.542407Z","iopub.execute_input":"2022-12-08T18:12:06.542841Z","iopub.status.idle":"2022-12-08T18:12:06.822645Z","shell.execute_reply.started":"2022-12-08T18:12:06.542803Z","shell.execute_reply":"2022-12-08T18:12:06.821737Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"! pip install sounddevice\n! pip install soundfile\nimport sounddevice as sd\nimport soundfile as sf\n\nsamplerate = 16000  \nduration = 1 # seconds\nfilename = 'yes.wav'\nprint(\"start\")\nmydata = sd.rec(int(samplerate * duration), samplerate=samplerate,\n    channels=1, blocking=True)\nprint(\"end\")\nsd.wait()\nsf.write(filename, mydata, samplerate)","metadata":{"execution":{"iopub.status.busy":"2022-12-08T18:17:56.040829Z","iopub.execute_input":"2022-12-08T18:17:56.042375Z","iopub.status.idle":"2022-12-08T18:18:22.136504Z","shell.execute_reply.started":"2022-12-08T18:17:56.042318Z","shell.execute_reply":"2022-12-08T18:18:22.134122Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"os.listdir('../input/voice-commands/prateek_voice_v2')\nfilepath='../input/voice-commands/prateek_voice_v2'","metadata":{"execution":{"iopub.status.busy":"2022-12-08T17:06:18.357921Z","iopub.status.idle":"2022-12-08T17:06:18.358411Z","shell.execute_reply.started":"2022-12-08T17:06:18.358217Z","shell.execute_reply":"2022-12-08T17:06:18.358237Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#reading the voice commands\nsamples, sample_rate = librosa.load(filepath + '/' + 'stop.wav', sr = 16000)\nipd.Audio(samples,rate=16000)","metadata":{"execution":{"iopub.status.busy":"2022-12-08T17:06:18.359577Z","iopub.status.idle":"2022-12-08T17:06:18.360119Z","shell.execute_reply.started":"2022-12-08T17:06:18.359903Z","shell.execute_reply":"2022-12-08T17:06:18.359923Z"},"trusted":true},"execution_count":null,"outputs":[]}]}