96 lines
3.6 KiB
JavaScript
96 lines
3.6 KiB
JavaScript
// ============================================================
|
|
// TRANSCRIPTION SETTINGS — Web Speech API
|
|
// ============================================================
|
|
|
|
var _inited = false;
|
|
|
|
document.addEventListener('tabChanged', function(e) {
|
|
if (e.detail.tab !== 'settings' || _inited) return;
|
|
_inited = true;
|
|
initTranscriptionSettings();
|
|
});
|
|
|
|
// Also init on direct page load
|
|
if (document.readyState === 'loading') {
|
|
document.addEventListener('DOMContentLoaded', function() {
|
|
setTimeout(function() {
|
|
if (!_inited && document.getElementById('web-speech-enabled')) {
|
|
_inited = true;
|
|
initTranscriptionSettings();
|
|
}
|
|
}, 500);
|
|
});
|
|
} else {
|
|
setTimeout(function() {
|
|
if (!_inited && document.getElementById('web-speech-enabled')) {
|
|
_inited = true;
|
|
initTranscriptionSettings();
|
|
}
|
|
}, 500);
|
|
}
|
|
|
|
function initTranscriptionSettings() {
|
|
console.log('[TranscriptionSettings] Initializing...');
|
|
|
|
// ── Web Speech Recognition ───────────────────────────────
|
|
var speechCheckbox = document.getElementById('web-speech-enabled');
|
|
var speechStatus = document.getElementById('web-speech-status');
|
|
var speechBrowserInfo = document.getElementById('web-speech-browser-info');
|
|
|
|
if (speechCheckbox && window.WebSpeechRecognition) {
|
|
speechCheckbox.checked = WebSpeechRecognition.isEnabled();
|
|
speechStatus.textContent = WebSpeechRecognition.isEnabled() ? 'On — real-time streaming' : 'Off';
|
|
|
|
// Show privacy info
|
|
if (speechBrowserInfo) {
|
|
var privacyInfo = WebSpeechRecognition.getPrivacyInfo();
|
|
speechBrowserInfo.textContent = '';
|
|
appendPrivacyLine(speechBrowserInfo, 'Provider: ', privacyInfo.provider);
|
|
appendPrivacyLine(speechBrowserInfo, 'Privacy: ', privacyInfo.privacy);
|
|
appendPrivacyLine(speechBrowserInfo, 'Warning: ', privacyInfo.warning, true);
|
|
}
|
|
|
|
speechCheckbox.addEventListener('change', function() {
|
|
if (speechCheckbox.checked) {
|
|
// Show confirmation for privacy warning
|
|
showConfirm(
|
|
'WARNING: Real-time streaming uses your browser\'s speech recognition, ' +
|
|
'which may send audio to cloud servers (e.g., Google). ' +
|
|
'This is NOT HIPAA-compliant. ' +
|
|
'Only enable if you understand and accept this privacy trade-off.',
|
|
function() {
|
|
WebSpeechRecognition.setEnabled(true);
|
|
speechStatus.textContent = 'On — real-time streaming';
|
|
},
|
|
{ danger: true, confirmText: 'Enable' }
|
|
);
|
|
// Revert checkbox until confirmed
|
|
speechCheckbox.checked = false;
|
|
return;
|
|
}
|
|
|
|
WebSpeechRecognition.setEnabled(false);
|
|
speechStatus.textContent = 'Off';
|
|
});
|
|
|
|
// If not supported, disable and show message
|
|
if (!WebSpeechRecognition.isSupported()) {
|
|
speechCheckbox.disabled = true;
|
|
speechStatus.textContent = 'Not supported in this browser';
|
|
if (speechBrowserInfo) {
|
|
speechBrowserInfo.textContent = 'Not supported - Web Speech API not available in this browser.';
|
|
}
|
|
}
|
|
}
|
|
|
|
console.log('✅ Transcription settings initialized');
|
|
}
|
|
|
|
function appendPrivacyLine(container, label, value, warning) {
|
|
var strong = document.createElement('strong');
|
|
strong.textContent = label;
|
|
if (warning) strong.style.color = 'var(--orange)';
|
|
container.appendChild(strong);
|
|
container.appendChild(document.createTextNode(value));
|
|
container.appendChild(document.createElement('br'));
|
|
}
|