Spaces:
Running
Running
quand je dis bonjour il se mets sur la troisieme colonne normalement le chat ia reste sur la deuxieme colonne s'il te plait peut tu rectifier sa et je voudrais aussi que le micro fonctionne s'il te plait que tout soit fonctionnel merci
Browse files- rosalinda.html +35 -9
- style.css +6 -1
rosalinda.html
CHANGED
|
@@ -55,11 +55,11 @@
|
|
| 55 |
let lastAIText = "";
|
| 56 |
|
| 57 |
function addMsg(text, who){
|
| 58 |
-
|
| 59 |
-
div.className = `msg
|
| 60 |
"ml-auto bg-blue-900/10 border-blue-800/50" :
|
| 61 |
-
"bg-gray-700/50 border-gray-700"}`;
|
| 62 |
-
|
| 63 |
msgs.appendChild(div);
|
| 64 |
msgs.scrollTop = msgs.scrollHeight;
|
| 65 |
}
|
|
@@ -115,7 +115,6 @@
|
|
| 115 |
r.continuous = false;
|
| 116 |
return r;
|
| 117 |
}
|
| 118 |
-
|
| 119 |
rec = setupSTT();
|
| 120 |
|
| 121 |
micBtn.onclick = async () => {
|
|
@@ -123,37 +122,64 @@
|
|
| 123 |
alert("Reconnaissance vocale non disponible ici. Essaie Chrome/Edge.");
|
| 124 |
return;
|
| 125 |
}
|
| 126 |
-
if (listening)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 127 |
|
| 128 |
listening = true;
|
| 129 |
statusEl.textContent = "Micro: écoute…";
|
|
|
|
| 130 |
let finalText = "";
|
|
|
|
| 131 |
|
| 132 |
rec.onresult = (e) => {
|
|
|
|
| 133 |
let transcript = "";
|
| 134 |
for (let i = e.resultIndex; i < e.results.length; i++){
|
| 135 |
transcript += e.results[i][0].transcript;
|
| 136 |
if (e.results[i].isFinal) finalText += e.results[i][0].transcript + " ";
|
| 137 |
}
|
| 138 |
inp.value = (finalText || transcript).trim();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 139 |
};
|
| 140 |
|
| 141 |
-
rec.onerror = () => {
|
|
|
|
| 142 |
listening = false;
|
| 143 |
statusEl.textContent = "Micro: erreur";
|
|
|
|
| 144 |
};
|
| 145 |
|
| 146 |
rec.onend = () => {
|
| 147 |
listening = false;
|
| 148 |
statusEl.textContent = "Micro: prêt";
|
|
|
|
| 149 |
if (inp.value.trim()) handleSend(inp.value);
|
| 150 |
};
|
| 151 |
|
| 152 |
-
try {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 153 |
listening = false;
|
| 154 |
statusEl.textContent = "Micro: prêt";
|
|
|
|
| 155 |
}
|
| 156 |
-
|
| 157 |
|
| 158 |
addMsg("Bonjour 👋 Je suis Rosalinda. Clique 🎤 pour parler ou écris-moi.", "ai");
|
| 159 |
</script>
|
|
|
|
| 55 |
let lastAIText = "";
|
| 56 |
|
| 57 |
function addMsg(text, who){
|
| 58 |
+
const div = document.createElement("div");
|
| 59 |
+
div.className = `msg ${who === "me" ?
|
| 60 |
"ml-auto bg-blue-900/10 border-blue-800/50" :
|
| 61 |
+
"bg-gray-700/50 border-gray-700"} max-w-[80%] p-3 rounded-xl border`;
|
| 62 |
+
div.textContent = text;
|
| 63 |
msgs.appendChild(div);
|
| 64 |
msgs.scrollTop = msgs.scrollHeight;
|
| 65 |
}
|
|
|
|
| 115 |
r.continuous = false;
|
| 116 |
return r;
|
| 117 |
}
|
|
|
|
| 118 |
rec = setupSTT();
|
| 119 |
|
| 120 |
micBtn.onclick = async () => {
|
|
|
|
| 122 |
alert("Reconnaissance vocale non disponible ici. Essaie Chrome/Edge.");
|
| 123 |
return;
|
| 124 |
}
|
| 125 |
+
if (listening) {
|
| 126 |
+
rec.stop();
|
| 127 |
+
listening = false;
|
| 128 |
+
statusEl.textContent = "Micro: prêt";
|
| 129 |
+
micBtn.classList.remove("listening");
|
| 130 |
+
return;
|
| 131 |
+
}
|
| 132 |
|
| 133 |
listening = true;
|
| 134 |
statusEl.textContent = "Micro: écoute…";
|
| 135 |
+
micBtn.classList.add("listening");
|
| 136 |
let finalText = "";
|
| 137 |
+
let timeoutId;
|
| 138 |
|
| 139 |
rec.onresult = (e) => {
|
| 140 |
+
clearTimeout(timeoutId);
|
| 141 |
let transcript = "";
|
| 142 |
for (let i = e.resultIndex; i < e.results.length; i++){
|
| 143 |
transcript += e.results[i][0].transcript;
|
| 144 |
if (e.results[i].isFinal) finalText += e.results[i][0].transcript + " ";
|
| 145 |
}
|
| 146 |
inp.value = (finalText || transcript).trim();
|
| 147 |
+
|
| 148 |
+
// Reset timeout on new results
|
| 149 |
+
timeoutId = setTimeout(() => {
|
| 150 |
+
if (listening) {
|
| 151 |
+
rec.stop();
|
| 152 |
+
}
|
| 153 |
+
}, 2000);
|
| 154 |
};
|
| 155 |
|
| 156 |
+
rec.onerror = (e) => {
|
| 157 |
+
console.error("Speech recognition error", e);
|
| 158 |
listening = false;
|
| 159 |
statusEl.textContent = "Micro: erreur";
|
| 160 |
+
micBtn.classList.remove("listening");
|
| 161 |
};
|
| 162 |
|
| 163 |
rec.onend = () => {
|
| 164 |
listening = false;
|
| 165 |
statusEl.textContent = "Micro: prêt";
|
| 166 |
+
micBtn.classList.remove("listening");
|
| 167 |
if (inp.value.trim()) handleSend(inp.value);
|
| 168 |
};
|
| 169 |
|
| 170 |
+
try {
|
| 171 |
+
rec.start();
|
| 172 |
+
// Auto-stop after 8 seconds if no speech detected
|
| 173 |
+
setTimeout(() => {
|
| 174 |
+
if (listening) rec.stop();
|
| 175 |
+
}, 8000);
|
| 176 |
+
} catch (e) {
|
| 177 |
+
console.error("Speech recognition start error", e);
|
| 178 |
listening = false;
|
| 179 |
statusEl.textContent = "Micro: prêt";
|
| 180 |
+
micBtn.classList.remove("listening");
|
| 181 |
}
|
| 182 |
+
};
|
| 183 |
|
| 184 |
addMsg("Bonjour 👋 Je suis Rosalinda. Clique 🎤 pour parler ou écris-moi.", "ai");
|
| 185 |
</script>
|
style.css
CHANGED
|
@@ -107,8 +107,13 @@ input:focus, button:focus {
|
|
| 107 |
opacity: 0.8;
|
| 108 |
}
|
| 109 |
}
|
| 110 |
-
|
| 111 |
.listening {
|
| 112 |
animation: pulse 1.5s infinite;
|
| 113 |
background-color: rgba(239, 68, 68, 0.2) !important;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 114 |
}
|
|
|
|
| 107 |
opacity: 0.8;
|
| 108 |
}
|
| 109 |
}
|
|
|
|
| 110 |
.listening {
|
| 111 |
animation: pulse 1.5s infinite;
|
| 112 |
background-color: rgba(239, 68, 68, 0.2) !important;
|
| 113 |
+
border-color: rgba(239, 68, 68, 0.5) !important;
|
| 114 |
+
}
|
| 115 |
+
|
| 116 |
+
.msg {
|
| 117 |
+
word-break: break-word;
|
| 118 |
+
white-space: pre-wrap;
|
| 119 |
}
|