private string convertDataGrid(string fileTextGrid, string fileDictionary) { string res = ""; int iterador = 0; string intervalString = "intervals: size = "; string textGridPhonemesHeader = ""; string textGridWordsHeader = ""; // Codificaciones: https://msdn.microsoft.com/en-us/library/windows/desktop/dd317756(v=vs.85).aspx int fileEncodingDictionary = 1252; string text = File.ReadAllText(fileTextGrid); string[] lines = text.Split('\n'); //------------------------------------------------------------ // Primero, voy a construir el diccionario. Este contiene // las palabras en ortografía normal, en arpabet, y en // los fonos que queremos en el textGrid //------------------------------------------------------------ string dictText = File.ReadAllText(fileDictionary, Encoding.GetEncoding(fileEncodingDictionary)); string[] dictLines = dictText.Split('\n'); string[] dictTabElements; dictWord[] dictionary = new dictWord[dictLines.Length]; for (int i = 0; i < dictLines.Length; i++) { dictTabElements = dictLines[i].Split('\t'); dictionary[i] = new dictWord(dictTabElements[0], dictTabElements[1], dictTabElements[2].Trim('\n', '\r')); } //------------------------------------------------------------ // Luego, voy a construir dos listas, una que contenga // la información de los intervalos que contienen fonemas, // y otra que contenga la información de los intervalos // que contienen palabras //------------------------------------------------------------ while (lines[iterador].Contains(intervalString) == false) { textGridPhonemesHeader += lines[iterador] + "\n"; iterador++; } textGridPhonemesHeader += lines[iterador] + "\n"; // Ver cuántos fonos hay en el textGrid //Console.WriteLine(lines[iterador]); string stringNumberGridsInFirstRow = lines[iterador].Substring((lines[iterador].IndexOf(intervalString) + intervalString.Length)); int numberGridsInFirstRow = Convert.ToInt16(stringNumberGridsInFirstRow); // Construir la lista de intervalos para los fonemas interval[] phonemes = new interval[numberGridsInFirstRow]; iterador = iterador + 1; phonemes = readTextGridIntervals(lines, iterador, numberGridsInFirstRow); Console.WriteLine(phonemes.Length.ToString()); // Construir la lista de intervalos para las palabras // Encontrar la línea que marca el inicio de los intervalos // que contienen las palabras iterador = iterador + numberGridsInFirstRow * 4; while (lines[iterador].Contains(intervalString) == false) { //Console.WriteLine(iterador.ToString()); textGridWordsHeader += lines[iterador] + "\n"; iterador++; } textGridWordsHeader += lines[iterador] + "\n"; // Ver cuántos fonos hay en el textGrid //Console.WriteLine(lines[iterador]); string stringNumberGridsInSecondRow = lines[iterador].Substring((lines[iterador].IndexOf(intervalString) + intervalString.Length)); int numberGridsInSecondRow = Convert.ToInt16(stringNumberGridsInSecondRow); // Leer el TextGrid para extraer las palabras interval[] words = new interval[numberGridsInSecondRow]; iterador = iterador + 1; words = readTextGridIntervals(lines, iterador, numberGridsInSecondRow); Console.WriteLine(words[0].xmin.ToString()); Console.WriteLine(words[0].xmax.ToString()); Console.WriteLine(words.Length.ToString()); //------------------------------------------------------------ //------------------------------------------------------------ // para cada palabra, buscar todos los fonemas que están dentro de ese índice de tiempo // buscar los índices de tiempo en los que ocurre una palabra (puede ocurrir varias veces en el texto) double currentWordXmin = 0; double currentWordXmax = 0; string currentWord = ""; string[] currentWordOutputVector = new string[0]; string currentWordJoinedArpabet = ""; string iteratingWordJoinedArpabet = ""; List <int> intervalPosition = new List <int>(); for (int i = 0; i < numberGridsInSecondRow; i++) { if (words[i].text.Equals("sp") == false) { intervalPosition = new List <int>(); currentWordOutputVector = new string[0]; iteratingWordJoinedArpabet = ""; currentWord = words[i].text; currentWordXmin = words[i].xmin; currentWordXmax = words[i].xmax; /*Console.WriteLine("este es el diccionario"); * for (int j = 0; j < dictionary.Length; j++) { * Console.WriteLine(dictionary[j].word + " - " + dictionary[j].wordArpabet + " - " + dictionary[j].wordOutput); * } * Console.WriteLine("-----------------------");*/ // Encontrar la palabra en el diccionario for (int j = 0; j < dictionary.Length; j++) { if (dictionary[j].word.ToLower().Equals(currentWord.ToLower()) == true) { currentWordOutputVector = dictionary[j].outputLetters; currentWordJoinedArpabet = dictionary[j].wordArpabet; } } // Encontrar los índices de los intervalos que corresponden a los // fonemas de la palabra actual for (int j = 0; j < numberGridsInFirstRow; j++) { if (phonemes[j].xmin >= currentWordXmin && phonemes[j].xmax <= currentWordXmax) { intervalPosition.Add(j); iteratingWordJoinedArpabet += phonemes[j].text; } } // cambiar las letras arpabet en eltextgrid por las letras que queremos if (currentWordJoinedArpabet.ToLower().Equals(iteratingWordJoinedArpabet.ToLower()) == true && currentWordOutputVector.Length == intervalPosition.Count) { for (int j = 0; j < intervalPosition.Count; j++) { phonemes[intervalPosition[j]].text = currentWordOutputVector[j]; } } else { Console.Write("Hubo un error al tratar de alinear " + currentWord + "porque "); if (currentWordJoinedArpabet.Equals(iteratingWordJoinedArpabet) == false) { Console.Write(" la palabra arpabet ( " + currentWordJoinedArpabet + " ) no es igual a la palabra actual (" + iteratingWordJoinedArpabet + ")\n"); } /*if (currentWordOutputVector.Length != intervalPosition.Count) { * Console.Write(" las palabras tienen diferente número de letras\n"); * }*/ } } } res = textGridPhonemesHeader; // Construir los intervalos de los fonemas for (int i = 0; i < numberGridsInFirstRow; i++) { res += "\t\t\t" + "intervals [" + (i + 1).ToString() + "]:\n"; res += "\t\t\t\t" + "xmin = " + phonemes[i].xmin.ToString().Replace(',', '.') + "\n"; res += "\t\t\t\t" + "xmax = " + phonemes[i].xmax.ToString().Replace(',', '.') + "\n"; res += "\t\t\t\t" + "text = \"" + phonemes[i].text + "\"\n"; } res += textGridWordsHeader; for (int i = 0; i < numberGridsInSecondRow; i++) { res += "\t\t\t" + "intervals [" + (i + 1).ToString() + "]:\n"; res += "\t\t\t\t" + "xmin = " + words[i].xmin.ToString().Replace(',', '.') + "\n"; res += "\t\t\t\t" + "xmax = " + words[i].xmax.ToString().Replace(',', '.') + "\n"; res += "\t\t\t\t" + "text = \"" + words[i].text + "\"\n"; } //Console.WriteLine(res); return(res); }
private dictWord[] buildDictionary(string fileDictionary, int needTheSylls) { // Codificaciones: https://msdn.microsoft.com/en-us/library/windows/desktop/dd317756(v=vs.85).aspx int fileEncodingDictionary = 1252; string dictText = File.ReadAllText(fileDictionary, Encoding.GetEncoding(fileEncodingDictionary)); string[] dictLines = dictText.Split('\n'); string[] dictTabElements; dictWord[] dictionary = new dictWord[dictLines.Length]; string wordInSyllables = ""; for (int i = 0; i < dictLines.Length; i++) { dictTabElements = dictLines[i].Split('\t'); wordInSyllables = dictTabElements[2].Trim('\n', '\r'); if ( needTheSylls == 0 ) { wordInSyllables = wordInSyllables.Replace(". ", ""); } dictionary[i] = new dictWord(dictTabElements[0], dictTabElements[1], wordInSyllables); } return dictionary; }