From 9e9162837083ee7326c59f316f172dbdbc3f6b50 Mon Sep 17 00:00:00 2001 From: DevSoftTech Server Date: Mon, 30 Mar 2026 19:21:12 +0530 Subject: [PATCH] feat: add manual speech mode switch (Auto/Browser/Server) - Added Mic Mode selector in consult header - Apply one preference to both Complaints Mic and Med Mic - Browser mode can be forced to bypass /stt-proxy 400 errors - Preference persisted in localStorage - Mode change stops active recordings safely before applying --- app/Views/billing/opd_prescription_basic.php | 150 +++++++++++++++---- 1 file changed, 119 insertions(+), 31 deletions(-) diff --git a/app/Views/billing/opd_prescription_basic.php b/app/Views/billing/opd_prescription_basic.php index beec2d8..ecf5b29 100644 --- a/app/Views/billing/opd_prescription_basic.php +++ b/app/Views/billing/opd_prescription_basic.php @@ -267,6 +267,11 @@ No local changes
+ @@ -966,6 +971,8 @@ var _onHttps = (window.location.protocol === 'https:'); var complaintsSttServerHealthUrl = _onHttps ? '' : 'http://139.59.13.39:8000/health'; var complaintsSttServerTranscribeUrl = _onHttps ? '' : 'http://139.59.13.39:8000/stt/transcribe'; + var speechModePreferenceKey = 'opd_speech_mode_preference'; + var speechModePreference = (localStorage.getItem(speechModePreferenceKey) || 'auto').toString(); var draftKey = 'opd_rx_draft_' + ($('#opd_id').val() || '0'); var templateLoadState = { target: '', section: '', rows: [] }; var templateSaveState = { section: '', text: '', scope: 'doctor' }; @@ -1056,6 +1063,89 @@ } } + function getSpeechModePreference() { + var pref = (speechModePreference || 'auto').toString().toLowerCase(); + if (pref !== 'auto' && pref !== 'browser' && pref !== 'server') { + pref = 'auto'; + } + return pref; + } + + function applySpeechModePreference() { + var pref = getSpeechModePreference(); + + if ($('#speech_mode_select').length) { + $('#speech_mode_select').val(pref); + } + + if (pref === 'browser') { + if (complaintsSpeechRecognition) { + setComplaintsMicMode('browser', 'Speech mode set to Browser.'); + } else { + setComplaintsMicMode('off', 'Browser speech is not supported for Complaints Mic.'); + } + + if (medicalSpeechRecognition) { + setMedicalMicMode('browser', 'Speech mode set to Browser.'); + } else { + setMedicalMicMode('off', 'Browser speech is not supported for Med Mic.'); + } + return; + } + + checkComplaintsSttServer().then(function(serverUp) { + if (pref === 'server') { + if (serverUp) { + setComplaintsMicMode('server', 'Speech mode set to Server.'); + setMedicalMicMode('server', 'Speech mode set to Server.'); + } else { + if (complaintsSpeechRecognition) { + setComplaintsMicMode('browser', 'Server unavailable. Browser mode active.'); + } else { + setComplaintsMicMode('off', 'Server unavailable and browser speech unsupported.'); + } + + if (medicalSpeechRecognition) { + setMedicalMicMode('browser', 'Server unavailable. Browser mode active.'); + } else { + setMedicalMicMode('off', 'Server unavailable and browser speech unsupported.'); + } + } + return; + } + + // Auto mode + if (serverUp) { + setComplaintsMicMode('server', 'Complaints Mic ready (server mode).'); + setMedicalMicMode('server', 'Medical Mic ready (server mode).'); + } else { + if (complaintsSpeechRecognition) { + setComplaintsMicMode('browser', 'Complaints Mic ready (browser mode).'); + } else { + setComplaintsMicMode('off', 'Complaints Mic unavailable in this browser.'); + } + + if (medicalSpeechRecognition) { + setMedicalMicMode('browser', 'Medical Mic ready (browser mode).'); + } else { + setMedicalMicMode('off', 'Medical Mic unavailable in this browser.'); + } + } + }).catch(function() { + if (complaintsSpeechRecognition) { + setComplaintsMicMode('browser', 'Complaints Mic ready (browser mode).'); + } else { + setComplaintsMicMode('off', 'Complaints Mic unavailable in this browser.'); + } + + if (medicalSpeechRecognition) { + setMedicalMicMode('browser', 'Medical Mic ready (browser mode).'); + } else { + setMedicalMicMode('off', 'Medical Mic unavailable in this browser.'); + } + }); + } + function setComplaintsMicListening(listening) { var $btn = $('#btn_complaints_mic'); if (!$btn.length) { @@ -1534,22 +1624,7 @@ }; } - // Check server STT availability first; fallback to browser, then off - checkComplaintsSttServer().then(function(serverUp) { - if (serverUp) { - setComplaintsMicMode('server', 'Complaints Mic ready (server STT).'); - } else if (complaintsSpeechRecognition) { - setComplaintsMicMode('browser', 'Complaints Mic ready (browser mode).'); - } else { - setComplaintsMicMode('off', 'Complaints Mic unavailable in this browser.'); - } - }).catch(function() { - if (complaintsSpeechRecognition) { - setComplaintsMicMode('browser', 'Complaints Mic ready (browser mode).'); - } else { - setComplaintsMicMode('off', 'Complaints Mic unavailable in this browser.'); - } - }); + setComplaintsMicMode('off', 'Checking speech mode...'); $('#btn_complaints_mic').on('click', function() { if (complaintsMicMode === 'server') { @@ -1596,21 +1671,7 @@ }; } - checkComplaintsSttServer().then(function(serverUp) { - if (serverUp) { - setMedicalMicMode('server', 'Medical Mic ready (server mode).'); - } else if (medicalSpeechRecognition) { - setMedicalMicMode('browser', 'Medical Mic ready (browser mode).'); - } else { - setMedicalMicMode('off', 'Medical Mic unavailable in this browser.'); - } - }).catch(function() { - if (medicalSpeechRecognition) { - setMedicalMicMode('browser', 'Medical Mic ready (browser mode).'); - } else { - setMedicalMicMode('off', 'Medical Mic unavailable in this browser.'); - } - }); + setMedicalMicMode('off', 'Checking speech mode...'); $(document).on('click', '.btn-medical-stt', function() { var targetId = ($(this).data('target') || '').toString(); @@ -2968,6 +3029,33 @@ renderComplaintChips(); initComplaintsSpeech(); initMedicalSpeechButtons(); + applySpeechModePreference(); + + $('#speech_mode_select').val(getSpeechModePreference()); + $('#speech_mode_select').on('change', function() { + var nextPref = (($(this).val() || 'auto').toString().toLowerCase()); + if (nextPref !== 'auto' && nextPref !== 'browser' && nextPref !== 'server') { + nextPref = 'auto'; + } + + speechModePreference = nextPref; + localStorage.setItem(speechModePreferenceKey, nextPref); + + if (complaintsMicActive && complaintsMediaRecorder) { + complaintsMediaRecorder.stop(); + } + if (complaintsMicActive && complaintsSpeechRecognition) { + complaintsSpeechRecognition.stop(); + } + if (medicalSttActive && medicalSttRecorder) { + medicalSttRecorder.stop(); + } + if (medicalBrowserSttActive && medicalSpeechRecognition) { + medicalSpeechRecognition.stop(); + } + + applySpeechModePreference(); + }); setTimeout(loadPatientScanHistory, 50); $(document).on('click', '.btn-ai-rewrite', function() {