package com.tlabs.speechalyzer.featureextract;
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.util.Iterator;
import java.util.Vector;
import org.apache.log4j.Logger;
import com.felix.util.FileUtil;
import com.felix.util.KeyValues;
import com.felix.util.Util;
import com.tlabs.speechalyzer.AudioFileManager;
import com.tlabs.speechalyzer.Constants;
import com.tlabs.speechalyzer.RecFile;
import com.tlabs.speechalyzer.Speechalyzer;
public class PraatExtractor implements IExtractor {
private String _praatScriptName;
private String _praatCommandName;
private String _tmpFeatName;
private String _arffHeader;
private String _trainFileName;
private String _testFileName;
private Logger _logger;
private KeyValues _config;
public String getInfo() {
return "Praat extractor with Polzehl Features";
}
public PraatExtractor(KeyValues config) {
_config = config;
_logger = Logger
.getLogger("com.tlabs.speechalyzer.featureextract.PraatExtractor");
_praatScriptName = _config.getString("praatScriptFile");
_praatCommandName = _config.getString("praatCommand");
_tmpFeatName = _config.getAbsPath("tempFeatFile");
try {
_arffHeader = FileUtil.getFileText(_config
.getString("arffHeaderFile"));
} catch (Exception e) {
e.printStackTrace();
_logger.error(e.getMessage());
}
_trainFileName = _config.getString("trainFile");
_testFileName = _config.getString("testFile");
}
public void extractFeatures(String testFileName) {
String command = _praatCommandName + " " + _praatScriptName + " "
+ testFileName + " " + Constants.CLASS_NO_CLASS_STRING + " "
+ _tmpFeatName;
System.out.println(command);
Process genProc = null;
String inline = "";
try {
genProc = Runtime.getRuntime().exec(command);
BufferedReader bfr = new BufferedReader(new InputStreamReader(
genProc.getErrorStream()));
while ((inline = bfr.readLine()) != null) {
_logger.debug(inline);
}
} catch (Exception e) {
genProc.destroy();
e.printStackTrace();
_logger.error(e.getMessage());
}
try {
String fileLines = FileUtil.getFileText(_tmpFeatName);
FileUtil.writeFileContent(_testFileName, _arffHeader + fileLines);
new File(_tmpFeatName).delete();
} catch (Exception e) {
_logger.error(e.getMessage());
e.printStackTrace();
}
}
public void extractAllFeatures(AudioFileManager afm, boolean append) {
long timeTaken = 0;
Vector<RecFile> audioFiles;
if (append) {
audioFiles = afm.getAudioFilesWithoutPredictions();
} else {
new File(_tmpFeatName).delete();
audioFiles = afm.getAudioFiles();
}
for (Iterator<RecFile> iterator = audioFiles.iterator(); iterator
.hasNext();) {
RecFile recFile = (RecFile) iterator.next();
String command = _praatCommandName + " " + _praatScriptName + " "
+ recFile.getTrainingFormat() + " " + _tmpFeatName;
try {
long startTime = System.currentTimeMillis();
Util.execCmd(command);
timeTaken += System.currentTimeMillis() - startTime;
} catch (Exception e) {
e.printStackTrace();
_logger.error(e.getMessage());
}
System.out.print(".");
}
try {
String fileLines = FileUtil.getFileText(_tmpFeatName);
FileUtil.writeFileContent(_trainFileName, _arffHeader + fileLines);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println();
_logger.info("featureExtraction of " + audioFiles.size()
+ " files took " + timeTaken / 1000.0 + " seconds");
}
}