{"cells":[{"cell_type":"code","execution_count":null,"metadata":{"execution":{"iopub.execute_input":"2024-01-02T09:52:54.222068Z","iopub.status.busy":"2024-01-02T09:52:54.221743Z","iopub.status.idle":"2024-01-02T09:52:57.746023Z","shell.execute_reply":"2024-01-02T09:52:57.745237Z","shell.execute_reply.started":"2024-01-02T09:52:54.222039Z"},"id":"nvWzbxwsMFTD"},"outputs":[],"source":["# Libraries that will be used in this recitation\n","import numpy as np\n","import torch\n","import pandas as pd"]},{"cell_type":"markdown","metadata":{"id":"vn6jWNDhLQzN"},"source":["In this recitation, you will learn about one if the audio datasets that will be used in our class."]},{"cell_type":"markdown","metadata":{"id":"X3Aswvbziqko"},"source":["# Audio Datasets (Homework 1)"]},{"cell_type":"markdown","metadata":{"id":"BIGgQ2-dkZI5"},"source":["In homework 1, we will provide you with MFCC speech data formatted in numpy arrays. MFCC is derived from raw waveform data. The process of calculating MFCC is not required in this course, but we will cover that in Recitation 1."]},{"cell_type":"markdown","metadata":{"id":"SuGFjyPupkwK"},"source":["The datasets for HW1P2 is organized below.\n","\n","```\n","some-competition-datasets\n","  ├── dev-clean: For evaluation of your model, transcripts(lables) are provided\n","  ├── test-clean: You have to predict the samples in this folder, and submit the result of your prediction to Kaggle\n","  └── train-clean-100: For training\n","```\n","\n","\n"]},{"cell_type":"markdown","source":["## Import the Test Data"],"metadata":{"id":"9f-C0w_-mDuR"}},{"cell_type":"markdown","source":["We've provided you with a tiny subset (15 samples) of the HW1P2 data in ```Recitation_0.10_Data.zip```. Drag and drop the zip file to Colab's files in the right panel."],"metadata":{"id":"4NzA2TPjl25P"}},{"cell_type":"markdown","metadata":{"id":"MCQ-B3GHrp5Y"},"source":["## Unzipping the Dataset"]},{"cell_type":"code","execution_count":null,"metadata":{"id":"ahU2wA7bg8xJ"},"outputs":[],"source":["!unzip -qo /content/Recitation_0.10_data.zip -d '/content'"]},{"cell_type":"markdown","metadata":{"id":"QVRDfIX_rkrS"},"source":["## Training Samples & Labels"]},{"cell_type":"markdown","metadata":{"id":"XdtM249rrtpW"},"source":["After unzipping, Load one sample and corresponding label from ```Recitation_0.10_data```."]},{"cell_type":"code","execution_count":null,"metadata":{"execution":{"iopub.execute_input":"2024-01-02T10:01:02.833960Z","iopub.status.busy":"2024-01-02T10:01:02.833081Z","iopub.status.idle":"2024-01-02T10:01:02.852398Z","shell.execute_reply":"2024-01-02T10:01:02.851629Z","shell.execute_reply.started":"2024-01-02T10:01:02.833924Z"},"id":"s74y3GSzrmd6"},"outputs":[],"source":["SAMPLE_INDEX = \"1272-128104-0009\"\n","x_file_path = f\"/content/Recitation_0.10_data/mfcc/{SAMPLE_INDEX}.npy\"\n","y_file_path = f\"/content/Recitation_0.10_data/transcript/{SAMPLE_INDEX}.npy\"\n","\n","\n","x = np.load(x_file_path)\n","y = np.load(y_file_path)"]},{"cell_type":"markdown","metadata":{"id":"O2hb8chcsvGp"},"source":["Now we have loaded one speech data and its transcript. Every speech MFCC data is organized as an array of shape ```T x 28```, where ```T``` is the total number of timesteps, and 28 is the number of features for MFCC file format."]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"execution":{"iopub.execute_input":"2024-01-02T10:01:08.355398Z","iopub.status.busy":"2024-01-02T10:01:08.354686Z","iopub.status.idle":"2024-01-02T10:01:08.359918Z","shell.execute_reply":"2024-01-02T10:01:08.358944Z","shell.execute_reply.started":"2024-01-02T10:01:08.355368Z"},"id":"Tf81ycmssc-i","outputId":"be1ce9bc-492d-456b-a1c0-d35feca75ea1","executionInfo":{"status":"ok","timestamp":1735675019601,"user_tz":480,"elapsed":150,"user":{"displayName":"Michael Kireeff","userId":"05753936332644561694"}}},"outputs":[{"output_type":"stream","name":"stdout","text":["Shape of x:  (1825, 28)\n"]}],"source":["print(\"Shape of x: \", x.shape)"]},{"cell_type":"markdown","metadata":{"id":"w0e64JEBtE4f"},"source":["As for the transcript, it is organized as a 1-D array with length ```T + 2``` The two extra timesteps are \\<SOS\\> and \\<EOS\\> tokens, which stand for \"start of sequence\" and \"end of sequence\", located in the beggining and the end respectively.\n","\n","**NOTE:** For homework 1, the two tokens are not needed. So you might want to remove them in part of your preprocessing pipeline."]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"execution":{"iopub.execute_input":"2024-01-02T10:01:14.735192Z","iopub.status.busy":"2024-01-02T10:01:14.734590Z","iopub.status.idle":"2024-01-02T10:01:14.740257Z","shell.execute_reply":"2024-01-02T10:01:14.739266Z","shell.execute_reply.started":"2024-01-02T10:01:14.735162Z"},"id":"9KE7bIpyslsj","outputId":"5ab6bc10-5c99-46b4-efd5-20b268192129","executionInfo":{"status":"ok","timestamp":1735675021371,"user_tz":480,"elapsed":217,"user":{"displayName":"Michael Kireeff","userId":"05753936332644561694"}}},"outputs":[{"output_type":"stream","name":"stdout","text":["Shape of y:  (1827,)\n","Some elements of y:  ['L' 'L' 'L' 'L' 'L' 'L' 'L' 'L' 'L' 'L']\n"]}],"source":["print(\"Shape of y: \", y.shape)\n","print(\"Some elements of y: \", y[77:87])"]},{"cell_type":"markdown","metadata":{"id":"h_1Ktl0zuUTw"},"source":["## Context Information"]},{"cell_type":"markdown","metadata":{"id":"n9tfd4z1ugA3"},"source":["Proper management of local context is essential to homework 1, in which we are predicting the phoenome for each of the time step. The dominant solution in the past was setting a \"hand-crafted\" context with the following approaches: derivatives or context windows. In this homework, we are going to apply context windows."]},{"cell_type":"markdown","metadata":{"id":"PqIr2B_HvX1G"},"source":["Context windows adds a local context by simply concatenating multiple consecutive timesteps. The result is a bigger feature vector that is better \"aware\" of the local information."]},{"cell_type":"markdown","metadata":{"id":"almlhVTvvJvI"},"source":["For example, originally, the input to the network and the expected output to the network for timestep 64 would be:"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"execution":{"iopub.execute_input":"2024-01-02T10:01:22.548341Z","iopub.status.busy":"2024-01-02T10:01:22.547985Z","iopub.status.idle":"2024-01-02T10:01:22.556792Z","shell.execute_reply":"2024-01-02T10:01:22.555758Z","shell.execute_reply.started":"2024-01-02T10:01:22.548311Z"},"id":"HAs4GVqYuV7z","outputId":"d0cb92ac-a286-46e4-b546-42672d607553","executionInfo":{"status":"ok","timestamp":1735675023299,"user_tz":480,"elapsed":145,"user":{"displayName":"Michael Kireeff","userId":"05753936332644561694"}}},"outputs":[{"output_type":"execute_result","data":{"text/plain":["(array([-2.71944275e+01,  2.75271626e+01,  2.64715347e+01, -7.94004107e+00,\n","        -4.98173094e+00, -3.83015394e+00,  1.95904713e+01, -7.39578152e+00,\n","         6.96945667e+00,  1.58027525e+01,  3.30792546e+00, -2.05057216e+00,\n","        -6.88332558e+00, -3.39014101e+00,  1.03521204e+00,  5.14063978e+00,\n","        -3.66227412e+00,  5.28887033e+00,  3.91332150e+00,  2.56487012e+00,\n","         1.00877535e+00, -7.50973284e-01,  2.04022810e-01, -1.72643125e-01,\n","        -3.23839128e-01, -1.29539478e+00, -9.14911856e-04,  1.17291916e+02],\n","       dtype=float32),\n"," 'HH')"]},"metadata":{},"execution_count":6}],"source":["x[64], y[65] # y is offset by one as we would like to ignore the SOS token"]},{"cell_type":"code","source":["x[64].shape"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"1NUIymhe1_DJ","outputId":"d4f8e33f-201c-4cd4-8552-d36df2ac8fd2","executionInfo":{"status":"ok","timestamp":1735675034439,"user_tz":480,"elapsed":226,"user":{"displayName":"Michael Kireeff","userId":"05753936332644561694"}}},"execution_count":null,"outputs":[{"output_type":"execute_result","data":{"text/plain":["(28,)"]},"metadata":{},"execution_count":9}]},{"cell_type":"markdown","metadata":{"id":"vSumA-2jvnBh"},"source":["Now we want to apply context window of 10 to the 64-th timestep, this could be done by concatenating features from 10 past and 10 future frames.:"]},{"cell_type":"code","execution_count":null,"metadata":{"execution":{"iopub.execute_input":"2024-01-02T10:01:27.555790Z","iopub.status.busy":"2024-01-02T10:01:27.555061Z","iopub.status.idle":"2024-01-02T10:01:27.560122Z","shell.execute_reply":"2024-01-02T10:01:27.559093Z","shell.execute_reply.started":"2024-01-02T10:01:27.555759Z"},"id":"V77hQVNvvbu8"},"outputs":[],"source":["x_with_context = x[64 - 10: 64 + 11] # Use slicing to get"]},{"cell_type":"code","execution_count":null,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"execution":{"iopub.execute_input":"2024-01-02T10:01:41.642323Z","iopub.status.busy":"2024-01-02T10:01:41.641621Z","iopub.status.idle":"2024-01-02T10:01:41.647294Z","shell.execute_reply":"2024-01-02T10:01:41.646345Z","shell.execute_reply.started":"2024-01-02T10:01:41.642289Z"},"id":"EgWnEInPv5bB","outputId":"607f67a3-4666-4694-9665-3b152a0ae4ac","executionInfo":{"status":"ok","timestamp":1735675034615,"user_tz":480,"elapsed":8,"user":{"displayName":"Michael Kireeff","userId":"05753936332644561694"}}},"outputs":[{"output_type":"stream","name":"stdout","text":["After concatinating context, the shape of x: (21, 28)\n"]}],"source":["print(\"After concatinating context, the shape of x:\", x_with_context.shape)"]},{"cell_type":"markdown","metadata":{"id":"1jyJP3qjwpzG"},"source":["Since we are designing an MLP network, we might want to flatten x to a 1-D array as its a single training sample."]},{"cell_type":"code","execution_count":null,"metadata":{"execution":{"iopub.execute_input":"2024-01-02T10:01:44.884697Z","iopub.status.busy":"2024-01-02T10:01:44.884325Z","iopub.status.idle":"2024-01-02T10:01:44.889056Z","shell.execute_reply":"2024-01-02T10:01:44.888138Z","shell.execute_reply.started":"2024-01-02T10:01:44.884669Z"},"id":"URWRAotbwosc"},"outputs":[],"source":["x_with_context_flattened = x_with_context.reshape(-1)"]},{"cell_type":"code","source":["print(\"After flattening, the shape of x:\", x_with_context_flattened.shape)"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"J9JuFAtUpNDu","outputId":"efc48d9f-6d95-4521-f82c-0742daac3bcf","executionInfo":{"status":"ok","timestamp":1735675034615,"user_tz":480,"elapsed":7,"user":{"displayName":"Michael Kireeff","userId":"05753936332644561694"}}},"execution_count":null,"outputs":[{"output_type":"stream","name":"stdout","text":["After flattening, the shape of x: (588,)\n"]}]},{"cell_type":"markdown","source":["Visualizing the data is important! It can help you understand the underlying distribution, identify patterns, trends and anomalies and even help guide you towards selecting an appropriate model for the task. Below is an example on how one might go about plotting MFCC's with Matplotlib. NOTE: The sample has been flipped and transposed so that the visualization is consistent with how MFCC;s are typically visualized.Here, The x-axis represents timesteps and the y-axis represents the MFCC's."],"metadata":{"id":"kFUNuSVDp1nL"}},{"cell_type":"code","source":["import matplotlib.pyplot as plt\n","import matplotlib\n","\n","\n","fig, ax = plt.subplots()\n","im = ax.imshow(np.flip(x_with_context, axis=1).T, interpolation='nearest', vmin=-10.0, vmax=60.0, cmap=matplotlib.cm.viridis, origin='lower')\n","ax.set_title('x_with_context')\n","fig.colorbar(im)\n","plt.show()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":452},"id":"aqgEgHCbp3nA","outputId":"a33ade57-bf36-4d09-ed4a-64ad021794f5","executionInfo":{"status":"ok","timestamp":1735675035079,"user_tz":480,"elapsed":469,"user":{"displayName":"Michael Kireeff","userId":"05753936332644561694"}}},"execution_count":null,"outputs":[{"output_type":"display_data","data":{"text/plain":["<Figure size 640x480 with 2 Axes>"],"image/png":"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\n"},"metadata":{}}]}],"metadata":{"colab":{"provenance":[]},"kaggle":{"accelerator":"gpu","dataSources":[{"databundleVersionId":7400071,"sourceId":66694,"sourceType":"competition"}],"dockerImageVersionId":30627,"isGpuEnabled":true,"isInternetEnabled":true,"language":"python","sourceType":"notebook"},"kernelspec":{"display_name":"Python 3 (ipykernel)","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.9.6"}},"nbformat":4,"nbformat_minor":0}