sclass TrainVAD { replace Recognizer with F1. new Best best; LPair trainingList; float stepSizeRatio = 0.25f; int clipLength; Recognizer go() { final BWImage img1 = frequencyImage(voiceMegaMix()); final BWImage img2 = frequencyImage(nonVoiceMegaMix()); clipLength = iround(2.0*spectro_pixelsPerSecond()); int stepSize = max(1, iround(clipLength*stepSizeRatio)); print(+clipLength); print(+stepSize); L images1 = map(func(IntRange r) -> BWImage { bwHorizontalClip(img1, r) }, stepIntRange(clipLength, intRange(0, img1.getWidth()), stepSize)); L images2 = map(func(IntRange r) -> BWImage { bwHorizontalClip(img2, r) }, stepIntRange(clipLength, intRange(0, img2.getWidth()), stepSize)); print(allImageSizes(concatLists(images1, images2))); print(l(images1) + " + " + l(images2) + " images"); trainingList = trueFalseBPairs(images1, images2); // dummy recognizers first test(func(BWImage img) -> bool { false }); test(func(BWImage img) -> bool { true }); new AIStrategy_RandomWithVariation strategy; strategy.best = best; strategy.submit = f1_scorePreciseRecognizer(trainingList); strategy.random = func -> Recognizer { nu(VAD_1, streakLength := random(1, clipLength/2), threshold := randomFloat(), band := audio_randomBand()) }; strategy.vary = func(Recognizer r) -> Recognizer { if (r cast VAD_1) ret nu(VAD_1, streakLength := varyInt(r.streakLength), threshold := varyFloat(r.threshold), band := audio_varyBand(r.band)); null; }; runStrategyWhileImprovement(best, strategy); /*for (int streakLength = 1; streakLength <= clipLength/2; streakLength++) test(nu(VAD_1, +streakLength));*/ ret best!; } void test(Recognizer r) { scorePreciseRecognizer(best, r, trainingList); } void showErrors(Recognizer r) { if (r == null) ret; new L errorImages; for (Pair p : trainingList) if (r.get(p.a) != p.b) errorImages.add(bwAutoContrast(p.a)); if (nempty(errorImages)) showImage("Errors", mergeBWImagesVertically(errorImages)); } }