feat: kiosk always-on mic — auto-start voice on kiosk entry, no sleep, no wake word needed

This commit is contained in:
2026-06-21 04:55:29 +00:00
parent 572f1b1816
commit f1d73e7b6a
3 changed files with 18 additions and 9 deletions
+10 -2
View File
@@ -161,7 +161,7 @@ function showApp(name, greeting, silent = false) {
}
}, 30000);
setInterval(() => {
if (voiceMode && voiceLastCmd > 0 && Date.now() - voiceLastCmd > VOICE_SLEEP_MS) {
if (voiceMode && !document.body.classList.contains(kiosk-mode) && voiceLastCmd > 0 && Date.now() - voiceLastCmd > VOICE_SLEEP_MS) {
exitVoiceMode();
}
}, 60000);
@@ -1322,11 +1322,15 @@ function initVoice() {
// Sleeping: ONLY respond to master wake phrases
if (isAsleep) {
if (WAKE_PHRASES.some(p => lc.includes(p))) wakeFromSleep();
return;
// In kiosk mode: wake word also wakes from sleep
if (document.body.classList.contains("kiosk-mode")) { wakeFromSleep(); }
else return;
}
if (!voiceMode) {
if (WAKE_PHRASES.some(p => lc.includes(p))) enterVoiceMode();
// Kiosk: any speech enters conversation mode
else if (document.body.classList.contains("kiosk-mode") && transcript.length > 2) enterVoiceMode("kiosk");
} else if (!voiceMuted) {
voiceLastCmd = Date.now();
voiceActive = Date.now();
@@ -1800,6 +1804,10 @@ async function toggleKiosk() {
switchTab("intel");
}
if (btn) { btn.textContent = "⧞ EXIT"; btn.style.color = "var(--cyan)"; }
// Kiosk: auto-start mic and enter always-on conversation mode
if (isAsleep) wakeFromSleep();
if (!voiceMode) enterVoiceMode("kiosk");
if (!isListening) { isListening = true; updateMicBtn(); if (recognition) try { recognition.start(); } catch(_) {} }
} else {
const ex = document.exitFullscreen || document.webkitExitFullscreen || document.mozCancelFullScreen || document.msExitFullscreen;
if (ex) ex.call(document).catch(() => {});
+1
View File
@@ -6,6 +6,7 @@ var SLEEP_CMDS = /\b(good\s*night(\s*jarvis)?|go\s*to\s*sleep|sleep\s*mode|shut\
function enterSleepMode() {
if (isAsleep) return;
if (document.body.classList.contains("kiosk-mode")) return; // never sleep in kiosk
isAsleep = true;
// Pause voice mode
+7 -7
View File
@@ -6,7 +6,7 @@
<title>JARVIS — Integrated Defense and Logistics System</title>
<link rel="preconnect" href="https://fonts.googleapis.com"/>
<link href="https://fonts.googleapis.com/css2?family=Orbitron:wght@400;600;700;900&family=Rajdhani:wght@300;400;500;600&family=Share+Tech+Mono&display=swap" rel="stylesheet"/>
<link rel="stylesheet" href="assets/css/jarvis.css?v=20260621c"/>
<link rel="stylesheet" href="assets/css/jarvis.css?v=20260621d"/>
</head>
<body>
<canvas id="particleCanvas"></canvas>
@@ -426,12 +426,12 @@
style="position:fixed;top:-9999px;left:-9999px;width:320px;height:240px"></video>
<script data-cfasync="false" src="https://cdn.jsdelivr.net/npm/face-api.js@0.22.2/dist/face-api.min.js" crossorigin="anonymous"></script>
<script data-cfasync="false" src="assets/js/jarvis-effects.js?v=20260621c"></script>
<script data-cfasync="false" src="assets/js/jarvis-overlays.js?v=20260621c"></script>
<script data-cfasync="false" src="assets/js/jarvis-app.js?v=20260621c"></script>
<script data-cfasync="false" src="assets/js/panels/jarvis-arc.js?v=20260621c"></script>
<script data-cfasync="false" src="assets/js/panels/jarvis-agents.js?v=20260621c"></script>
<script data-cfasync="false" src="assets/js/panels/jarvis-assistant.js?v=20260621c"></script>
<script data-cfasync="false" src="assets/js/jarvis-effects.js?v=20260621d"></script>
<script data-cfasync="false" src="assets/js/jarvis-overlays.js?v=20260621d"></script>
<script data-cfasync="false" src="assets/js/jarvis-app.js?v=20260621d"></script>
<script data-cfasync="false" src="assets/js/panels/jarvis-arc.js?v=20260621d"></script>
<script data-cfasync="false" src="assets/js/panels/jarvis-agents.js?v=20260621d"></script>
<script data-cfasync="false" src="assets/js/panels/jarvis-assistant.js?v=20260621d"></script>
<!-- VISION LIGHTBOX -->
<div id="vision-lightbox">