/** * Copyright 2007 DFKI GmbH. * All Rights Reserved. Use is subject to license terms. * * This file is part of MARY TTS. * * MARY TTS is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, version 3 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * */ package marytts.tools.redstart; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; /** * * @author Mat Wilson <mwilson@dfki.de> */ public class PromptSet { // ______________________________________________________________________ // Instance fields int promptCount = 0; // Number of prompts in the set File promptFolderPath; // Path containing prompt set structure Prompt[] promptArray; // Array of prompts AdminWindow adminWindow; // ______________________________________________________________________ // Class fields // ______________________________________________________________________ // Instance methods public PromptSet(AdminWindow adminWindow) throws IOException { this.adminWindow = adminWindow; this.promptFolderPath = adminWindow.getPromptFolderPath(); // Set object's folder path containing the prompt set this.promptCount = countPrompts(); // Determine the number of prompts this.promptArray = getPromptData(); // Load the prompt set // TESTCODE for (int index = 0; index < this.promptCount; index++) { Test.output("|PromptSet| Basename " + index + ": " + this.promptArray[index].getBasename()); Test.output("|PromptSet| Prompt Text " + index + ": " + this.promptArray[index].getPromptText()); Test.output("|PromptSet| Status " + index + ": " + this.promptArray[index].getRecCount() + " recordings"); } } /** * Gets number of prompts in the set * * @return The number of prompts */ public int getPromptCount() { return promptCount; } /** * Gets the folder path for the prompt set * * @return The folder path containing the prompt set */ public File getPromptFolderPath() { return promptFolderPath; } /** * Fills an array of Prompts with basename and prompt text data from a list of prompt text files, where each file contains a * single prompt sentence. * * @param promptFile * The file path to the folder of prompt text files * @param promptCount * The number of prompts in the folder * @throws FileNotFoundException * FileNotFoundException * @throws IOException * IOException * @return An array of Prompt objects */ private Prompt[] getPromptData() throws FileNotFoundException, IOException { // Create a list of files that are in the prompt text directory File[] promptFileList = this.promptFolderPath.listFiles(); Arrays.sort(promptFileList); Prompt[] promptArray = new Prompt[this.promptCount]; String basename = ""; String promptText = ""; String promptTranscriptionText = ""; int fileCount = 0; // TESTCODE Test.output("|PromptSet.getPromptData()| Total files = " + promptFileList.length); Test.output("|PromptSet.getPromptData()| Length of prompt array = " + promptArray.length); // Go through each file for (int index = 0; index < promptFileList.length; index++) { File promptFile = promptFileList[index]; // Only consider files (no directories) that are not hidden if ((promptFile.isFile()) && !promptFile.isHidden()) { // TESTCODE Test.output("***|PromptSet.getPromptData| Prompt file with path: " + promptFile.getPath()); // Extract the basename from the prompt filename basename = getBasename(promptFile); // Fill the array with a prompt having the above basename // Somehow creating this temp prompt avoids a null pointer exception Prompt tempPrompt = new Prompt(basename, adminWindow.getRecFolderPath(), adminWindow.getSynthFolderPath()); promptArray[fileCount] = tempPrompt; Test.output("***|PromptSet.getPromptData| Basename: " + basename); // TESTCODE // Read in prompt text promptText = getContents(promptFile).trim(); Test.output("|PromptSet.getPromptData| Prompt text: " + fileCount + ": " + promptText); // TESTCODE promptArray[fileCount].setPromptText(promptText); // Read in prompt transcription text File promptTranscriptionFile = new File(adminWindow.getTranscriptionFolderPath() + File.separator + basename + ".tr"); if (promptTranscriptionFile.exists()) { promptTranscriptionText = getContents(promptTranscriptionFile).trim(); Test.output("|PromptSet.getPromptData| Prompt Transcription text: " + fileCount + ": " + promptTranscriptionText); // TESTCODE promptArray[fileCount].setPromptTranscriptionText(promptTranscriptionText); } fileCount++; } } // TESTCODE Defensive coding below. Both counts should be equal since they used the same // approach for determining their numbers. if (promptCount != fileCount) { Test.output("|PromptSet.getPromptData| Error: Prompt count and file count are not equal."); } return promptArray; } // ______________________________________________________________________ // Class methods /** * Extracts the basename from a prompt filename * * @param promptFile * The file path for the prompt file * @return The basename for the file (e.g., bundesliga20003) */ static public String getBasename(File promptFile) { String filename = promptFile.getName(); // Get name of prompt text file (e.g., bundesliga20003.txt) int start = 0; int end = filename.length() - 4; // Don't include file extension String basename = filename.substring(start, end); return basename; // e.g., bundesliga20003 } /** * Reads in the contents of a file as a string. Taken from http://www.javapractices.com/Topic42.cjp. * * @param aFile * The file path for the input file * @return The file's contents as a String object */ static public String getContents(File aFile) { // ...checks on aFile are elided StringBuilder contents = new StringBuilder(); // declared here only to make visible to finally clause BufferedReader input = null; try { // use buffering, reading one line at a time // FileReader always assumes default encoding is OK! input = new BufferedReader(new InputStreamReader(new FileInputStream(aFile), "UTF-8")); String line = null; // not declared within while loop /* * readLine is a bit quirky : it returns the content of a line MINUS the newline. it returns null only for the END of * the stream. it returns an empty String if two newlines appear in a row. */ while ((line = input.readLine()) != null) { contents.append(line); contents.append(System.getProperty("line.separator")); } } catch (FileNotFoundException ex) { ex.printStackTrace(); } catch (IOException ex) { ex.printStackTrace(); } finally { try { if (input != null) { // Flush and close both "input" and its underlying FileReader input.close(); } } catch (IOException ex) { ex.printStackTrace(); } } return contents.toString(); } /** * Counts the number of prompts in a set * * @param promptFolderPath * The file path for the prompt file * @throws IOException * IOException * @return The number of prompts in the prompt file */ private int countPrompts() throws IOException { int promptCount = 0; // Total number of prompts in prompt file // TESTCODE String path = this.promptFolderPath.getPath(); // + File.separator; // doesn't seem to matter Test.output("Counting prompts in the following path: " + path); // Create a list of files in the prompt text directory File[] promptFiles = this.promptFolderPath.listFiles(); if (promptFiles == null) throw new IOException("No such directory: " + path); // Go through each file in the folder for (int index = 0; index < promptFiles.length; index++) { File promptFile = promptFiles[index]; // Only consider files (no directories) that are not hidden // Assumption: All files in this directory contain prompt text if ((promptFile.isFile()) && !promptFile.isHidden()) { promptCount++; } } // TESTCODE Test.output("|PromptSet.countPrompts()| Total prompts = " + promptCount); return promptCount; } // End of countPrompts }