From 2461dd32e3c716a019006a405d6f7066ddd67605 Mon Sep 17 00:00:00 2001 From: balex Date: Mon, 9 Mar 2026 14:14:33 +0100 Subject: [PATCH] bug fix --- src/public/js/app.js | 40 ++++++++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/src/public/js/app.js b/src/public/js/app.js index e53e4f7..c51f985 100644 --- a/src/public/js/app.js +++ b/src/public/js/app.js @@ -176,7 +176,12 @@ function initRecognition() { checkBtn.disabled = !display.trim(); }; - r.onend = () => { if (state.isRecording) stopRecording(); }; + r.onend = () => { + if (state.isRecording) { + // Android stops recognition on its own after silence — restart it + try { r.start(); } catch (_) {} + } + }; r.onerror = (e) => { if (e.error !== 'no-speech') stopRecording(); }; return r; @@ -207,21 +212,24 @@ async function startRecording() { clearTimeout(recordingTimer); recordingTimer = setTimeout(stopRecording, MAX_RECORD_SECONDS * 1000); - // MediaRecorder for audio download — best-effort, after recognition starts - try { - const stream = await navigator.mediaDevices.getUserMedia({ audio: true }); - const mimeType = MediaRecorder.isTypeSupported('audio/webm;codecs=opus') - ? 'audio/webm;codecs=opus' : 'audio/webm'; - mediaRecorder = new MediaRecorder(stream, { mimeType }); - mediaRecorder.ondataavailable = e => { if (e.data.size > 0) audioChunks.push(e.data); }; - mediaRecorder.onstop = () => { - audioBlob = new Blob(audioChunks, { type: mimeType }); - stream.getTracks().forEach(t => t.stop()); - if (audioBlob.size > 0) downloadBtn.disabled = false; - }; - mediaRecorder.start(); - } catch (e) { - console.warn('MediaRecorder unavailable:', e); + // MediaRecorder for audio download — desktop only; on mobile it conflicts with SpeechRecognition + const isMobile = /Android|iPhone|iPad/i.test(navigator.userAgent); + if (!isMobile) { + try { + const stream = await navigator.mediaDevices.getUserMedia({ audio: true }); + const mimeType = MediaRecorder.isTypeSupported('audio/webm;codecs=opus') + ? 'audio/webm;codecs=opus' : 'audio/webm'; + mediaRecorder = new MediaRecorder(stream, { mimeType }); + mediaRecorder.ondataavailable = e => { if (e.data.size > 0) audioChunks.push(e.data); }; + mediaRecorder.onstop = () => { + audioBlob = new Blob(audioChunks, { type: mimeType }); + stream.getTracks().forEach(t => t.stop()); + if (audioBlob.size > 0) downloadBtn.disabled = false; + }; + mediaRecorder.start(); + } catch (e) { + console.warn('MediaRecorder unavailable:', e); + } } }