/* * Copyright 1999-2002 Carnegie Mellon University. * Portions Copyright 2002 Sun Microsystems, Inc. * Portions Copyright 2002 Mitsubishi Electric Research Laboratories. * All Rights Reserved. Use is subject to license terms. * * See the file "license.terms" for information on usage and * redistribution of this file, and for a DISCLAIMER OF ALL * WARRANTIES. * */ package edu.cmu.sphinx.linguist.acoustic.tiedstate.trainer; import edu.cmu.sphinx.linguist.acoustic.tiedstate.Loader; import edu.cmu.sphinx.linguist.acoustic.tiedstate.Saver; import edu.cmu.sphinx.linguist.acoustic.tiedstate.TiedStateAcousticModel; import edu.cmu.sphinx.linguist.acoustic.UnitManager; import edu.cmu.sphinx.util.props.*; import java.io.FileNotFoundException; import java.io.IOException; /** Represents the generic interface to the Acoustic Model for sphinx4 */ public class TrainerAcousticModel extends TiedStateAcousticModel { @S4Component(type = Saver.class) public static final String SAVER = "saver"; private Saver saver; @S4Double(defaultValue = 0.0001f) public final static String PROP_VARIANCE_FLOOR = "varianceFloor"; /** Mixture component score floor. */ @S4Double(defaultValue = 0.0) public final static String PROP_MC_FLOOR = "MixtureComponentScoreFloor"; /** Mixture weight floor. */ @S4Double(defaultValue = 1e-7f) public final static String PROP_MW_FLOOR = "mixtureWeightFloor"; /** * The save format for the acoustic model data. Current supported formats * are: */ @S4String(defaultValue = "sphinx3.binary") public final static String PROP_FORMAT_SAVE = "saveFormat"; public String saveFormat; /** Flag indicating all models should be operated on. */ public final static int ALL_MODELS = -1; /** The pool manager */ private HMMPoolManager hmmPoolManager; public TrainerAcousticModel(Loader loader, UnitManager unitManager, boolean useComposites, Saver saver, String saveFormat) throws IOException { super(loader, unitManager, useComposites); this.saver = saver; this.hmmPoolManager = new HMMPoolManager(loader); this.saveFormat = saveFormat; logInfo(); } public TrainerAcousticModel() { } @Override public void newProperties(PropertySheet ps) throws PropertyException { super.newProperties(ps); saver = (Saver) ps.getComponent(SAVER); try { hmmPoolManager = new HMMPoolManager(loader); } catch (IOException e) { throw new PropertyException(e); } saveFormat = ps.getString(PROP_FORMAT_SAVE); logInfo(); } /** * Saves the acoustic model with a given name and format * * @param name * the name of the acoustic model * @throws IOException * if the model could not be loaded * @throws FileNotFoundException * if the model does not exist */ public void save(String name) throws IOException { saver.save(name, true); logger.info("saved models with " + saver); } /** * Loads the acoustic models. This has to be explicitly requested in this * class. * * @throws IOException * if the model could not be loaded * @throws FileNotFoundException * if the model does not exist */ public void load() throws IOException, FileNotFoundException { // super.load(); logInfo(); hmmPoolManager = new HMMPoolManager(loader); } /** Resets the buffers. */ public void resetBuffers() { // Resets the buffers and associated variables. hmmPoolManager.resetBuffers(); } /** * Accumulate the current TrainerScore into the buffers. * * @param index * the current index into the TrainerScore vector * @param trainerScore * the TrainerScore in the current frame * @param nextTrainerScore * the TrainerScore in the next frame */ public void accumulate(int index, TrainerScore[] trainerScore, TrainerScore[] nextTrainerScore) { hmmPoolManager.accumulate(index, trainerScore, nextTrainerScore); } /** * Accumulate the current TrainerScore into the buffers. * * @param index * the current index into the TrainerScore vector * @param trainerScore * the TrainerScore */ public void accumulate(int index, TrainerScore[] trainerScore) { hmmPoolManager.accumulate(index, trainerScore); } /** * Update the log likelihood. This should be called at the end of each * utterance. */ public void updateLogLikelihood() { hmmPoolManager.updateLogLikelihood(); } /** * Normalize the buffers and update the models. * * @return the log likelihood for the whole training set */ public float normalize() { float logLikelihood = hmmPoolManager.normalize(); hmmPoolManager.update(); return logLikelihood; } }