Spaces:
Running
Running
<html lang="en"> | |
<head> | |
<meta charset="UTF-8"> | |
<meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css"> | |
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css"> | |
<style> | |
body { | |
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; | |
background-color: #f4f7fb; | |
margin: 0; | |
padding: 0; | |
} | |
#chat-container { | |
max-width: 500px; | |
margin: auto; | |
padding: 25px; | |
border-radius: 15px; | |
background-color: #fff; | |
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1); | |
position: relative; | |
} | |
.btn-mic, .btn-send { | |
background-color: #007bff; | |
color: white; | |
border-radius: 8px; | |
padding: 10px 15px; | |
border: none; | |
cursor: pointer; | |
font-size: 1.1em; | |
transition: background-color 0.3s; | |
} | |
.btn-mic:hover, .btn-send:hover { | |
background-color: #0056b3; | |
} | |
</style> | |
<title>Voice-based ChatGPT</title> | |
</head> | |
<body> | |
<div id="chat-container"> | |
<div class="input-group"> | |
<button id="mic-button" class="btn-mic"><i class="fas fa-microphone"></i></button> | |
<button id="send-button" class="btn-send"><i class="fas fa-paper-plane"></i></button> | |
</div> | |
</div> | |
<script> | |
const synth = window.speechSynthesis; | |
// Speech-to-Text function | |
function startListening() { | |
const recognition = new (window.SpeechRecognition || window.webkitSpeechRecognition)(); | |
recognition.lang = "en-US"; | |
recognition.interimResults = false; | |
recognition.onresult = (event) => { | |
const transcript = event.results[0][0].transcript; | |
sendMessage(transcript); | |
}; | |
recognition.onerror = (event) => { | |
console.error("Speech recognition error:", event.error); | |
speak("Sorry, I couldn't understand you."); | |
}; | |
recognition.start(); | |
} | |
// Send message to server | |
async function sendMessage(message) { | |
if (!message.trim()) return; | |
addMessage("User", message, "user-message"); | |
try { | |
// Simulate bot typing | |
const botMessage = "Bot is typing..."; | |
addMessage("Bot", botMessage, "bot-message"); | |
// Simulate a server response (replace with actual server request) | |
const response = await new Promise(resolve => setTimeout(() => resolve({ response: "Hello! How can I assist you today?" }), 1000)); | |
const botMessageContent = response.response; | |
addMessage("Bot", botMessageContent, "bot-message"); | |
speak(botMessageContent); | |
} catch (error) { | |
console.error("Error:", error); | |
const errorMessage = "Sorry, something went wrong."; | |
addMessage("Bot", errorMessage, "bot-message"); | |
speak(errorMessage); | |
} | |
} | |
// Text-to-Speech function | |
function speak(text) { | |
const utterance = new SpeechSynthesisUtterance(text); | |
utterance.lang = "en-US"; | |
utterance.pitch = 1; | |
utterance.rate = 1; | |
synth.speak(utterance); | |
} | |
// Add message to chat history | |
function addMessage(sender, message, className) { | |
const chatHistory = document.getElementById("chat-container"); | |
const messageElement = document.createElement("div"); | |
messageElement.className = `message ${className}`; | |
messageElement.innerHTML = `<strong>${sender}:</strong> ${message}`; | |
chatHistory.appendChild(messageElement); | |
} | |
// Event Listeners | |
document.getElementById("send-button").addEventListener("click", startListening); | |
document.getElementById("mic-button").addEventListener("click", startListening); | |
</script> | |
</body> | |
</html> | |