{"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":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-10-17T07:00:37.430731Z","iopub.execute_input":"2023-10-17T07:00:37.432017Z","iopub.status.idle":"2023-10-17T07:00:37.825143Z","shell.execute_reply.started":"2023-10-17T07:00:37.431978Z","shell.execute_reply":"2023-10-17T07:00:37.823899Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install pyunpack\n!pip install patool\n!pip install py7zr","metadata":{"execution":{"iopub.status.busy":"2023-10-17T07:00:37.826795Z","iopub.execute_input":"2023-10-17T07:00:37.827247Z","iopub.status.idle":"2023-10-17T07:01:13.477601Z","shell.execute_reply.started":"2023-10-17T07:00:37.827202Z","shell.execute_reply":"2023-10-17T07:01:13.476292Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from py7zr import unpack_7zarchive\nimport shutil\n\nshutil.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":"2023-10-17T07:01:13.480278Z","iopub.execute_input":"2023-10-17T07:01:13.481359Z","iopub.status.idle":"2023-10-17T07:11:02.983775Z","shell.execute_reply.started":"2023-10-17T07:01:13.481313Z","shell.execute_reply":"2023-10-17T07:11:02.982674Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Libraries to use in the project","metadata":{}},{"cell_type":"code","source":"import warnings\nwarnings.filterwarnings(\"ignore\")\nimport matplotlib.pyplot as plt,pandas as pd,numpy as np,os\n\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.preprocessing import LabelEncoder\nfrom tensorflow import keras\nfrom keras.layers import Dense, Dropout, Flatten, Conv1D, Input, MaxPooling1D,BatchNormalization,GRU,Flatten\nfrom keras.models import Model\n\nimport librosa    # for audio files,gives us a normalized time series constructed by frequency of the voice\nimport IPython.display as ipd\nfrom scipy.io import wavfile    # used for converting audio files to spectograms\nfrom scipy import signal        #used for showing spectrograms","metadata":{"execution":{"iopub.status.busy":"2023-10-17T07:11:02.985978Z","iopub.execute_input":"2023-10-17T07:11:02.986339Z","iopub.status.idle":"2023-10-17T07:11:12.926196Z","shell.execute_reply.started":"2023-10-17T07:11:02.986314Z","shell.execute_reply":"2023-10-17T07:11:12.925066Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Show a sample ","metadata":{}},{"cell_type":"code","source":"sample_path=\"/kaggle/working/tensorflow-speech-recognition-challenge/train/train/audio/happy/a4b21cbc_nohash_2.wav\"\nsamples, sample_rate=librosa.load(sample_path, sr = 16000)\nplt.figure(figsize=(14, 8))\nlibrosa.display.waveshow(y=samples, sr=sample_rate)\nplt.xlabel(\"Time [in Sec]\");","metadata":{"execution":{"iopub.status.busy":"2023-10-17T07:11:12.927595Z","iopub.execute_input":"2023-10-17T07:11:12.928201Z","iopub.status.idle":"2023-10-17T07:11:24.811561Z","shell.execute_reply.started":"2023-10-17T07:11:12.92817Z","shell.execute_reply":"2023-10-17T07:11:24.810492Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Plotting with using matplotlib library\nfig = plt.figure(figsize=(14, 8))\nax1 = fig.add_subplot(211)\nax1.set_xlabel('time')\nax1.set_ylabel('Amplitude')\nduration=sample_rate/len(samples)\nax1.plot(np.linspace(0, duration, sample_rate), samples)","metadata":{"execution":{"iopub.status.busy":"2023-10-17T07:11:24.812767Z","iopub.execute_input":"2023-10-17T07:11:24.813447Z","iopub.status.idle":"2023-10-17T07:11:25.094608Z","shell.execute_reply.started":"2023-10-17T07:11:24.813419Z","shell.execute_reply":"2023-10-17T07:11:25.093584Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Check what it says","metadata":{}},{"cell_type":"code","source":"sample_rate=16000 #tells that how many samples has it in each second(16000 = 1sec). \n#By this we can calculate the durations dividing len(samples) by sample_rate \nsamples, sample_rate = librosa.load(sample_path, sr = sample_rate)\nipd.Audio(samples, rate=sample_rate)","metadata":{"execution":{"iopub.status.busy":"2023-10-17T07:11:25.09578Z","iopub.execute_input":"2023-10-17T07:11:25.096104Z","iopub.status.idle":"2023-10-17T07:11:25.105886Z","shell.execute_reply.started":"2023-10-17T07:11:25.096079Z","shell.execute_reply":"2023-10-17T07:11:25.104867Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Decrease the simple_rate and see what happens\nsample_rate=400 #Hz\nsamples, sample_rate = librosa.load(sample_path, sr = sample_rate)\nipd.Audio(samples, rate=sample_rate)","metadata":{"execution":{"iopub.status.busy":"2023-10-17T07:11:25.10694Z","iopub.execute_input":"2023-10-17T07:11:25.107734Z","iopub.status.idle":"2023-10-17T07:11:25.122149Z","shell.execute_reply.started":"2023-10-17T07:11:25.107709Z","shell.execute_reply":"2023-10-17T07:11:25.121099Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# And see how different it is \nfig = plt.figure(figsize=(14, 8))\nax1 = fig.add_subplot(211)\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":"2023-10-17T07:11:25.123706Z","iopub.execute_input":"2023-10-17T07:11:25.124182Z","iopub.status.idle":"2023-10-17T07:11:25.407032Z","shell.execute_reply.started":"2023-10-17T07:11:25.124145Z","shell.execute_reply":"2023-10-17T07:11:25.405893Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Let's see the words and visualize them from directory\npath=\"/kaggle/working/tensorflow-speech-recognition-challenge/train/train/audio\"\nwords=os.listdir(path)\nrecords=[]\nfor file in words:\n    waves=[]\n    for f in os.listdir(os.path.join(path,file)):\n        if f.endswith(\".wav\"):\n            waves.append(f)\n            \n    records.append(len(waves))","metadata":{"execution":{"iopub.status.busy":"2023-10-17T07:11:25.412717Z","iopub.execute_input":"2023-10-17T07:11:25.413115Z","iopub.status.idle":"2023-10-17T07:11:25.472155Z","shell.execute_reply.started":"2023-10-17T07:11:25.413087Z","shell.execute_reply":"2023-10-17T07:11:25.471059Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(18,4))\nplt.bar(x=words,height=records)\nplt.xticks(rotation=90)\nplt.title(\"Total Waves of Each Records\")\nplt.xlabel(\"Words\");","metadata":{"execution":{"iopub.status.busy":"2023-10-17T07:11:25.473682Z","iopub.execute_input":"2023-10-17T07:11:25.474031Z","iopub.status.idle":"2023-10-17T07:11:25.939308Z","shell.execute_reply.started":"2023-10-17T07:11:25.474004Z","shell.execute_reply":"2023-10-17T07:11:25.938184Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Let's remove background noise from the words\nwords.pop(8)\nwords","metadata":{"execution":{"iopub.status.busy":"2023-10-17T07:11:25.940828Z","iopub.execute_input":"2023-10-17T07:11:25.94165Z","iopub.status.idle":"2023-10-17T07:11:25.949879Z","shell.execute_reply.started":"2023-10-17T07:11:25.94161Z","shell.execute_reply":"2023-10-17T07:11:25.94874Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Now we must have a look at the durations of each wav files and store all waves and corresponded words to each\ndurations=[]\npaths=[]\nwav_words=[]\nfor word in words:\n    \n    for f in os.listdir(os.path.join(path,word)):\n        if f.endswith(\".wav\"):\n            paths.append(os.path.join(path,word,f))\n            sample_rate, samples = wavfile.read(paths[-1])  # reads the wavfile so as to make up its sample_rate and samples\n            durations.append(float(len(samples)/sample_rate))\n            wav_words.append(word)\nplt.hist(durations\\\n        );","metadata":{"execution":{"iopub.status.busy":"2023-10-17T07:11:25.951614Z","iopub.execute_input":"2023-10-17T07:11:25.952082Z","iopub.status.idle":"2023-10-17T07:11:30.854126Z","shell.execute_reply.started":"2023-10-17T07:11:25.952042Z","shell.execute_reply":"2023-10-17T07:11:30.852919Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Longs of the waves are generally 1 second. Besides, we have times less than 1 sec. It is necessary for building our model to equalize the durations,this way our model gives more accurate results ","metadata":{}},{"cell_type":"code","source":"print(\"There are %s  samples in the data\"%len(paths))\nprint(\"There are %s  wav_words corresponded to\"%len(wav_words))","metadata":{"execution":{"iopub.status.busy":"2023-10-17T07:11:30.855582Z","iopub.execute_input":"2023-10-17T07:11:30.855949Z","iopub.status.idle":"2023-10-17T07:11:30.861107Z","shell.execute_reply.started":"2023-10-17T07:11:30.85592Z","shell.execute_reply":"2023-10-17T07:11:30.860057Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# See Some Spectograms","metadata":{}},{"cell_type":"code","source":"sample_rate, samples = wavfile.read(paths[1989])\nfrequencies, times, spectrogram = signal.spectrogram(samples, sample_rate)\n\n\nplt.pcolormesh(times, frequencies, spectrogram)\nplt.imshow(spectrogram)\nplt.ylabel('Frequency [Hz]')\nplt.xlabel('Time [sec]')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-10-17T07:11:30.862707Z","iopub.execute_input":"2023-10-17T07:11:30.8636Z","iopub.status.idle":"2023-10-17T07:11:31.102906Z","shell.execute_reply.started":"2023-10-17T07:11:30.863562Z","shell.execute_reply":"2023-10-17T07:11:31.102076Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Preprocessing the Audio Files","metadata":{}},{"cell_type":"code","source":"# Equalize the length of samples and trick part of converting wavfile to librosa samples\nfrom scipy.io import wavfile\nall_wave=[]\nall_wav_words=[]\nfor i in range(len(paths)):\n    sample_rate , samples = wavfile.read(paths[i])   # reads file with specific sr and sample long but as integers.\n    samples=samples.astype(np.float32) / np.iinfo(np.int16).max  #Takes samples in integers to normalize them\n    samples = librosa.resample(samples, orig_sr=sample_rate, target_sr=8000)  #resamples corresponding to sr=8000\n    if(len(samples)== 8000): \n        all_wave.append(samples)\n        all_wav_words.append(wav_words[i])\n        \nprint(f\"Number of resampled waves is {len(all_wave)}\")\nprint(f\"Number of resampled wave words is {len(all_wav_words)}\")\nprint(\"Preprocessing of audio files has been finished...\")","metadata":{"execution":{"iopub.status.busy":"2023-10-17T07:11:31.10427Z","iopub.execute_input":"2023-10-17T07:11:31.104844Z","iopub.status.idle":"2023-10-17T07:12:06.733456Z","shell.execute_reply.started":"2023-10-17T07:11:31.104802Z","shell.execute_reply":"2023-10-17T07:12:06.732252Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# By resampling  what we are doing with the data is just like below.\nsample_rate , samples = wavfile.read(paths[5]) \nprint(\"Samples shape before resampling \",len(samples),sample_rate)\nsamples=samples.astype(np.float32) / np.iinfo(np.int16).max\nplt.subplot(211)\nplt.title(\"Before\")\nlibrosa.display.waveshow(y=samples, sr=sample_rate)\n# reads file with specific sr and sample long but as integers.\nsamples=samples.astype(np.float32) / np.iinfo(np.int16).max  #Takes samples in integers to normalize them\nsamples = librosa.resample(samples, orig_sr=sample_rate, target_sr=8000)\nprint(\"Samples shape after resampling \",len(samples),sample_rate)\nplt.subplot(212)\nplt.title(\"After\")\nlibrosa.display.waveshow(y=samples, sr=sample_rate)\nplt.tight_layout()","metadata":{"execution":{"iopub.status.busy":"2023-10-17T07:12:06.734877Z","iopub.execute_input":"2023-10-17T07:12:06.735268Z","iopub.status.idle":"2023-10-17T07:12:07.728418Z","shell.execute_reply.started":"2023-10-17T07:12:06.735232Z","shell.execute_reply":"2023-10-17T07:12:07.7276Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Convert to array\nall_wave=np.array(all_wave)\nall_wav_words=np.array(all_wav_words)","metadata":{"execution":{"iopub.status.busy":"2023-10-17T07:12:07.729434Z","iopub.execute_input":"2023-10-17T07:12:07.730155Z","iopub.status.idle":"2023-10-17T07:12:08.53053Z","shell.execute_reply.started":"2023-10-17T07:12:07.730126Z","shell.execute_reply":"2023-10-17T07:12:08.529717Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"all_wave=all_wave.reshape(*all_wave.shape,1)","metadata":{"execution":{"iopub.status.busy":"2023-10-17T07:12:08.531804Z","iopub.execute_input":"2023-10-17T07:12:08.53235Z","iopub.status.idle":"2023-10-17T07:12:08.536024Z","shell.execute_reply.started":"2023-10-17T07:12:08.532323Z","shell.execute_reply":"2023-10-17T07:12:08.535172Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"le=LabelEncoder()\ny=le.fit_transform(all_wav_words)","metadata":{"execution":{"iopub.status.busy":"2023-10-17T07:12:08.537569Z","iopub.execute_input":"2023-10-17T07:12:08.537929Z","iopub.status.idle":"2023-10-17T07:12:08.559956Z","shell.execute_reply.started":"2023-10-17T07:12:08.537901Z","shell.execute_reply":"2023-10-17T07:12:08.558562Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y","metadata":{"execution":{"iopub.status.busy":"2023-10-17T07:12:08.561292Z","iopub.execute_input":"2023-10-17T07:12:08.561734Z","iopub.status.idle":"2023-10-17T07:12:08.569983Z","shell.execute_reply.started":"2023-10-17T07:12:08.561699Z","shell.execute_reply":"2023-10-17T07:12:08.568774Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(le.classes_)","metadata":{"execution":{"iopub.status.busy":"2023-10-17T07:12:08.57135Z","iopub.execute_input":"2023-10-17T07:12:08.572528Z","iopub.status.idle":"2023-10-17T07:12:08.582588Z","shell.execute_reply.started":"2023-10-17T07:12:08.572476Z","shell.execute_reply":"2023-10-17T07:12:08.581745Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Splitting to train and test datas\nX_train,X_test,y_train,y_test=train_test_split(np.array(all_wave),np.array(y),random_state=42,stratify=y,test_size=.2)","metadata":{"execution":{"iopub.status.busy":"2023-10-17T07:12:08.585304Z","iopub.execute_input":"2023-10-17T07:12:08.585627Z","iopub.status.idle":"2023-10-17T07:12:10.120116Z","shell.execute_reply.started":"2023-10-17T07:12:08.585603Z","shell.execute_reply":"2023-10-17T07:12:10.118618Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(X_train.shape,y_train.shape)","metadata":{"execution":{"iopub.status.busy":"2023-10-17T07:12:10.121753Z","iopub.execute_input":"2023-10-17T07:12:10.122788Z","iopub.status.idle":"2023-10-17T07:12:10.129025Z","shell.execute_reply.started":"2023-10-17T07:12:10.122746Z","shell.execute_reply":"2023-10-17T07:12:10.127866Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Modelling\nFor this problem we build a 1d convolution layered architecture because we have one signal array of samples ","metadata":{}},{"cell_type":"code","source":"input_shape=(8000,1)\ninputs=Input(shape=input_shape)\nx=BatchNormalization()(inputs)\nx=Conv1D(filters=8,kernel_size=16, activation='relu')(x)\nx=Conv1D(filters=12,kernel_size=16, activation='relu')(x)\nx=MaxPooling1D(3)(x)\n#x=GRU(30)(x)\nx=Dense(len(words), activation='relu')(x)\nx=Flatten()(x)\nx=Dense(len(words), activation='softmax')(x)\nmodel=Model(inputs=inputs,outputs=x)\nmodel.summary()","metadata":{"execution":{"iopub.status.busy":"2023-10-17T07:13:19.235161Z","iopub.execute_input":"2023-10-17T07:13:19.235731Z","iopub.status.idle":"2023-10-17T07:13:19.54095Z","shell.execute_reply.started":"2023-10-17T07:13:19.235698Z","shell.execute_reply":"2023-10-17T07:13:19.539839Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.compile(loss='sparse_categorical_crossentropy',optimizer='adam',metrics=['accuracy'])","metadata":{"execution":{"iopub.status.busy":"2023-10-17T07:13:28.147305Z","iopub.execute_input":"2023-10-17T07:13:28.147776Z","iopub.status.idle":"2023-10-17T07:13:28.168764Z","shell.execute_reply.started":"2023-10-17T07:13:28.147744Z","shell.execute_reply":"2023-10-17T07:13:28.167635Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history=model.fit(X_train,y_train,epochs=5, batch_size=60, validation_data=(X_test,y_test),verbose=1)","metadata":{"execution":{"iopub.status.busy":"2023-10-17T07:13:29.941736Z","iopub.execute_input":"2023-10-17T07:13:29.942157Z","iopub.status.idle":"2023-10-17T07:38:54.695535Z","shell.execute_reply.started":"2023-10-17T07:13:29.942126Z","shell.execute_reply":"2023-10-17T07:38:54.694277Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Model Performance On The Plot","metadata":{}},{"cell_type":"code","source":"plt.plot(history.history[\"loss\"],label='train')\nplt.plot(history.history[\"val_loss\"],label='validation')\nplt.title(\"Loss Performance\")\nplt.xlabel(\"Epoch\")\nplt.legend()\nplt.show()\n\nplt.plot(history.history[\"accuracy\"],label='train')\nplt.plot(history.history[\"val_accuracy\"],label='validation')\nplt.title(\"Accuracy Performance\")\nplt.xlabel(\"Epoch\")\nplt.legend()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-10-17T07:52:45.046981Z","iopub.execute_input":"2023-10-17T07:52:45.047403Z","iopub.status.idle":"2023-10-17T07:52:45.483079Z","shell.execute_reply.started":"2023-10-17T07:52:45.047369Z","shell.execute_reply":"2023-10-17T07:52:45.481894Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Save the model\nmodel.save(\"Sound_recognition.h5\")\ndel model\n#Load Model\nload_model(\"/kaggle/working/Sound_recognition.h5\")","metadata":{"execution":{"iopub.status.busy":"2023-10-17T07:12:10.754062Z","iopub.status.idle":"2023-10-17T07:12:10.754373Z","shell.execute_reply.started":"2023-10-17T07:12:10.754221Z","shell.execute_reply":"2023-10-17T07:12:10.754235Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Define a Function For Prediction","metadata":{}},{"cell_type":"code","source":"def predict(wavfile):\n    prob=model.predict(wavfile.reshape(1,8000,1))\n    pred_indice=np.argmax(prob,axis=-1)\n    return le.classes_[pred_indice]","metadata":{"execution":{"iopub.status.busy":"2023-10-17T08:10:25.268134Z","iopub.execute_input":"2023-10-17T08:10:25.26866Z","iopub.status.idle":"2023-10-17T08:10:25.274541Z","shell.execute_reply.started":"2023-10-17T08:10:25.268626Z","shell.execute_reply":"2023-10-17T08:10:25.273346Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"th=np.random.randint(0,len(X_test)-1)\npred=predict(X_test[th])\nprint(\"Audio prediction:\",pred[0])\nipd.Audio(X_test[th].ravel(), rate=8000)","metadata":{"execution":{"iopub.status.busy":"2023-10-17T08:15:33.210029Z","iopub.execute_input":"2023-10-17T08:15:33.211491Z","iopub.status.idle":"2023-10-17T08:15:33.293834Z","shell.execute_reply.started":"2023-10-17T08:15:33.211454Z","shell.execute_reply":"2023-10-17T08:15:33.292513Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"preds=pd.DataFrame({})","metadata":{"execution":{"iopub.status.busy":"2023-10-17T07:12:10.758877Z","iopub.status.idle":"2023-10-17T07:12:10.759184Z","shell.execute_reply.started":"2023-10-17T07:12:10.759036Z","shell.execute_reply":"2023-10-17T07:12:10.759051Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"execution":{"iopub.status.busy":"2023-10-17T08:08:19.333282Z","iopub.execute_input":"2023-10-17T08:08:19.3337Z","iopub.status.idle":"2023-10-17T08:08:19.340803Z","shell.execute_reply.started":"2023-10-17T08:08:19.333668Z","shell.execute_reply":"2023-10-17T08:08:19.339786Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}