{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":7634,"databundleVersionId":46676,"sourceType":"competition"}],"dockerImageVersionId":30698,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport librosa\nimport IPython.display as ipd\nfrom IPython.display import Audio\nimport matplotlib.pyplot as plt\nimport numpy as np\nfrom matplotlib import pyplot \nfrom scipy.io import wavfile\nfrom pyunpack import Archive\nimport warnings \nimport py7zr\nwarnings.filterwarnings(\"ignore\")\nfrom sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2025-09-18T09:24:35.250624Z","iopub.execute_input":"2025-09-18T09:24:35.251109Z","iopub.status.idle":"2025-09-18T09:24:35.256580Z","shell.execute_reply.started":"2025-09-18T09:24:35.251082Z","shell.execute_reply":"2025-09-18T09:24:35.255622Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install py7zr ","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-18T09:23:41.665417Z","iopub.execute_input":"2025-09-18T09:23:41.665877Z","iopub.status.idle":"2025-09-18T09:24:10.012984Z","shell.execute_reply.started":"2025-09-18T09:23:41.665848Z","shell.execute_reply":"2025-09-18T09:24:10.011907Z"},"collapsed":true,"jupyter":{"outputs_hidden":true}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install pyunpack \n!pip install patool","metadata":{"execution":{"iopub.status.busy":"2025-09-18T09:24:10.014869Z","iopub.execute_input":"2025-09-18T09:24:10.015133Z","iopub.status.idle":"2025-09-18T09:24:28.585321Z","shell.execute_reply.started":"2025-09-18T09:24:10.015107Z","shell.execute_reply":"2025-09-18T09:24:28.584243Z"},"trusted":true,"collapsed":true,"jupyter":{"outputs_hidden":true}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"os.makedirs(\"./data\", exist_ok = True)\nArchive(\"/kaggle/input/tensorflow-speech-recognition-challenge/train.7z\").extractall(\"./data\")\nprint(\"Extracted!\")","metadata":{"execution":{"iopub.status.busy":"2025-09-18T09:24:38.953197Z","iopub.execute_input":"2025-09-18T09:24:38.954103Z","iopub.status.idle":"2025-09-18T09:26:08.218280Z","shell.execute_reply.started":"2025-09-18T09:24:38.954071Z","shell.execute_reply":"2025-09-18T09:26:08.217305Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_dir = \"./data/train/audio/\"\n\nclasses = os.listdir(train_dir)\nclasses.remove(\"_background_noise_\")","metadata":{"execution":{"iopub.status.busy":"2025-09-18T09:26:08.219772Z","iopub.execute_input":"2025-09-18T09:26:08.220028Z","iopub.status.idle":"2025-09-18T09:26:08.224550Z","shell.execute_reply.started":"2025-09-18T09:26:08.220007Z","shell.execute_reply":"2025-09-18T09:26:08.223785Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"samples, sample_rate = librosa.load(train_dir+'yes/0a7c2a8d_nohash_0.wav', sr = 16000)","metadata":{"execution":{"iopub.status.busy":"2025-09-18T09:26:08.225701Z","iopub.execute_input":"2025-09-18T09:26:08.226030Z","iopub.status.idle":"2025-09-18T09:26:16.503660Z","shell.execute_reply.started":"2025-09-18T09:26:08.226001Z","shell.execute_reply":"2025-09-18T09:26:16.502549Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"fig = plt.figure(figsize=(14, 8))\nax1 = fig.add_subplot(211)\nax1.set_title('Raw wave of ' + '../input/train/audio/yes/0a7c2a8d_nohash_0.wav')\nax1.set_xlabel('time')\nax1.set_ylabel('Amplitude')\nax1.plot(np.linspace(0, sample_rate/len(samples), sample_rate), samples)\n\nAudio(data=samples, rate=sample_rate)","metadata":{"execution":{"iopub.status.busy":"2025-09-18T09:26:16.505821Z","iopub.execute_input":"2025-09-18T09:26:16.506227Z","iopub.status.idle":"2025-09-18T09:26:16.884820Z","shell.execute_reply.started":"2025-09-18T09:26:16.506203Z","shell.execute_reply":"2025-09-18T09:26:16.883947Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"ipd.Audio(samples, rate=sample_rate)\nprint(sample_rate)","metadata":{"execution":{"iopub.status.busy":"2025-09-18T09:26:16.885798Z","iopub.execute_input":"2025-09-18T09:26:16.886024Z","iopub.status.idle":"2025-09-18T09:26:16.891203Z","shell.execute_reply.started":"2025-09-18T09:26:16.886004Z","shell.execute_reply":"2025-09-18T09:26:16.890203Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"samples = librosa.resample(samples, orig_sr=sample_rate, target_sr=8000)\nipd.Audio(samples, rate=8000)","metadata":{"execution":{"iopub.status.busy":"2025-09-18T09:26:16.892476Z","iopub.execute_input":"2025-09-18T09:26:16.893066Z","iopub.status.idle":"2025-09-18T09:26:16.903739Z","shell.execute_reply.started":"2025-09-18T09:26:16.893036Z","shell.execute_reply":"2025-09-18T09:26:16.902890Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"labels=os.listdir(train_dir)\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_dir + '/'+ 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":{"execution":{"iopub.status.busy":"2025-09-18T09:26:16.904866Z","iopub.execute_input":"2025-09-18T09:26:16.905139Z","iopub.status.idle":"2025-09-18T09:26:17.394438Z","shell.execute_reply.started":"2025-09-18T09:26:16.905119Z","shell.execute_reply":"2025-09-18T09:26:17.393494Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"duration_of_recordings=[]\nfor label in labels:\n    waves = [f for f in os.listdir(train_dir + '/'+ label) if f.endswith('.wav')]\n    for wav in waves:\n        sample_rate, samples = wavfile.read(train_dir + '/' + 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":"2025-09-18T09:26:17.395582Z","iopub.execute_input":"2025-09-18T09:26:17.395931Z","iopub.status.idle":"2025-09-18T09:26:18.937984Z","shell.execute_reply.started":"2025-09-18T09:26:17.395909Z","shell.execute_reply":"2025-09-18T09:26:18.937142Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_dir = \"./data/train/audio/\"\n\nclasses = os.listdir(train_dir)\nclasses.remove(\"_background_noise_\")\n\nall_wave = []\nall_label = []\nfor label in labels:\n    print(label)\n    waves = [f for f in os.listdir(train_dir + '/'+ label) if f.endswith('.wav')]\n    for wav in waves:\n        samples, sample_rate = librosa.load(train_dir + '/' + label + '/' + wav, sr = 16000)\n        samples = librosa.resample(samples, orig_sr=sample_rate, target_sr=8000)\n        if(len(samples)== 8000) : \n            all_wave.append(samples)\n            all_label.append(label)","metadata":{"execution":{"iopub.status.busy":"2025-09-18T09:26:18.939316Z","iopub.execute_input":"2025-09-18T09:26:18.939958Z","iopub.status.idle":"2025-09-18T09:26:34.426765Z","shell.execute_reply.started":"2025-09-18T09:26:18.939924Z","shell.execute_reply":"2025-09-18T09:26:34.426009Z"},"trusted":true},"outputs":[],"execution_count":null},{"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":"2025-09-18T09:26:34.429402Z","iopub.execute_input":"2025-09-18T09:26:34.429657Z","iopub.status.idle":"2025-09-18T09:26:34.439131Z","shell.execute_reply.started":"2025-09-18T09:26:34.429636Z","shell.execute_reply":"2025-09-18T09:26:34.438494Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import tensorflow as tf\n\nnum_classes = len(labels)\ny_categorical = tf.keras.utils.to_categorical(y, num_classes=num_classes)\n","metadata":{"execution":{"iopub.status.busy":"2025-09-18T09:26:34.440210Z","iopub.execute_input":"2025-09-18T09:26:34.440919Z","iopub.status.idle":"2025-09-18T09:26:48.734715Z","shell.execute_reply.started":"2025-09-18T09:26:34.440897Z","shell.execute_reply":"2025-09-18T09:26:48.733739Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"y_categorical","metadata":{"execution":{"iopub.status.busy":"2025-09-18T09:26:48.735943Z","iopub.execute_input":"2025-09-18T09:26:48.736484Z","iopub.status.idle":"2025-09-18T09:26:48.743085Z","shell.execute_reply.started":"2025-09-18T09:26:48.736460Z","shell.execute_reply":"2025-09-18T09:26:48.742147Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"all_wave = np.array(all_wave).reshape(-1,8000,1)","metadata":{"execution":{"iopub.status.busy":"2025-09-18T09:26:48.744306Z","iopub.execute_input":"2025-09-18T09:26:48.744777Z","iopub.status.idle":"2025-09-18T09:26:48.979640Z","shell.execute_reply.started":"2025-09-18T09:26:48.744739Z","shell.execute_reply":"2025-09-18T09:26:48.978921Z"},"trusted":true},"outputs":[],"execution_count":null},{"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_categorical),stratify=y,test_size = 0.2,random_state=777,shuffle=True)","metadata":{"execution":{"iopub.status.busy":"2025-09-18T09:26:48.980868Z","iopub.execute_input":"2025-09-18T09:26:48.981094Z","iopub.status.idle":"2025-09-18T09:26:49.466263Z","shell.execute_reply.started":"2025-09-18T09:26:48.981076Z","shell.execute_reply":"2025-09-18T09:26:49.465300Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"y_tr","metadata":{"execution":{"iopub.status.busy":"2025-09-18T09:26:49.467553Z","iopub.execute_input":"2025-09-18T09:26:49.467830Z","iopub.status.idle":"2025-09-18T09:26:49.474054Z","shell.execute_reply.started":"2025-09-18T09:26:49.467808Z","shell.execute_reply":"2025-09-18T09:26:49.473067Z"},"trusted":true},"outputs":[],"execution_count":null},{"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.3)(conv)\n\n#Second Conv1D layer\nconv = Conv1D(16, 11, padding='valid', activation='relu', strides=1)(conv)\nconv = MaxPooling1D(3)(conv)\nconv = Dropout(0.3)(conv)\n\n#Third Conv1D layer\nconv = Conv1D(32, 9, padding='valid', activation='relu', strides=1)(conv)\nconv = MaxPooling1D(3)(conv)\nconv = Dropout(0.3)(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)\nconv = Dropout(0.3)(conv)\n\n#Dense Layer 2\nconv = Dense(128, activation='relu')(conv)\nconv = Dropout(0.3)(conv)\n\noutputs = Dense(len(labels), activation='softmax')(conv)\n\nmodel = Model(inputs, outputs)\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2025-09-18T09:26:49.475165Z","iopub.execute_input":"2025-09-18T09:26:49.475476Z","iopub.status.idle":"2025-09-18T09:26:50.874388Z","shell.execute_reply.started":"2025-09-18T09:26:49.475456Z","shell.execute_reply":"2025-09-18T09:26:50.873523Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model.compile(loss='categorical_crossentropy',\n              optimizer='adam',\n              metrics=['accuracy'])\n\nes = EarlyStopping(monitor='val_loss',\n                   mode='min', \n                   verbose=1, \n                   patience=10, \n                   min_delta=0.0001) ","metadata":{"execution":{"iopub.status.busy":"2025-09-18T09:26:50.875437Z","iopub.execute_input":"2025-09-18T09:26:50.875720Z","iopub.status.idle":"2025-09-18T09:26:50.890013Z","shell.execute_reply.started":"2025-09-18T09:26:50.875689Z","shell.execute_reply":"2025-09-18T09:26:50.889079Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"es = EarlyStopping(monitor='val_loss', mode='min', verbose=1, patience=10, min_delta=0.0001) ","metadata":{"execution":{"iopub.status.busy":"2025-09-18T09:26:50.891264Z","iopub.execute_input":"2025-09-18T09:26:50.891883Z","iopub.status.idle":"2025-09-18T09:26:50.896205Z","shell.execute_reply.started":"2025-09-18T09:26:50.891850Z","shell.execute_reply":"2025-09-18T09:26:50.895190Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"history=model.fit(x_tr, y_tr ,epochs=100, callbacks=[es], batch_size=32, validation_data=(x_val,y_val))","metadata":{"execution":{"iopub.status.busy":"2025-09-18T09:26:50.897458Z","iopub.execute_input":"2025-09-18T09:26:50.898099Z","iopub.status.idle":"2025-09-18T09:34:43.260150Z","shell.execute_reply.started":"2025-09-18T09:26:50.898068Z","shell.execute_reply":"2025-09-18T09:34:43.259368Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"pyplot.plot(history.history['loss'], label='train') \npyplot.plot(history.history['val_loss'], label='test') \npyplot.legend()\npyplot.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-18T09:34:43.261494Z","iopub.execute_input":"2025-09-18T09:34:43.261753Z","iopub.status.idle":"2025-09-18T09:34:43.442936Z","shell.execute_reply.started":"2025-09-18T09:34:43.261731Z","shell.execute_reply":"2025-09-18T09:34:43.441999Z"}},"outputs":[],"execution_count":null},{"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":{"iopub.status.busy":"2025-09-18T09:34:43.444015Z","iopub.execute_input":"2025-09-18T09:34:43.444288Z","iopub.status.idle":"2025-09-18T09:34:43.448785Z","shell.execute_reply.started":"2025-09-18T09:34:43.444266Z","shell.execute_reply":"2025-09-18T09:34:43.447864Z"}},"outputs":[],"execution_count":null},{"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":{"iopub.status.busy":"2025-09-18T09:34:43.450128Z","iopub.execute_input":"2025-09-18T09:34:43.450780Z","iopub.status.idle":"2025-09-18T09:34:44.320930Z","shell.execute_reply.started":"2025-09-18T09:34:43.450748Z","shell.execute_reply":"2025-09-18T09:34:44.320013Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"index = random.randint(0, len(x_val) - 1)\nsamples = x_val[index].ravel()\nprint(\"Audio:\", classes[np.argmax(y_val[index])])\ndisplay(Audio(samples, rate=8000))\nprint(\"Text:\", predict(samples))\n\n# Get predictions for the entire validation set\ny_pred = np.argmax(model.predict(x_val), axis=1)\ny_true = np.argmax(y_val, axis=1)\n\n# Compute the confusion matrix\ncm = confusion_matrix(y_true, y_pred, labels=np.arange(len(classes)))\n\n# Plot the confusion matrix\nfig, ax = plt.subplots(figsize=(10, 8))\ndisp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=classes)\ndisp.plot(cmap=plt.cm.Blues, ax=ax)\nplt.xticks(rotation=45)\nplt.title(\"Confusion Matrix\")\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-09-18T09:34:44.322379Z","iopub.execute_input":"2025-09-18T09:34:44.322746Z","iopub.status.idle":"2025-09-18T09:34:46.161649Z","shell.execute_reply.started":"2025-09-18T09:34:44.322645Z","shell.execute_reply":"2025-09-18T09:34:46.160614Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{},"outputs":[],"execution_count":null}]}