/**
* 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 marytts.signalproc.adaptation.BaselineFeatureExtractor;
import marytts.signalproc.adaptation.VocalTractTransformationData;
import marytts.util.string.StringUtils;
/**
*
* Wrapper class for weighted codebooks for voice conversion
*
* @author Oytun Türk
*/
public class WeightedCodebook extends VocalTractTransformationData {
// These are for feature requests from the codebook
public static final int SOURCE = 1;
public static final int TARGET = 2;
public static final int SOURCE_TARGET = 3;
public static final int TARGET_SOURCE = 4;
//
public WeightedCodebookEntry[] entries;
public WeightedCodebookFileHeader header;
public WeightedCodebook() {
this(0, 0);
}
public WeightedCodebook(int totalLsfEntriesIn, int totalF0StatisticsIn) {
if (header == null)
header = new WeightedCodebookFileHeader(totalLsfEntriesIn);
allocate();
}
public void allocate() {
allocate(header.totalEntries);
}
public void allocate(int totalEntriesIn) {
if (totalEntriesIn > 0) {
entries = new WeightedCodebookEntry[totalEntriesIn];
header.totalEntries = totalEntriesIn;
} else {
entries = null;
header.totalEntries = 0;
}
}
public double[][] getFeatures(int speakerType, int desiredFeatures) {
double[][] features = null;
if (entries != null) {
features = new double[header.totalEntries][];
int dimension = 0;
boolean isLsfDesired = false;
boolean isF0Desired = false;
boolean isEnergyDesired = false;
boolean isDurationDesired = false;
boolean isMfccDesired = false;
if (StringUtils.isDesired(BaselineFeatureExtractor.LSF_FEATURES, desiredFeatures)) {
dimension += header.lsfParams.dimension;
isLsfDesired = true;
}
if (StringUtils.isDesired(BaselineFeatureExtractor.F0_FEATURES, desiredFeatures)) {
dimension += 1;
isF0Desired = true;
}
if (StringUtils.isDesired(BaselineFeatureExtractor.ENERGY_FEATURES, desiredFeatures)) {
dimension += 1;
isEnergyDesired = true;
}
if (StringUtils.isDesired(BaselineFeatureExtractor.DURATION_FEATURES, desiredFeatures)) {
dimension += 1;
isDurationDesired = true;
}
if (StringUtils.isDesired(BaselineFeatureExtractor.MFCC_FEATURES_FROM_FILES, desiredFeatures)) {
dimension += header.mfccParams.dimension;
isMfccDesired = true;
}
int currentPos;
for (int i = 0; i < header.totalEntries; i++) {
features[i] = new double[dimension];
currentPos = 0;
// Source
if (speakerType == SOURCE || speakerType == SOURCE_TARGET) {
if (isLsfDesired && entries[i].sourceItem.lsfs != null) {
System.arraycopy(entries[i].sourceItem.lsfs, 0, features[i], currentPos, header.lsfParams.dimension);
currentPos += header.lsfParams.dimension;
}
if (isF0Desired) {
features[i][currentPos] = entries[i].sourceItem.f0;
currentPos += 1;
}
if (isEnergyDesired) {
features[i][currentPos] = entries[i].sourceItem.energy;
currentPos += 1;
}
if (isDurationDesired) {
features[i][currentPos] = entries[i].sourceItem.duration;
currentPos += 1;
}
if (isMfccDesired) {
System.arraycopy(entries[i].sourceItem.mfccs, 0, features[i], currentPos, header.mfccParams.dimension);
currentPos += header.mfccParams.dimension;
}
}
// Target
if (speakerType == TARGET || speakerType == TARGET_SOURCE) {
if (isLsfDesired) {
System.arraycopy(entries[i].targetItem.lsfs, 0, features[i], currentPos, header.lsfParams.dimension);
currentPos += header.lsfParams.dimension;
}
if (isF0Desired) {
features[i][currentPos] = entries[i].targetItem.f0;
currentPos += 1;
}
if (isEnergyDesired) {
features[i][currentPos] = entries[i].targetItem.energy;
currentPos += 1;
}
if (isDurationDesired) {
features[i][currentPos] = entries[i].targetItem.duration;
currentPos += 1;
}
if (isMfccDesired) {
System.arraycopy(entries[i].targetItem.mfccs, 0, features[i], currentPos, header.mfccParams.dimension);
currentPos += header.mfccParams.dimension;
}
}
// Repeat Source here (i.e. target is requested first)
if (speakerType == TARGET_SOURCE) {
if (isLsfDesired) {
System.arraycopy(entries[i].sourceItem.lsfs, 0, features[i], currentPos, header.lsfParams.dimension);
currentPos += header.lsfParams.dimension;
}
if (isF0Desired) {
features[i][currentPos] = entries[i].sourceItem.f0;
currentPos += 1;
}
if (isEnergyDesired) {
features[i][currentPos] = entries[i].sourceItem.energy;
currentPos += 1;
}
if (isDurationDesired) {
features[i][currentPos] = entries[i].sourceItem.duration;
currentPos += 1;
}
if (isMfccDesired) {
System.arraycopy(entries[i].sourceItem.mfccs, 0, features[i], currentPos, header.mfccParams.dimension);
currentPos += header.mfccParams.dimension;
}
}
}
}
return features;
}
}