!7 sclass HearMyselfTest > DynPrintLog { S text = "I like you", heard; transient JTextField tfText; transient JLabel lblCat; int timeout = 5; start { logModuleOutput(); } visualize { ret withCenteredButtons( northAndCenter( centerAndEast( vstack( jsection("Text to say", onEnter(rThread doIt, tfText = jLiveValueTextField_bothWays(dm_fieldLiveValue('text)))), jsection("What I heard", disableTextField(jLiveValueTextField(dm_fieldLiveValue('heard))))), withMargin(lblCat = jimage(#1101344))), super.visualize()), "Do the test", rThread doIt); } void doIt enter { temp dm_tempDisableAllButtons(); S text = getTextTrim(tfText); if (empty(text)) ret; print("Initiating voice"); O voiceOutput = dm_getModule(dm_requireModule("#1016614/VoiceOutput")); print("Initiating ear"); //O katze = dm_getModule(dm_requireModule("#1016461/Katze")); O katze = dm_getModule(dm_requireModule("#1018551/SpeechRecognizer")); call(katze, 'startListening); if (!chromeSpeech_hasRecognizer()) { do { sleepSeconds(1); } while (!chromeSpeech_hasRecognizer()); } sleepSeconds(2); // give time to start double seconds = this.timeout; long logLength = fileSize(speechRecognitionLog()); print("Saying & listening for " + seconds + " seconds: " + text); call(voiceOutput, 'say, text); long timeout = sysTime()+toMS(seconds); new Var vLine; ManualTailFile tail = new(speechRecognitionLog(), vfAppendToLineBuffer(unquotingLineBuffer(vfSetVar(vLine)))); tailFile_newOnly(tail); while (sysTime() < timeout && !vLine.has()) { tail.check(); sleep(100); } print("Stop listening."); call(katze, 'stopListening); S s = speechRecognitionLog_extractUtterance(vLine!); setField(heard := s); print("Got line: " + s); if (match(text, s)) { print("Yes, I can hear myself!!"); setModuleName("I can hear myself :)"); setImage(lblCat, #1101341); } else if (nempty(s)) { print("I said: " + quote(text) + ", but I heard: " + quote(s)); setModuleName("I seem to mishear myself"); setImage(lblCat, #1101343); } else { print("I said: " + quote(text) + ", but I heard nothing."); setModuleName("I can't hear me :("); setImage(lblCat, #1101342); } } enhanceFrame { dm_intFieldMenuItem(f, 'timeout); } }