Prepare to run experiments on RSR2015¶
rsr2015_init.py
Enter the path where the RSR2015 database is stored and run python rsr2015_init.py. This script generates the following files:
task/3sess-pwd_eval_m_back.h5
task/3sess-pwd_eval_m_key.h5
task/3sess-pwd_eval_m_key.h5
task/3sess-pwd_eval_m_nap.h5
task/3sess-pwd_eval_m_ndx.h5
task/3sesspwd_eval_m_trn.h5
task/ubm_list.txt
Below is a description of this script.
First, loads the required PYTHON packages.
import numpy as np
import sidekit
import os
import sys
import re
import random
import pandas as pd
Before running this script, don’t forget to enter the path of the directory where the RSR2015 database is stored:
rsr2015Path = '/Users/larcher/LIUM/RSR2015/RSR2015_V1/'
The rest of the script generates the files defining the enrollment data, the trials to process and the key for scoring from the original files provided with the RSR2015.
The IdMap
object is created from the 3sesspwd_eval_m.trn file and save to disk:
rsrEnroll = pd.read_csv(rsr2015Path + '/key/part1/trn/3sesspwd_eval_m.trn', delimiter='[,\s*]', header=None, engine='python')
# remove the extension of the files (.sph)
for i in range(1,4):
rsrEnroll[i] = rsrEnroll[i].str.replace('.sph$', '')
rsrEnroll[i] = rsrEnroll[i].str.replace('^male/', '')
# Create the list of models and enrollment sessions
models = []
segments = []
for idx, mod in enumerate(rsrEnroll[0]):
models.extend([mod, mod, mod])
segments.extend([rsrEnroll[1][idx], rsrEnroll[2][idx], rsrEnroll[3][idx]])
# Create and fill the IdMap with the enrollment definition
enroll_idmap = sidekit.IdMap()
enroll_idmap.leftids = np.asarray(models)
enroll_idmap.rightids = np.asarray(segments)
enroll_idmap.start = np.empty(enroll_idmap.rightids.shape, '|O')
enroll_idmap.stop = np.empty(enroll_idmap.rightids.shape, '|O')
enroll_idmap.validate()
enroll_idmap.write('task/3sesspwd_eval_m_trn.h5')
The file 3sess-pwd_eval_m.ndx is read and we extract information to process target trials
as well as nontarget trials that correspond to the case of an impostor pronouncing the correct sentence.
The Key
object is stored in HDF5 format:
rsrKey = pd.read_csv(rsr2015Path + '/key/part1/ndx/3sess-pwd_eval_m.ndx', delimiter='[,\s*]', header=None, engine='python')
rsrKey[1] = rsrKey[1].str.replace('.sph$', '')
models = []
testsegs = []
trials = []
for idx,model in enumerate(list(rsrKey[0])):
if (rsrKey[2][idx] == 'Y'):
models.append(rsrKey[0][idx])
testsegs.append(rsrKey[1][idx])
trials.append('target')
elif (rsrKey[4][idx] == 'Y'):
models.append(rsrKey[0][idx])
testsegs.append(rsrKey[1][idx])
trials.append('nontarget')
key = sidekit.Key(models=np.array(models), testsegs=np.array(testsegs), trials=np.array(trials))
key.write('task/3sess-pwd_eval_m_key.h5')
The index file that defines the trials to process is derived from the Key
object and stored to disk
in HDF5 format:
ndx = key.to_ndx()
ndx.write('task/3sess-pwd_eval_m_ndx.h5')
The following block creates a list of files that will be used to train a Universal Background Model. This list is stored in ASCII format. All the 30 sentences from the PART I of the RSR2015 database from the 50 male speakers of the background set are used to train the UBM:
ubmList = []
p = re.compile('(.*)((m0[0-4][0-9])|(m050))(.*)((0[0-2][0-9])|(030))(\.sph$)')
for dir_, _, files in os.walk(rsr2015Path):
for fileName in files:
if p.search(fileName):
relDir = os.path.relpath(dir_, rsr2015Path + "/sph/male")
relFile = os.path.join(relDir, fileName)
ubmList.append(os.path.splitext(relFile)[0])
with open('task/ubm_list.txt','w') as of:
of.write("\n".join(ubmList))
The next section creates the list of files used to train the Nuisance Projection Attribute matrix that can be used for SVM-GMM tutorial:
napSegments = ubmList[::7]
napSpeakers = [seg.split('/')[0] for seg in napSegments]
nap_idmap = sidekit.IdMap()
nap_idmap.leftids = np.array(napSpeakers)
nap_idmap.rightids = np.array(napSegments)
nap_idmap.start = np.empty(nap_idmap.rightids.shape, '|O')
nap_idmap.stop = np.empty(nap_idmap.rightids.shape, '|O')
nap_idmap.validate()
nap_idmap.write('task/3sess-pwd_eval_m_nap.h5')
Generate now the list of models that will be used as blacklist to train the Support Vector Machines:
backSegments = random.sample(ubmList, 200)
backSpeakers = [seg.split('/')[0] for seg in backSegments]
back_idmap = sidekit.IdMap()
back_idmap.leftids = np.array(backSpeakers)
back_idmap.rightids = np.array(backSegments)
back_idmap.start = np.empty(back_idmap.rightids.shape, '|O')
back_idmap.stop = np.empty(back_idmap.rightids.shape, '|O')
back_idmap.validate()
back_idmap.write('task/3sess-pwd_eval_m_back.h5')
Eventually creates the IdMap
to compute statistics of the test segments
for the tutorial on SVMs:
test_idmap = sidekit.IdMap()
test_idmap.leftids = ndx.segset
test_idmap.rightids = ndx.segset
test_idmap.start = np.empty(test_idmap.rightids.shape, '|O')
test_idmap.stop = np.empty(test_idmap.rightids.shape, '|O')
test_idmap.validate()
test_idmap.write('task/3sess-pwd_eval_m_test.h5')