!7 static int port; p { if (isMainProgram()) { port = serveHttpWithWebSockets(9999, func(NanoHTTPD.IHTTPSession handshake) { ret new WebSocket(handshake) { protected void onPong(WebSocketFrame pongFrame) { print("pong"); } protected void onMessage(WebSocketFrame messageFrame) { print("msg: " + messageFrame.getTextPayload()); } protected void onClose(WebSocketFrame.CloseCode code, String reason, boolean initiatedByRemote) {} protected void onException(IOException e) { printStackTrace(e); } }; }); S url = print("http://localhost:" + port); openPlatformBrowser(url); } } html { ret h3("Speech Recognizer") + loadJQuery() + hdiv("Results come here", id := 'results, style := "margin: 10px") + hjavascript([[ var websocket = new WebSocket("ws://localhost:#PORT#/"); websocket.onopen = function(event) { $("#btn").prop('disabled', false); websocket.send("test"); }; var recognition = new webkitSpeechRecognition(); recognition.lang = "en-US"; recognition.onerror = function(event) { $("#results").html("Error."); started = false; $("#btn").html("Start recognition"); } recognition.onresult = function(event) { var result = event.results[0]; var transcript = result[0].transcript; $("#results").html("Transcript: " + transcript + (websocket ? " - have websocket" : "")); websocket.send(transcript); started = false; $("#btn").html("Start recognition"); } var started = false; function startOrStop() { if (started) { recognition.stop(); started = false; $("#btn").html("Start recognition"); } else { recognition.start(); started = true; $("#btn").html("Stop recognition"); } } ]]).replace("#PORT#", str(port)) + tag('button, "Start recognition", onclick := "startOrStop()", type := 'button, id := 'btn, disabled := 'disabled); }