/** * Copyright 2007 DFKI GmbH. * All Rights Reserved. Use is subject to license terms. * * Permission is hereby granted, free of charge, to use and distribute * this software and its documentation without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of this work, and to * permit persons to whom this work is furnished to do so, subject to * the following conditions: * * 1. The code must retain the above copyright notice, this list of * conditions and the following disclaimer. * 2. Any modifications must be clearly marked as such. * 3. Original authors' names are not deleted. * 4. The authors' names are not used to endorse or promote products * derived from this software without specific prior written * permission. * * DFKI GMBH AND THE CONTRIBUTORS TO THIS WORK DISCLAIM ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL DFKI GMBH NOR THE * CONTRIBUTORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF * THIS SOFTWARE. */ package marytts.signalproc.sinusoidal.hntm.analysis; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import marytts.util.math.ArrayUtils; /** * @author oytun.turk * */ public class HntmSpeechSignal { public HntmSpeechFrame[] frames; public int samplingRateInHz; public float originalDurationInSeconds; public HntmSpeechSignal(HntmSpeechSignal existing) { frames = null; if (existing != null) { if (existing.frames != null) { frames = new HntmSpeechFrame[existing.frames.length]; for (int i = 0; i < existing.frames.length; i++) frames[i] = new HntmSpeechFrame(existing.frames[i]); } this.samplingRateInHz = existing.samplingRateInHz; this.originalDurationInSeconds = existing.originalDurationInSeconds; } } public HntmSpeechSignal(int totalFrm, int samplingRateInHz, float originalDurationInSeconds) { if (totalFrm > 0) { frames = new HntmSpeechFrame[totalFrm]; for (int i = 0; i < totalFrm; i++) frames[i] = new HntmSpeechFrame(); } else frames = null; this.samplingRateInHz = samplingRateInHz; this.originalDurationInSeconds = originalDurationInSeconds; } public HntmSpeechSignal(String binaryFile, int noiseModel) { try { read(binaryFile, noiseModel); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void write(String binaryFile) throws IOException { DataOutputStream d = new DataOutputStream(new FileOutputStream(new File(binaryFile))); write(d); } public void write(DataOutputStream d) throws IOException { int totalFrm = 0; if (frames != null && frames.length > 0) totalFrm = frames.length; d.writeInt(totalFrm); if (totalFrm > 0) { for (int i = 0; i < totalFrm; i++) frames[i].write(d); } d.writeInt(samplingRateInHz); d.writeFloat(originalDurationInSeconds); } public void read(String binaryFile, int noiseModel) throws IOException { DataInputStream d = new DataInputStream(new FileInputStream(new File(binaryFile))); read(d, noiseModel); } public void read(DataInputStream d, int noiseModel) throws IOException { int totalFrm = d.readInt(); frames = null; if (totalFrm > 0) { frames = new HntmSpeechFrame[totalFrm]; for (int i = 0; i < totalFrm; i++) frames[i] = new HntmSpeechFrame(d, noiseModel); } samplingRateInHz = d.readInt(); originalDurationInSeconds = d.readFloat(); } public float[] getAnalysisTimes() { float[] times = null; if (frames != null) { times = new float[frames.length]; for (int i = 0; i < frames.length; i++) times[i] = frames[i].tAnalysisInSeconds; } return times; } // Returns track segments for a given harmonic. Each segment corresponds to a voiced segment public double[][] getPhasesInRadians() { double[][] phases = null; if (frames != null && frames.length > 0) { phases = new double[frames.length][]; for (int i = 0; i < frames.length; i++) { if (frames[i].h != null) phases[i] = frames[i].h.getPhasesInRadians(); } } return phases; } public float[][] getLpcsAll() { float[][] lpcsAll = null; if (frames != null && frames.length > 0) { lpcsAll = new float[frames.length][]; for (int i = 0; i < frames.length; i++) { if (frames[i].n instanceof FrameNoisePartLpc) lpcsAll[i] = ArrayUtils.copy(((FrameNoisePartLpc) frames[i].n).lpCoeffs); } } return lpcsAll; } public float[] getLpcGainsAll() { float[] gainsAll = null; if (frames != null && frames.length > 0) { gainsAll = new float[frames.length]; for (int i = 0; i < frames.length; i++) { if (frames[i].n instanceof FrameNoisePartLpc) gainsAll[i] = ((FrameNoisePartLpc) frames[i].n).lpGain; else gainsAll[i] = -1.0f; } } return gainsAll; } public float[] getOrigNoiseStds() { float[] origNoiseStdsAll = null; if (frames != null && frames.length > 0) { origNoiseStdsAll = new float[frames.length]; for (int i = 0; i < frames.length; i++) { if (frames[i].n != null && (frames[i].n instanceof FrameNoisePartLpc)) origNoiseStdsAll[i] = ((FrameNoisePartLpc) frames[i].n).origNoiseStd; } } return origNoiseStdsAll; } public double[] getMaximumFrequencyOfVoicings() { double[] maximumFrequencyOfVoicings = null; if (frames != null && frames.length > 0) { maximumFrequencyOfVoicings = new double[frames.length]; for (int i = 0; i < frames.length; i++) maximumFrequencyOfVoicings[i] = frames[i].maximumFrequencyOfVoicingInHz; } return maximumFrequencyOfVoicings; } public int getTotalFrames() { if (frames != null && frames.length > 0) return frames.length; else return 0; } }