{ "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.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
" ], "text/plain": [ "MLPClassifier(alpha=0.01, batch_size=256, hidden_layer_sizes=(300,),\n", " learning_rate='adaptive', max_iter=500)" ] }, "execution_count": 65, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#Train the model\n", "model.fit(x_train,y_train)" ] }, { "cell_type": "code", "execution_count": 66, "id": "41976825-55d6-46eb-a389-eba2cacc540d", "metadata": {}, "outputs": [], "source": [ "# Predict for the test set\n", "y_pred=model.predict(x_test)" ] }, { "cell_type": "code", "execution_count": 67, "id": "2401ce73-6268-4751-9d68-3aa15f870f99", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Accuracy: 66.67%\n" ] } ], "source": [ "# Calculate the accuracy of our model\n", "accuracy=accuracy_score(y_true=y_test, y_pred=y_pred)\n", "\n", "# Print the accuracy\n", "print(\"Accuracy: {:.2f}%\".format(accuracy*100))" ] }, { "cell_type": "code", "execution_count": 68, "id": "568ff907-2558-4f2b-bf4a-f10b889233cc", "metadata": {}, "outputs": [], "source": [ "with open('ser_model.pickle','wb') as f:\n", " pickle.dump(model,f)" ] }, { "cell_type": "code", "execution_count": 69, "id": "19d865fc-504e-40dd-9822-a49ae0f3e568", "metadata": {}, "outputs": [], "source": [ "with open('ser_model.pickle','rb') as f:\n", " mod = pickle.load(f)" ] }, { "cell_type": "code", "execution_count": 71, "id": "7cecff7e-060b-461d-a597-2b11ee731d97", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.6666666666666666" ] }, "execution_count": 71, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mod.score(x_test,y_test)" ] }, { "cell_type": "code", "execution_count": null, "id": "bd184951-3715-4256-86ae-20d00a17a57b", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "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.8.16" } }, "nbformat": 4, "nbformat_minor": 5 }