!7 cmodule PerceptronVAD1 > DynImageSurface { switchable int w = 5; switchable int h = 10; switchable int nMaxExamples = 2000; switchable S teacherModule; // an accurate VAD that we learn from new Perceptron perceptron; transient double[] parameters; transient ReliableSingleThread rstTrain = dm_rst(this, r train); afterVisualize { imageSurface_pixelated(imageSurface); setZoom(20); } start { dm_requireLiveAudioFFT(); dm_audioInput_enableSendOutClonedData(); dm_vmBus_onMessage_q newAudioFrequencyImageFromData(voidfunc(virtual BWImage _img, short[] fromData) { BWImage img = cast quickImport(_img); BWIntegralImage ii = new(img); BWImage bw = scaleDownUsingIntegralImageBW(ii, w, h); setImage(bw); parameters = concatDoubleArrays( bwImage_averageBrightnessPerRow(bw), bwImage_standardDeviationPerRow(bw)); if (teacherModule != null) { Bool va = cast dm_call(teacherModule, 'hasVoiceActivity, fromData); // TODO: wait a bit while va == null print("va: " + va); if (va != null && l(perceptron.examples) < nMaxExamples) { perceptron.addExample(parameters, va); print("Have " + nExamples(perceptron.examples)); } rstTrain.trigger(); } }); } void train enter { for ping (Double error : perceptron.trainingIterator()) if (error != null) { perceptron.printWithWeights(); change(); } } }