package com.tlabs.speechalyzer.featureextract;
import java.io.File;
import java.util.Iterator;
import java.util.Vector;
import org.apache.log4j.Logger;
import com.felix.util.AudioUtil;
import com.felix.util.FileUtil;
import com.felix.util.KeyValues;
import com.felix.util.Util;
import com.felix.util.logging.Log4JLogger;
import com.tlabs.speechalyzer.AudioFileManager;
import com.tlabs.speechalyzer.Constants;
import com.tlabs.speechalyzer.RecFile;
public class OpenEarExtractor implements IExtractor {
private String _openEarConfigName;
private String _openEarCommandName;
private String _tmpWavName;
// private String _arffHeader;
private String _trainFileName;
private String _testFileName;
private Log4JLogger _logger;
private KeyValues _config;
public String getInfo() {
return "OpenEAR extractor with features: " + _openEarConfigName;
}
public OpenEarExtractor(KeyValues config) {
_config = config;
_logger = new Log4JLogger(
Logger.getLogger("com.tlabs.speechalyzer.featureextract.OpenEatExtractor"));
_openEarConfigName = _config.getString("openEarConfig");
_openEarCommandName = _config.getString("openEarCommand");
_trainFileName = _config.getString("trainFile");
_testFileName = _config.getString("testFile");
_tmpWavName = _config.getString("tmpWavFile");
}
public void extractFeatures(String fileName) {
String audioFile = checkFileName(fileName);
try {
FileUtil.delete(_testFileName);
} catch (Exception e) {
e.printStackTrace();
}
String command = _openEarCommandName + " -C " + _openEarConfigName
+ " -I " + audioFile + " -O " + _testFileName + " -classlabel "
+ Constants.CLASS_NO_CLASS_STRING;
try {
Util.execCmd(command, _logger);
} catch (Exception e) {
Util.errorOut(e, _logger);
}
}
public void extractAllFeatures(AudioFileManager afm, boolean append) {
long timeTaken = 0;
Vector<RecFile> audioFiles;
if (append) {
audioFiles = afm.getAudioFilesWithoutPredictions();
} else {
audioFiles = afm.getAudioFiles();
new File(_trainFileName).delete();
}
for (Iterator<RecFile> iterator = audioFiles.iterator(); iterator
.hasNext();) {
RecFile recFile = (RecFile) iterator.next();
String audioFile = checkFileName(recFile._path);
String command = _openEarCommandName + " -C " + _openEarConfigName
+ " -I " + audioFile + " -O " + _trainFileName
+ " -classlabel " + recFile.getStringLabel();
Util.printOut(".", false);
try {
long startTime = System.currentTimeMillis();
Util.execCmd(command, _logger);
timeTaken += System.currentTimeMillis() - startTime;
} catch (Exception e) {
e.printStackTrace();
_logger.error(e.getMessage());
}
System.out.print(".");
}
System.out.println();
_logger.info("featureExtraction of " + audioFiles.size()
+ " files took " + timeTaken / 1000.0 + " seconds");
}
private String checkFileName(String audioFile) {
if (!audioFile.endsWith(".wav")) {
_logger.info("not wav file (" + audioFile + "), needs conversion");
if (audioFile.endsWith(".raw")) {
try {
new File(_tmpWavName).delete();
byte[] data = FileUtil.getFileContentAsByteArray(audioFile);
AudioUtil.writeAudioToWavFile(data,
AudioUtil.FORMAT_PCM_8KHZ, _tmpWavName);
audioFile = _tmpWavName;
} catch (Exception e) {
Util.errorOut(e, _logger);
}
}
}
return audioFile;
}
}