From 39cb1e589f5b0e32c2b0a6c7a5a36a7ee0a64bde Mon Sep 17 00:00:00 2001 From: Vincent van Hees Date: Tue, 7 Nov 2017 16:57:33 +0100 Subject: [PATCH] function added for label file loading and notebook tidied up --- explosmile/load_iemocap.py | 35 ++++++ notebooks/opensmile.ipynb | 247 +++++++++++++------------------------ 2 files changed, 122 insertions(+), 160 deletions(-) diff --git a/explosmile/load_iemocap.py b/explosmile/load_iemocap.py index 483bd1f..c0345d9 100644 --- a/explosmile/load_iemocap.py +++ b/explosmile/load_iemocap.py @@ -3,6 +3,7 @@ This model provides functionality to pre-process the iemocap dataset """ import os +import pandas as pd def returnrealfiles(filenameslist): """ @@ -43,6 +44,8 @@ def find_matching_label_file(wav_filename, labfiles, label_files_path): lab_fullpath : string The name of the label txt file with full path """ + + # the wav files have longer names than the label files, so first remove the end: wav_namepieces = wav_filename.split("/")[-1].split("_") matchinglabfile = wav_namepieces[0] + '_' + wav_namepieces[1] + '.txt' # check whether the matching label file truly exists: @@ -55,3 +58,35 @@ def find_matching_label_file(wav_filename, labfiles, label_files_path): # create full path for labelfile: lab_fullpath = os.path.join(label_files_path, matchinglabfile3) return lab_fullpath; + +def readlabtxt(lab_fullpath): + """ + Loads txt with the Emotion labels, takes the summary labels per time frame, + and stores it in a pandase data.frame + + Parameters + ------------ + lab_fullpath : string + The name of the label txt file with path + + Returns + ------------ + labels : pandas data.frame + pandas data.frame with all summary labels per time frame + """ + # get all labels for all utterances in this improvisation + labels = pd.read_table(lab_fullpath,header=0).iloc[0::8,:] # the summary is stored in every 8th row + # the format of the data needs to be tidied up a bit + # turn rownames into column + labels.index.name = 'newhead' + labels.reset_index(inplace=True) + # rename the columns that are now created + labels = labels.rename(columns={'level_0': '[START_TIME - END_TIME]', 'level_1': 'TURN_NAME', 'level_2': 'EMOTION'}) + # split valence, activation, and dominance: + labels[['V','A','D']] = labels['% [START_TIME - END_TIME] TURN_NAME EMOTION [V, A, D]'].str.split('\s',expand=True) + labels[['START_TIME','END_TIME']] = labels['[START_TIME - END_TIME]'].str.split(' - ',expand=True) + labels = labels.drop(['% [START_TIME - END_TIME] TURN_NAME EMOTION [V, A, D]','[START_TIME - END_TIME]'], axis=1) + # remove unwanted characters + for colnam in ['V','A','D', 'START_TIME','END_TIME']: + labels[colnam] = labels[colnam].map(lambda x: x.lstrip('[,').rstrip('],')) + return labels; diff --git a/notebooks/opensmile.ipynb b/notebooks/opensmile.ipynb index 6d0da22..721315b 100644 --- a/notebooks/opensmile.ipynb +++ b/notebooks/opensmile.ipynb @@ -1,5 +1,12 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Explore Opensmile on the Iemocap dataset" + ] + }, { "cell_type": "code", "execution_count": 1, @@ -13,7 +20,6 @@ "import numpy as np\n", "from scipy.io import arff\n", "sys.path.append('/home/vincent/enschede/explosmile/explosmile')\n", - "#from load_iemocap import returnrealfiles\n", "import load_iemocap as li\n", "from HTK import HTKFile\n", "%matplotlib inline\n", @@ -31,6 +37,13 @@ "finally add path to .bashrc." ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Identify what files to proces" + ] + }, { "cell_type": "code", "execution_count": 2, @@ -46,6 +59,13 @@ "#OPENSMILE_CONF_PATH = os.path.join(OPENSMILE_PATH, OPENSMILE_CONF)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### to do: insert loop over the 5 Sessions" + ] + }, { "cell_type": "code", "execution_count": 3, @@ -54,7 +74,6 @@ }, "outputs": [], "source": [ - "# to do: insert loop over the 5 Sessions\n", "session = \"Session1\"" ] }, @@ -68,10 +87,11 @@ "source": [ "# get content of directories\n", "wav_files_path = os.path.join(iemocap_path, session + \"/sentences/wav\")\n", - "label_files_path = os.path.join(iemocap_path, session + \"/dialog/EmoEvaluation\") # path to txt files with labels\n", - "labfiles = os.listdir(label_files_path)\n", "wavfiles_list = [os.path.join(dp, f) for dp, dn, fn in os.walk(os.path.expanduser(wav_files_path)) for f in fn]\n", - "wavfiles = np.array(wavfiles_list)" + "wavfiles = np.array(wavfiles_list)\n", + "\n", + "label_files_path = os.path.join(iemocap_path, session + \"/dialog/EmoEvaluation\") # path to txt files with labels\n", + "labfiles = os.listdir(label_files_path) # list of filenames" ] }, { @@ -85,6 +105,13 @@ "reallabfiles = li.returnrealfiles(labfiles)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### to do: insert loop over all wav files" + ] + }, { "cell_type": "code", "execution_count": 6, @@ -92,9 +119,20 @@ "collapsed": true }, "outputs": [], + "source": [ + "wavfile_index = 0" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": true + }, + "outputs": [], "source": [ "# Let's focus on one wav and lab file for now\n", - "wav_filename = str(realwavfiles[0])\n", + "wav_filename = str(realwavfiles[wavfile_index])\n", "wav_fullpath = os.path.join(wav_files_path,wav_filename )" ] }, @@ -105,29 +143,34 @@ "outputs": [], "source": [ "# find matching label file\n", - "# the wav files have longer names than the label files, so first remove the end:\n", "lab_fullpath = li.find_matching_label_file(wav_filename, reallabfiles, label_files_path)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Extract MFCC features with Opensmile" + ] + }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ - "# define Open smile command\n", + "# define opensmile command\n", "opensmile_conf = os.path.join(opensmile_path,\"config/MFCC12_0_D_A.conf\")\n", - "# select .arff output format because it should be compatible with Scikit learn\n", - "features_file = \"/media/vincent/enschede/\" + wav_filename.split(\"/\")[-1].replace('.wav', '') + \".csv\"\n", + "htkfile = \"/media/vincent/enschede/\" + wav_filename.split(\"/\")[-1].replace('.wav', '') + \".htk\"\n", "command = \"SMILExtract -I {input_file} -C {conf_file} -O {output_file}\".format(\n", " input_file=wav_fullpath,\n", " conf_file=opensmile_conf,\n", - " output_file=features_file)" + " output_file=htkfile)" ] }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -137,99 +180,67 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": { - "collapsed": true, - "scrolled": true - }, - "outputs": [], - "source": [ - "# arff format resulted in all kinds of problems:\n", - "# import arff\n", - "# data = arff.load(open(features_file,'r'))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Explanation of how to move forward: https://github.com/danijel3/PyHTK/blob/master/python-test/test.py" - ] - }, - { - "cell_type": "code", - "execution_count": 13, + "execution_count": 11, "metadata": { "collapsed": true }, "outputs": [], "source": [ - "htk = HTKFile()\n", - "htk.load(features_file)" + "# load htkfile, credits to https://github.com/danijel3/PyHTK, see license inside code\n", + "htk = HTKFile() \n", + "htk.load(htkfile)\n", + "# object is a list of lists, now turn into numpy array:\n", + "htk_np_data = np.array(htk.data)" ] }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 12, "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "1.93" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "(193, 39)\n" + ] } ], "source": [ - "htk.nSamples / 100" + "print(htk_np_data.shape)" ] }, { "cell_type": "code", - "execution_count": 15, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# object is a list of lists, now turn into numpy array:\n", - "htk_np_data = np.array(htk.data)" - ] - }, - { - "cell_type": "code", - "execution_count": 16, + "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "(193, 39)" + "1.93" ] }, - "execution_count": 16, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "htk_np_data.shape" + "# Duration of utterance in seconds:\n", + "htk.nSamples / 100" ] }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "image/png": "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\nAAAASUVORK5CYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -242,101 +253,27 @@ ] }, { - "cell_type": "code", - "execution_count": 18, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# look up annotation for that same file" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'/media/vincent/enschede/Ses01F_impro01_F000.csv'" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "features_file" - ] - }, - { - "cell_type": "code", - "execution_count": 20, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "'/media/vincent/enschede/IEMOCAP_full_release/Session1/dialog/EmoEvaluation/Ses01F_impro01.txt'" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "lab_fullpath" - ] - }, - { - "cell_type": "code", - "execution_count": 21, + "cell_type": "markdown", "metadata": { "collapsed": true }, - "outputs": [], "source": [ - "import pandas as pd" + "## Look up emotion label for this utterance" ] }, { "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [], - "source": [ - "# get all labels for all utterances in this improvisation\n", - "labels = pd.read_table(lab_fullpath,header=0).iloc[0::8,:] # the summary is stored in every 8th row" - ] - }, - { - "cell_type": "code", - "execution_count": 23, + "execution_count": 15, "metadata": {}, "outputs": [], "source": [ - "# the format of the data needs to be tidied up a bit\n", - "# turn rownames into column\n", - "labels.index.name = 'newhead'\n", - "labels.reset_index(inplace=True)\n", - "# rename the columns that are now created\n", - "labels = labels.rename(columns={'level_0': '[START_TIME - END_TIME]', 'level_1': 'TURN_NAME', 'level_2': 'EMOTION'})\n", - "# split valence, activation, and dominance: \n", - "labels[['V','A','D']] = labels['% [START_TIME - END_TIME] TURN_NAME EMOTION [V, A, D]'].str.split('\\s',expand=True)\n", - "labels[['START_TIME','END_TIME']] = labels['[START_TIME - END_TIME]'].str.split(' - ',expand=True)\n", - "labels = labels.drop(['% [START_TIME - END_TIME] TURN_NAME EMOTION [V, A, D]','[START_TIME - END_TIME]'], axis=1)\n", - "# remove unwanted characters\n", - "for colnam in ['V','A','D', 'START_TIME','END_TIME']:\n", - " labels[colnam] = labels[colnam].map(lambda x: x.lstrip('[,').rstrip('],')) " + "# load labels and put them in a pandas data.frame\n", + "labels = li.readlabtxt(lab_fullpath)" ] }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -433,7 +370,7 @@ "4 Ses01F_impro01_F004 xxx 2.5000 3.0000 2.5000 21.3257 24.7400" ] }, - "execution_count": 24, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -444,33 +381,23 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "# find the row for which the TURN_NAME matches the wav features file\n", - "TURNNAMEwav = features_file.split(\"/\")[-1].split(\".cs\")[0]\n", + "TURNNAMEwav = htkfile.split(\"/\")[-1].split(\".ht\")[0]\n", "b = [index for index, item in enumerate(labels['TURN_NAME']) if TURNNAMEwav == item][0]\n", "# extract label for this utterance\n", "label = labels['EMOTION'][b]\n" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "# Explore SVM in scikit learn" - ] - }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Example of how to apply SVM on the X and y later on: http://scikit-learn.org/stable/auto_examples/svm/plot_svm_kernels.html, which clarifies that X should be a Numpy array with shape (n_samples, n_features)" + "## Explore SVM in scikit learn\n", + "Example of how to apply SVM on the X and y later on: http://scikit-learn.org/stable/auto_examples/svm/plot_svm_kernels.html, which clarifies that X should be a Numpy array with shape (n_samples, n_features)" ] }, {