/** * Copyright 2004-2006 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.util.data; import java.io.BufferedOutputStream; import java.io.DataOutputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import marytts.util.io.General; public class ESTTrackWriter { private float[] times = null; private float[][] frames = null; private String feaType = ""; /** * Plain constructor. * * @param setTimes * The vector of frame locations * @param setFrames * The frames -- can be null if only times are to be written * @param setFeaType * A string indicating the feature type, for header info (e.g., "LPCC") */ public ESTTrackWriter(float[] setTimes, float[][] setFrames, String setFeaType) { this.times = setTimes; this.frames = setFrames; this.feaType = setFeaType; } /** * Triggers the writing of the file to the disk. * * @param fName * The name of the file to write to. * @param isBinary * true for a binary write, or false for an ascii text write. * @param isBigEndian * true for a big endian write (PowerPC or SPARC), or false for a little endian write (Intel). * * @throws IOException * IO Exception */ public void doWriteAndClose(String fName, boolean isBinary, boolean isBigEndian) throws IOException { // Open the file for writing DataOutputStream dos = null; try { dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(fName))); } catch (FileNotFoundException e) { throw new RuntimeException("Can't open file [" + fName + "] for writing.", e); } // Output the header dos.writeBytes("EST_File Track\n"); if (isBinary) { dos.writeBytes("DataType binary\n"); if (isBigEndian) dos.writeBytes("ByteOrder 10\n"); else dos.writeBytes("ByteOrder 01\n"); } else { dos.writeBytes("DataType ascii\n"); } int numChannels; if (frames != null && frames.length > 0 && frames[0] != null) numChannels = frames[0].length; else numChannels = 0; // e.g., for pitchmarks dos.writeBytes("NumFrames " + times.length + "\n" + "NumChannels " + numChannels + "\n" + "NumAuxChannels 0\n" + "EqualSpace 0\n" + "BreaksPresent true\n" + "CommentChar ;\n"); String K; for (int k = 0; k < numChannels; k++) { K = Integer.toString(k); dos.writeBytes("Channel_" + K + " " + feaType + "_" + K + "\n"); } dos.writeBytes("EST_Header_End\n"); // Output the data: // - in binary mode if (isBinary) { for (int i = 0; i < times.length; i++) { General.writeFloat(dos, isBigEndian, times[i]); General.writeFloat(dos, isBigEndian, 1.0f); for (int k = 0; k < numChannels; k++) { General.writeFloat(dos, isBigEndian, frames[i][k]); } } } // - in ASCII mode else { for (int i = 0; i < times.length; i++) { dos.writeBytes(Float.toString(times[i])); dos.writeBytes("\t1\t"); if (numChannels > 0) { dos.writeBytes(Float.toString(frames[i][0])); for (int k = 1; k < frames[0].length; k++) { dos.writeBytes(" " + Float.toString(frames[i][k])); } } dos.writeBytes("\n"); } } // Flush and close dos.flush(); dos.close(); } }