Exemplo n.º 1
0
        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;

        }