static private List<User> LoadDataset(string datasetFileName) { //Get The dataset folder path. var splittedPath = datasetFileName.Split('\\'); string folderPath = ""; for (int i = 0; i < splittedPath.Length - 1; i++) { folderPath += splittedPath[i] + '\\'; } folderPath += "audiofiles\\"; //read the training samples files names Dictionary<string, User> users = new Dictionary<string, User>(); StreamReader reader = new StreamReader(datasetFileName); string line; while ((line = reader.ReadLine()) != null) { string userName = line.Split('/')[0]; string fileName = line.Split('/')[1] + ".wav"; //check if user already exists, if not add an entry in the dictionary. if (users.ContainsKey(userName) == false) { User user = new User(); user.UserTemplates = new List<AudioSignal>(); user.UserName = userName; users.Add(userName, user); } AudioSignal audio; string fullFileName = folderPath + userName + '\\' + fileName; try { audio = openNISTWav(fullFileName); } catch (Exception) { audio = AudioOperations.OpenAudioFile(folderPath + userName + '\\' + fileName); } audio = AudioOperations.RemoveSilence(audio); users[userName].UserTemplates.Add(audio); } reader.Close(); //move the users to a list for convenience reasons only. List<User> usersList = new List<User>(); foreach (var user in users) { usersList.Add(user.Value); } return usersList; }
static private List<User> ConcatenateSamples(List<User> dataset, int shrinkagefactor) { List<User> newDataset = new List<User>(); foreach (User user in dataset) { int numberOfSequences = user.UserTemplates.Count; //NOTE: i didn't handle the case if the number of sequences is not divisible by the shrinkage factor :) int newNumberOfSequences = numberOfSequences / shrinkagefactor; User concUser = new User(); concUser.UserName = user.UserName; concUser.UserTemplates = new List<AudioSignal>(newNumberOfSequences); int startIndex = 0; for (int i = 0; i < newNumberOfSequences; i++) { int currentConcSeqLength = 0; double currentConcSeqDuration = 0; for (int j = startIndex; j < startIndex + shrinkagefactor; j++) { currentConcSeqLength += user.UserTemplates[j].data.Length; currentConcSeqDuration += user.UserTemplates[j].signalLengthInMilliSec; } concUser.UserTemplates.Add(new AudioSignal()); concUser.UserTemplates[i].sampleRate = user.UserTemplates[0].sampleRate; concUser.UserTemplates[i].signalLengthInMilliSec = currentConcSeqDuration; concUser.UserTemplates[i].data = new double[currentConcSeqLength]; int concIndex = 0; for (int j = startIndex; j < startIndex + shrinkagefactor; j++) { user.UserTemplates[j].data.CopyTo(concUser.UserTemplates[i].data, concIndex); concIndex += user.UserTemplates[j].data.Length; } startIndex += shrinkagefactor; } newDataset.Add(concUser); } return newDataset; }