/*
* 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.tools.batch;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Scanner;
import edu.cmu.sphinx.frontend.util.StreamDataSource;
import edu.cmu.sphinx.recognizer.Recognizer;
import edu.cmu.sphinx.result.Result;
import edu.cmu.sphinx.util.props.ConfigurationManager;
/**
* Batch decoder recognizer which can be used inside Sphinxtrain
* to build lattices and generate decoding results.
*/
public class BatchDecoderRecognizer {
int ctlOffset = -1;
int ctlCount = 1000000;
String config;
String hmm;
String ctl;
String hyp;
String featDir;
ConfigurationManager manager;
StreamDataSource source;
Recognizer recognizer;
PrintWriter writer;
void parseArgs(String[] argv) {
for (int i = 0; i < argv.length; i++) {
if (argv[i].equals("-ctl")) {
ctl = argv[++i];
}
if (argv[i].equals("-config")) {
config = argv[++i];
}
if (argv[i].equals("-hmm")) {
hmm = argv[++i];
}
if (argv[i].equals("-ctloffset")) {
ctlOffset = Integer.parseInt(argv[++i]);
}
if (argv[i].equals("-ctlcount")) {
ctlCount = Integer.parseInt(argv[++i]);
}
if (argv[i].equals("-hyp")) {
hyp = argv[++i];
}
if (argv[i].equals("-feat")) {
featDir = argv[++i];
}
}
}
void recognize() throws IOException {
init();
writer = new PrintWriter (new File(hyp), "UTF-8");
Scanner scanner = new Scanner(new File(ctl));
for (int i = 0; i < ctlOffset; i++) {
if (scanner.hasNext())
scanner.next();
}
for (int i = 0; i < ctlCount; i++) {
if (scanner.hasNext()) {
String utteranceId = scanner.next();
String inputFile = featDir + "/" + utteranceId + ".wav";
processFile(utteranceId, inputFile);
}
}
writer.close();
scanner.close();
recognizer.deallocate();
}
private void processFile(String utteranceId, String inputFile) throws IOException {
FileInputStream stream = new FileInputStream(inputFile);
source.setInputStream(stream);
Result result = recognizer.recognize();
writer.println (result.getBestFinalResultNoFiller() + " (" + utteranceId + ")");
}
public static void main(String[] argv) throws IOException {
BatchDecoderRecognizer batchRecognizer = new BatchDecoderRecognizer();
batchRecognizer.parseArgs(argv);
batchRecognizer.recognize();
}
private void init() throws IOException {
manager = new ConfigurationManager(config);
recognizer = (Recognizer)manager.lookup("recognizer");
source = (StreamDataSource)manager.lookup("streamDataSource");
recognizer.allocate();
}
}