/** * 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/>. * */ package marytts.signalproc.analysis; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import marytts.util.io.StreamUtils; import marytts.util.math.MathUtils; /** * A wrapper class for frame based voice quality parameters * * @author Marcela Charfuelan */ public class VoiceQuality { public double[][] vq; public VoiceQualityFileHeader params; public VoiceQuality() { this(""); } public VoiceQuality(String vqFile) { readVqFile(vqFile); } /** * VoiceQuality object containing various vq mesures * * @param numVqParams * number of vq parameters per frame * @param Fs * sampling rate * @param skipSize * skip size in seconds * @param winSize * window size in seconds */ public VoiceQuality(int numVqParams, int Fs, float skipSize, float winSize) { params = new VoiceQualityFileHeader(); params.dimension = numVqParams; params.samplingRate = 16000; params.skipsize = skipSize; // in seconds params.winsize = winSize; // in seconds } public void allocate(int numFramesVq, double[][] par) { params.numfrm = numFramesVq; vq = new double[params.dimension][numFramesVq]; for (int i = 0; i < params.dimension; i++) for (int j = 0; j < numFramesVq; j++) vq[i][j] = par[i][j]; } public double[] getOQG() { return vq[0]; } public double[] getGOG() { return vq[1]; } public double[] getSKG() { return vq[2]; } public double[] getRCG() { return vq[3]; } public double[] getIC() { return vq[4]; } public void printPar() { System.out.println("Features Read:\nframe\tOQG\tGOG\tSKG\tRCG\tIC"); for (int i = 0; i < params.numfrm; i++) System.out.format("%d\t%.3f %.3f %.3f %.3f %.3f \n", i + 1, vq[0][i], vq[1][i], vq[2][i], vq[3][i], vq[4][i]); } public void printMeanStd() { System.out.println("Mean +- Standard deviation:\n\tOQG\tGOG\tSKG\tRCG\tIC"); System.out.format("mean: %.3f\t%.3f\t%.3f\t%.3f\t%.3f\n", MathUtils.mean(vq[0], 0), MathUtils.mean(vq[1], 0), MathUtils.mean(vq[2], 0), MathUtils.mean(vq[3], 0), MathUtils.mean(vq[4], 0)); System.out.format("std : %.3f\t%.3f\t%.3f\t%.3f\t%.3f\n", MathUtils.standardDeviation(vq[0], 0), MathUtils.standardDeviation(vq[1], 0), MathUtils.standardDeviation(vq[2], 0), MathUtils.standardDeviation(vq[3], 0), MathUtils.standardDeviation(vq[4], 0)); } public void applyZscoreNormalization() { for (int i = 0; i < vq.length; i++) vq[i] = MathUtils.normalizeZscore(vq[i]); } public void readVqFile(String vqFile) { params = new VoiceQualityFileHeader(); if (vqFile != "") { DataInputStream stream = null; try { stream = params.readHeader(vqFile, true); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (stream != null) { try { vq = readVqs(stream, params); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } public void writeVqFile(String vqFile) { if (vqFile != "") { DataOutputStream stream = null; try { stream = params.writeHeader(vqFile, true); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (stream != null) { try { writeVqs(stream, vq); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } public static void writeVqs(DataOutputStream stream, double[][] vqs) throws IOException { if (stream != null && vqs != null && vqs.length > 0) { for (int i = 0; i < vqs.length; i++) { StreamUtils.writeDoubleArray(stream, vqs[i]); } stream.close(); } } public static double[][] readVqs(DataInputStream stream, VoiceQualityFileHeader params) throws IOException { double[][] vqs = null; if (stream != null && params.dimension > 0 && params.dimension > 0) { vqs = new double[params.dimension][]; for (int i = 0; i < vqs.length; i++) { vqs[i] = StreamUtils.readDoubleArray(stream, params.numfrm); } stream.close(); } return vqs; } }