{ "cells": [ { "cell_type": "code", "execution_count": 52, "id": "c8f31382-77ac-47f8-bd3a-1c805b2d3e75", "metadata": {}, "outputs": [], "source": [ "import librosa\n", "import soundfile\n", "import os, glob, pickle\n", "import numpy as np\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.neural_network import MLPClassifier\n", "from sklearn.metrics import accuracy_score" ] }, { "cell_type": "code", "execution_count": 57, "id": "b0510279-2195-4784-a52b-20b6c18e216c", "metadata": {}, "outputs": [], "source": [ "# Extract features (mfcc, chroma, mel) from a sound file\n", "def extract_feature(file_name, mfcc, chroma, mel):\n", " with soundfile.SoundFile(file_name) as sound_file:\n", " X = sound_file.read(dtype=\"float32\")\n", " sample_rate=sound_file.samplerate\n", " if chroma:\n", " stft=np.abs(librosa.stft(X))\n", " result=np.array([])\n", " if mfcc:\n", " mfccs=np.mean(librosa.feature.mfcc(y=X, sr=sample_rate, n_mfcc=40).T, axis=0)\n", " result=np.hstack((result, mfccs))\n", " if chroma:\n", " chroma=np.mean(librosa.feature.chroma_stft(S=stft, sr=sample_rate).T,axis=0)\n", " result=np.hstack((result, chroma))\n", " if mel:\n", " mel=np.mean(librosa.feature.melspectrogram(y=X, sr=sample_rate).T,axis=0)\n", " result=np.hstack((result, mel))\n", " return result" ] }, { "cell_type": "code", "execution_count": 58, "id": "d84a7785-e5b3-44ee-b484-a45fe61aa2af", "metadata": {}, "outputs": [], "source": [ "#Emotions in the RAVDESS dataset\n", "emotions={\n", " '01':'neutral',\n", " '02':'calm',\n", " '03':'happy',\n", " '04':'sad',\n", " '05':'angry',\n", " '06':'fearful',\n", " '07':'disgust',\n", " '08':'surprised'\n", "}\n", "\n", "# Emotions to observe\n", "observed_emotions=['calm', 'happy', 'fearful', 'disgust']" ] }, { "cell_type": "code", "execution_count": 59, "id": "5ebdbf11-1c7d-4bbf-9ff7-41b04cfbc902", "metadata": {}, "outputs": [], "source": [ "#Load the data and extract features for each sound file\n", "def load_data(test_size=0.2):\n", " x,y=[],[]\n", " for file in glob.glob(\"C:\\\\Users\\\\Abhay\\\\Downloads\\\\dataset\\\\Actor_*\\\\*.wav\"):\n", " file_name = os.path.basename(file)\n", " emotion=emotions[file_name.split(\"-\")[2]]\n", " if emotion not in observed_emotions:\n", " continue\n", " feature = extract_feature(file, mfcc=True, chroma=True, mel=True)\n", " x.append(feature)\n", " y.append(emotion)\n", " return train_test_split(np.array(x), y, test_size=test_size, random_state=9)" ] }, { "cell_type": "code", "execution_count": 61, "id": "17e9421d-b474-4fc8-8321-435a2093c0cb", "metadata": {}, "outputs": [], "source": [ "#Split the dataset\n", "x_train,x_test,y_train,y_test = load_data(test_size=0.25)" ] }, { "cell_type": "code", "execution_count": 62, "id": "eb1d0e4a-1766-4d3d-85ea-f69d88b6a007", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(576, 192)\n" ] } ], "source": [ "#Get the shape of the training and testing datasets\n", "print((x_train.shape[0], x_test.shape[0]))" ] }, { "cell_type": "code", "execution_count": 63, "id": "5a765afc-663d-48c0-9dbd-d58caf9069cc", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Features extracted: 180\n" ] } ], "source": [ "# Get the number of features extracted\n", "print(f'Features extracted: {x_train.shape[1]}')" ] }, { "cell_type": "code", "execution_count": 64, "id": "29c258f3-dbb6-4214-aea4-590487f5c68a", "metadata": {}, "outputs": [], "source": [ "#Initialize the Multi Layer Perceptron Classifier\n", "model=MLPClassifier(alpha=0.01, batch_size=256, epsilon=1e-08, hidden_layer_sizes=(300,), learning_rate='adaptive', max_iter=500)" ] }, { "cell_type": "code", "execution_count": 65, "id": "76939a33-c7fb-4ee3-b25f-af609dd3a5ce", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
MLPClassifier(alpha=0.01, batch_size=256, hidden_layer_sizes=(300,),\n", " learning_rate='adaptive', max_iter=500)In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
MLPClassifier(alpha=0.01, batch_size=256, hidden_layer_sizes=(300,),\n", " learning_rate='adaptive', max_iter=500)