/** * Copyright 2010 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/>. * */ // duplicates some functionality of mpi.eudico.server.corpora.clomimpl.praat (http://www.lat-mpi.eu/tools/elan/) package marytts.util.data.text; import java.io.FileWriter; import java.io.IOException; import java.util.Vector; /** * Representation of a Praat TextGrid annotation. A TextGrid consists of a number of tiers (which can be either TextTiers or, more * commonly, IntervalTiers), containing mutually independent label strings and their associated time points. * * @author steiner * */ public class PraatTextGrid { // start time of TextGrid private double xmin = Double.NaN; // end time of TextGrid private double xmax = Double.NaN; // tiers containing the actual data private Vector<PraatTier> tiers; /** * bare constructor */ public PraatTextGrid() { setTiers(new Vector<PraatTier>()); } /** * constructor accepting a Vector of PraatTiers * * @param tiers * tiers */ public PraatTextGrid(Vector<PraatTier> tiers) { setTiers(tiers); } /** * getter for TextGrid start time. queries all tiers and sets start time to earliest time found * * @return start time of TextGrid */ public double getXmin() { @SuppressWarnings("hiding") double xmin = Double.NaN; for (PraatTier tier : this.tiers) { if (Double.isNaN(xmin) || (!Double.isNaN(tier.getXmin()) && tier.getXmin() < xmin)) { xmin = tier.getXmin(); } } return xmin; } /** * getter for TextGrid end time. queries all tiers and sets end time to latest time found * * @return end time of TextGrid */ public double getXmax() { @SuppressWarnings("hiding") double xmax = Double.NaN; for (PraatTier tier : this.tiers) { if (Double.isNaN(xmax) || (!Double.isNaN(tier.getXmax()) && tier.getXmax() > xmax)) { xmax = tier.getXmax(); } } return xmax; } /** * getter for number of tiers * * @return number of tiers */ public int getNumberOfTiers() { return this.tiers.size(); } /** * getter for individual tier * * @param index * of desired tier * @return desired tier */ public PraatTier getTier(int index) { return this.tiers.get(index); } /** * replace tiers by specified Vector of tiers * * @param tiers * tiers */ public void setTiers(Vector<PraatTier> tiers) { this.tiers = tiers; } /** * add a new tier at the end of the TextGrid's tiers * * @param tier * to be appended */ public void appendTier(PraatTier tier) { this.tiers.add(tier); } /** * write TextGrid to text file which can be used by Praat * * @param fileName * of TextGrid file * @throws IOException * IOException */ public void writeToFile(String fileName) throws IOException { FileWriter fw = new FileWriter(fileName); fw.append(this.toString()); fw.close(); } /** * string representation of TextGrid, as it is written into text files by Praat and this.writeToFile(). Note that leading * whitespace is not generated */ public String toString() { StringBuilder str = new StringBuilder(); str.append("File type = \"ooTextFile\"\n"); str.append("Object class = \"TextGrid\""); str.append("\n"); str.append("xmin = " + getXmin() + " \n"); str.append("xmax = " + getXmax() + " \n"); str.append("tiers? <exists> \n"); str.append("size = " + getNumberOfTiers() + " \n"); str.append("item []: \n"); for (int t = 0; t < getNumberOfTiers(); t++) { str.append("item [" + (t + 1) + "]:\n"); str.append(getTier(t).toString()); } return str.toString(); } }