package edu.cmu.sphinx.frontend;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import org.testng.annotations.BeforeMethod;
import edu.cmu.sphinx.frontend.BaseDataProcessor;
import edu.cmu.sphinx.frontend.Data;
import edu.cmu.sphinx.frontend.DataProcessingException;
import edu.cmu.sphinx.frontend.DoubleData;
/**
* A DataProcessor implemenation which can be used to setup simple unit-tests for other DataProcessors. Addtionally some
* static utility methods which should ease unit-testing of DataProcessors are provided by this class.
*
* @author Holger Brandl
*/
public abstract class RandomDataProcessor extends BaseDataProcessor {
public static Random r = new Random(123);
protected List<Data> input;
@BeforeMethod
public void setUp() {
input = new ArrayList<Data>();
}
@Override
public Data getData() throws DataProcessingException {
return input.isEmpty() ? null : input.remove(0);
}
public List<Data> collectOutput(BaseDataProcessor dataProc) throws DataProcessingException {
dataProc.setPredecessor(this);
List<Data> output = new ArrayList<Data>();
Data d;
while ((d = dataProc.getData()) != null) {
output.add(d);
}
return output;
}
public static List<DoubleData> createFeatVectors(double lengthSec, int sampleRate, long startSample, int featDim, double shiftMs) {
int numFrames = (int) Math.ceil((lengthSec * 1000) / shiftMs);
List<DoubleData> datas = new ArrayList<DoubleData>(numFrames);
long curStartSample = startSample;
long shiftSamples = ms2samples((int) shiftMs, sampleRate);
for (int i = 0; i < numFrames; i++) {
double[] values = createRandFeatureVector(featDim, null, null);
datas.add(new DoubleData(values, sampleRate, curStartSample));
curStartSample += shiftSamples;
}
return datas;
}
public static double[] createRandFeatureVector(int featDim, double[] mean, double[] variance) {
if (mean == null) {
mean = new double[featDim];
}
if (variance == null) {
variance = new double[featDim];
for (int i = 0; i < variance.length; i++) {
variance[i] = 1;
}
}
assert featDim == mean.length && featDim == variance.length;
double[] updBlock = new double[featDim];
for (int i = 0; i < updBlock.length; i++) {
updBlock[i] = mean[i] + variance[i] * r.nextDouble(); // *10 to get better debuggable (sprich: merkbarer) values
}
return updBlock;
}
public static long ms2samples(double ms, int sampleRate) {
return Math.round(sampleRate * ms / 1000);
}
}