/**
* 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.signalproc.analysis;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import marytts.util.io.FileUtils;
/**
* A wrapper class to read fields in Festival UTT files
*
* @author Oytun Türk
*/
public class FestivalUtt extends AlignmentData {
public Labels[] labels;
public String[] keys;
public FestivalUtt() {
this("");
}
public FestivalUtt(String festivalUttFile) {
keys = new String[6];
keys[0] = "==Segment==";
keys[1] = "==Target==";
keys[2] = "==Syllable==";
keys[3] = "==Word==";
keys[4] = "==IntEvent==";
keys[5] = "==Phrase==";
labels = new Labels[keys.length];
if (FileUtils.exists(festivalUttFile)) {
read(festivalUttFile);
}
}
public void read(String festivalUttFile) {
String allText = null;
try {
allText = FileUtils.getFileAsString(new File(festivalUttFile), "ASCII");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (allText != null) {
String[] lines = allText.split("\n");
int i, j;
int[] boundInds = new int[keys.length];
Arrays.fill(boundInds, -1);
int boundCount = 0;
for (i = 0; i < keys.length; i++) {
for (j = 0; j < lines.length; j++) {
if (lines[j].compareTo(keys[i]) == 0) {
boundInds[i] = j;
break;
}
}
}
for (i = 0; i < keys.length; i++) {
if (boundInds[i] > -1) {
int fromIndex = boundInds[i] + 1;
int toIndex = (i < keys.length - 1 ? boundInds[i + 1] - 1 : lines.length - 1);
labels[i] = createLabels(lines, fromIndex, toIndex);
// Shift all valuesRest by one, and put the f0 into valuesRest[0]
if (keys[i].compareTo("==Target==") == 0) {
for (j = 0; j < labels[i].items.length; j++) {
int numTotalValuesRest = 0;
if (labels[i].items[j].valuesRest != null) {
double[] tmpValues = new double[labels[i].items[j].valuesRest.length];
System.arraycopy(labels[i].items[j].valuesRest, 0, tmpValues, 0,
labels[i].items[j].valuesRest.length);
labels[i].items[j].valuesRest = new double[tmpValues.length + 1];
labels[i].items[j].valuesRest[0] = Double.valueOf(labels[i].items[j].phn);
System.arraycopy(labels[i].items[j].valuesRest, 0, tmpValues, 1,
labels[i].items[j].valuesRest.length);
} else {
labels[i].items[j].valuesRest = new double[1];
labels[i].items[j].valuesRest[0] = Double.valueOf(labels[i].items[j].phn);
}
}
}
//
} else
labels[i] = null;
}
}
}
private Labels createLabels(String[] lines, int fromIndex, int toIndex) {
String[] relevantLines = new String[toIndex - fromIndex + 1];
System.arraycopy(lines, fromIndex, relevantLines, 0, relevantLines.length);
Labels l = new Labels(relevantLines, 2);
return l;
}
public static FestivalUtt readFestivalUttFile(String festivalUttFile) {
FestivalUtt f = new FestivalUtt(festivalUttFile);
return f;
}
public static void main(String[] args) {
FestivalUtt f = new FestivalUtt("d:/a.utt");
System.out.println("Test completed...");
}
}