content: /**
   * Copyright 2007 DFKI GmbH.
   * All Rights Reserved.  Use is subject to license terms.
   * <p/>
   * This file is part of MARY TTS.
   * <p/>
   * 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.
   * <p/>
   * 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.
   * <p/>
   * 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;
  
  import java.io.IOException;
  import java.util.Arrays;
  
  import marytts.signalproc.adaptation.gmm.GMMMatch;
  import marytts.signalproc.adaptation.gmm.jointgmm.JointGMMMapper;
  import marytts.signalproc.adaptation.gmm.jointgmm.JointGMMMatch;
  import marytts.signalproc.adaptation.gmm.jointgmm.JointGMMSet;
  import marytts.signalproc.adaptation.gmm.jointgmm.JointGMMTransformerParams;
  import marytts.signalproc.analysis.Mfccs;
  import marytts.util.io.FileUtils;
  
  /**
   * This class transforms MFCCs to MFCCs
   *
   * @author Oytun T&uumlrk
   */
  public class MfccAdapter {
  
      public boolean bSilent;
      protected Mfccs inputMfccs;
      protected String outputFile;
      protected int numfrm;
      private BaselineTransformerParams baseParams;
  
      public MfccAdapter(BaselineAdaptationItem inputItem,
                         String strOutputFile,
                         JointGMMTransformerParams jgmmParamsIn) {
          baseParams = new JointGMMTransformerParams(jgmmParamsIn);
  
          init(inputItem, strOutputFile);
      }
  
      public void init(BaselineAdaptationItem inputItem, String strOutputFile) {
          outputFile = null;
  
          boolean bContinue = true;
  
          if (!FileUtils.exists(inputItem.mfccFile)) {
              System.out.println("Error! MFCC file " + inputItem.mfccFile + " not found.");
              bContinue = false;
          }
  
          if (strOutputFile == null || strOutputFile == "") {
              System.out.println("Invalid output file...");
              bContinue = false;
          }
  
          numfrm = 0;
          if (bContinue) {
              inputMfccs = new Mfccs(inputItem.mfccFile);
              numfrm = inputMfccs.mfccs.length;
              outputFile = strOutputFile;
          }
      }
  
      public void transformOnline(VocalTractTransformationFunction vtMapper,
                                  VocalTractTransformationData vtData) {
          int i;
  
          for (i = 0; i < numfrm; i++)
              inputMfccs.mfccs[i] = processFrame(inputMfccs.mfccs[i], vtMapper, vtData);
  
          try {
              Mfccs.writeRawMfccFile(inputMfccs.mfccs, outputFile);
          } catch (IOException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          }
      }
  
      //Voice conversion version
      public double[] processFrame(double[] frameMfccs,
                                   VocalTractTransformationFunction mapper,
                                   VocalTractTransformationData data) {
          GMMMatch gmmMatch = null;
  
          //Find target estimate from codebook
          if (baseParams.isVocalTractTransformation) //isTransformUnvoiced=false not supported for MFCCs currently! Voicing information should be passed here to support this feature
          {
              if (mapper instanceof JointGMMMapper) {
                  //Different weighting strategies can be tested here, i.e. doing a fuzzy phone classification
                  double[] gmmWeights = new double[1];
                  Arrays.fill(gmmWeights, 1.0);
  
                  gmmMatch = ((JointGMMMapper) mapper).transform(frameMfccs, (JointGMMSet) data, gmmWeights, baseParams.isVocalTractMatchUsingTargetModel);
              }
          }
  
          if (!baseParams.isResynthesizeVocalTractFromSourceModel)
              return ((JointGMMMatch) gmmMatch).outputFeatures;
          else
              return ((JointGMMMatch) gmmMatch).mappedSourceFeatures;
      }
  }
  
  