Skip to content

Commit 91e7ff3

Browse files
Add voice dictation: live transcribing, voice commands (delete/clear/send/stop), info popup
1 parent 444c177 commit 91e7ff3

1 file changed

Lines changed: 71 additions & 2 deletions

File tree

ask.html

Lines changed: 71 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@
6363
<header class="page-header"><div class="hc"><a href="index.html" class="logo"><img src="acreetionoslogo.webp" alt="AcreetionOS" class="logo-img" width="36" height="36" />Acreetion<span>OS</span></a><nav class="main-nav"><a href="index.html">Home</a><a href="wiki.html">Wiki</a><a href="contact.html">Contact</a></nav></div></header>
6464
<div class="pw">
6565
<div id="chat-mode">
66-
<div id="chat-header"><div class="chat-brand"><div class="chat-avatar">A</div><div><div class="chat-name">AIDEN</div><div class="chat-sub">AcreetionOS Onboard Assistant</div></div></div><button id="tts-btn" title="Toggle voice" style="background:transparent;border:1px solid var(--gbd);color:var(--g);padding:0.4rem 0.6rem;border-radius:6px;cursor:pointer;font-size:1rem;transition:all 0.2s">🔊</button></div>
66+
<div id="chat-header"><div class="chat-brand"><div class="chat-avatar">A</div><div><div class="chat-name">AIDEN</div><div class="chat-sub">AcreetionOS Onboard Assistant</div></div></div><div style="display:flex;gap:0.4rem"><button id="info-btn" title="How this works" style="background:transparent;border:1px solid var(--gbd);color:var(--fg2);padding:0.4rem 0.6rem;border-radius:6px;cursor:pointer;font-size:0.9rem;transition:all 0.2s"></button><button id="tts-btn" title="Toggle voice" style="background:transparent;border:1px solid var(--gbd);color:var(--g);padding:0.4rem 0.6rem;border-radius:6px;cursor:pointer;font-size:1rem;transition:all 0.2s">🔊</button></div></div>
6767
<div id="messages"><div class="msg ai"><div class="sender">AIDEN</div>Hey! I'm AIDEN, your onboard AcreetionOS assistant. Ask me anything about the project — installation, features, requirements, or team. I work completely offline! ✨</div></div>
6868
<div class="suggestions" id="suggestions">
6969
<button class="suggestion-chip">What is AcreetionOS?</button>
@@ -74,11 +74,28 @@
7474
<button class="suggestion-chip">Is it free?</button>
7575
</div>
7676
<div id="input-row">
77-
<input id="chat-input" type="text" placeholder="Ask AIDEN anything..." autocomplete="off" />
77+
<input id="chat-input" type="text" placeholder="Type or tap 🎤 and speak..." autocomplete="off" />
78+
<button id="mic-btn" title="Voice input" style="background:transparent;border:1px solid var(--gbd);color:var(--fg2);border-radius:8px;padding:0 0.8rem;cursor:pointer;font-size:1rem;transition:all 0.2s">🎤</button>
7879
<button id="send-btn"></button>
7980
</div>
8081
</div>
8182
</div>
83+
84+
<div id="info-popup" style="display:none;position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.7);backdrop-filter:blur(8px);z-index:1000;align-items:center;justify-content:center;padding:1rem">
85+
<div style="background:var(--gb2);border:1px solid var(--gbd);border-radius:12px;max-width:500px;padding:2rem;position:relative">
86+
<button id="info-close" style="position:absolute;top:0.5rem;right:0.8rem;background:none;border:none;color:var(--fg2);font-size:1.5rem;cursor:pointer">×</button>
87+
<h2 style="font-family:var(--fm);color:var(--g);margin-bottom:1rem;font-size:1.1rem">🎤 Voice Commands</h2>
88+
<ul style="list-style:none;padding:0;color:var(--fg2);font-size:0.85rem">
89+
<li style="padding:0.4rem 0;border-bottom:1px solid var(--gbd)"><strong style="color:var(--fg)">Tap 🎤</strong> — starts listening. Speak your question.</li>
90+
<li style="padding:0.4rem 0;border-bottom:1px solid var(--gbd)"><strong style="color:var(--fg)">"delete"</strong> — removes the last word you said.</li>
91+
<li style="padding:0.4rem 0;border-bottom:1px solid var(--gbd)"><strong style="color:var(--fg)">"clear"</strong> — clears the text field.</li>
92+
<li style="padding:0.4rem 0;border-bottom:1px solid var(--gbd)"><strong style="color:var(--fg)">"send"</strong> — sends the message to AIDEN.</li>
93+
<li style="padding:0.4rem 0;border-bottom:1px solid var(--gbd)"><strong style="color:var(--fg)">"stop"</strong> — stops listening.</li>
94+
<li style="padding:0.4rem 0"><strong style="color:var(--fg)">🔊 TTS</strong> — AIDEN reads answers aloud. Toggle on/off.</li>
95+
</ul>
96+
</div>
97+
</div>
98+
8299
<footer><p>AcreetionOS — <a href="index.html">Home</a> · <a href="https://discord.acreetionos.org">Discord</a></p></footer>
83100
<script>
84101
const KB = [
@@ -171,6 +188,58 @@
171188
document.getElementById('tts-btn').textContent=ttsEnabled?'🔊':'🔇'
172189
if(!ttsEnabled)window.speechSynthesis&&window.speechSynthesis.cancel()
173190
})
191+
192+
// Info popup
193+
const infoPopup=document.getElementById('info-popup')
194+
document.getElementById('info-btn').addEventListener('click',()=>infoPopup.style.display='flex')
195+
document.getElementById('info-close').addEventListener('click',()=>infoPopup.style.display='none')
196+
infoPopup.addEventListener('click',e=>{if(e.target===infoPopup)infoPopup.style.display='none'})
197+
198+
// Voice dictation
199+
let sr=null
200+
let listening=false
201+
const micBtn=document.getElementById('mic-btn')
202+
function startListening(){
203+
const SR=window.SpeechRecognition||window.webkitSpeechRecognition
204+
if(!SR){alert('Speech recognition not supported in this browser. Try Chrome.');return}
205+
sr=new SR()
206+
sr.lang='en-US'
207+
sr.interimResults=true
208+
sr.continuous=true
209+
sr.onresult=e=>{
210+
let interim='',final=''
211+
for(let i=e.resultIndex;i<e.results.length;i++){
212+
if(e.results[i].isFinal)final+=e.results[i][0].transcript
213+
else interim+=e.results[i][0].transcript
214+
}
215+
const words=(final||interim).toLowerCase().trim()
216+
if(words.endsWith('delete')){
217+
const parts=input.value.trim().split(/\s+/)
218+
parts.pop()
219+
input.value=parts.join(' ')
220+
input.selectionStart=input.selectionEnd=input.value.length
221+
return
222+
}
223+
if(words.endsWith('clear')){input.value='';return}
224+
if(words.endsWith('send')){input.value=input.value.trim();send(input.value);return}
225+
if(words.endsWith('stop')){stopListening();return}
226+
if(final){
227+
input.value+=final
228+
if(!input.value.startsWith(' '))input.value=input.value.trimStart()
229+
input.selectionStart=input.selectionEnd=input.value.length
230+
}
231+
}
232+
sr.onerror=()=>{stopListening()}
233+
sr.onend=()=>{if(listening&&sr)try{sr.start()}catch(e){}}
234+
try{sr.start();listening=true;micBtn.textContent='🎙️';micBtn.style.borderColor='var(--g)';micBtn.style.color='var(--g)'}catch(e){}
235+
}
236+
function stopListening(){
237+
listening=false
238+
if(sr){try{sr.stop()}catch(e){};sr=null}
239+
micBtn.textContent='🎤';micBtn.style.borderColor='var(--gbd)';micBtn.style.color='var(--fg2)'
240+
}
241+
micBtn.addEventListener('click',()=>{listening?stopListening():startListening()})
242+
174243
// Pre-load voices
175244
if(window.speechSynthesis)window.speechSynthesis.getVoices()
176245
</script>

0 commit comments

Comments
 (0)