!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 transient double[] parameters; 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); print("va: " + va); } }); } }