/**
* 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.adaptation.codebook;
import java.io.IOException;
import marytts.signalproc.adaptation.Context;
import marytts.util.io.MaryRandomAccessFile;
/**
*
* A collection of speaker specific acoustic features for a voice conversion unit, i.e. a speech frame or a phone, etc.
*
* @author Oytun Türk
*
*/
public class WeightedCodebookSpeakerItem {
public double[] lsfs;
public double[] mfccs;
public double f0;
public double duration;
public double energy;
public String phn;
public Context context;
public WeightedCodebookSpeakerItem() {
this(0, 0);
}
public WeightedCodebookSpeakerItem(int lpOrder, int mffcDimension) {
allocate(lpOrder, mffcDimension);
phn = "";
}
public void allocate(int lpOrder, int mfccDimension) {
allocateLsfs(lpOrder);
allocateMfccs(mfccDimension);
}
public void allocateLsfs(int lpOrder) {
if (lsfs == null || lpOrder != lsfs.length) {
if (lpOrder > 0)
lsfs = new double[lpOrder];
else
lsfs = null;
}
}
public void allocateMfccs(int mffcDimension) {
if (mfccs == null || mffcDimension != mfccs.length) {
if (mffcDimension > 0)
mfccs = new double[mffcDimension];
else
mfccs = null;
}
}
public void setLsfs(double[] lsfsIn) {
if (lsfsIn != null) {
if (lsfs == null || lsfsIn.length != lsfs.length)
allocateLsfs(lsfsIn.length);
System.arraycopy(lsfsIn, 0, lsfs, 0, lsfsIn.length);
} else
lsfs = null;
}
public void setMfccs(double[] mfccsIn) {
if (mfccsIn != null) {
if (mfccs == null || mfccsIn.length != mfccs.length)
allocateMfccs(mfccsIn.length);
System.arraycopy(mfccsIn, 0, mfccs, 0, mfccsIn.length);
} else
mfccs = null;
}
public void write(MaryRandomAccessFile ler) {
if (lsfs != null || mfccs != null) {
if (lsfs != null) {
try {
ler.writeInt(lsfs.length);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
ler.writeDouble(lsfs);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
try {
ler.writeInt(0);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (mfccs != null) {
try {
ler.writeInt(mfccs.length);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
ler.writeDouble(mfccs);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
try {
ler.writeInt(0);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
try {
ler.writeDouble(f0);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
ler.writeDouble(duration);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
ler.writeDouble(energy);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
int tmpLen = 0;
if (phn != "")
tmpLen = phn.length();
try {
ler.writeInt(tmpLen);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (tmpLen > 0) {
try {
ler.writeChar(phn.toCharArray());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
tmpLen = 0;
if (context != null) {
if (context.allContext != "")
tmpLen = context.allContext.length();
}
try {
ler.writeInt(tmpLen);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (tmpLen > 0) {
try {
ler.writeChar(context.allContext.toCharArray());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public void read(MaryRandomAccessFile ler, int lpOrder, int mfccDimension) {
allocate(lpOrder, mfccDimension);
if ((lsfs != null && lpOrder > 0) || (mfccs != null && mfccDimension > 0)) {
int lpOrderInFile = 0;
try {
lpOrderInFile = ler.readInt();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
assert lpOrderInFile == lpOrder;
if (lpOrderInFile > 0) {
try {
lsfs = ler.readDouble(lpOrderInFile);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else
lsfs = null;
int mfccDimensionInFile = 0;
try {
mfccDimensionInFile = ler.readInt();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
assert mfccDimensionInFile == mfccDimension;
if (mfccDimensionInFile > 0) {
try {
mfccs = ler.readDouble(mfccDimensionInFile);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else
mfccs = null;
try {
f0 = ler.readDouble();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
duration = ler.readDouble();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
energy = ler.readDouble();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
int tmpLen = 0;
try {
tmpLen = ler.readInt();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
phn = "";
if (tmpLen > 0) {
try {
phn = String.copyValueOf(ler.readChar(tmpLen));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
tmpLen = 0;
try {
tmpLen = ler.readInt();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
context = null;
if (tmpLen > 0) {
try {
context = new Context(String.copyValueOf(ler.readChar(tmpLen)));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}