pubmedqa-chatbot / index.html
frammartina's picture
Update index.html
98bfadf verified
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Speech Recognition Chat</title>
<link
rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"
/>
<style>
body {
background: linear-gradient(135deg, #667eea, #764ba2);
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
color: #f1f1f1;
display: flex;
flex-direction: column;
align-items: center;
padding: 20px;
min-height: 100vh;
margin: 0;
}
#chat-log {
background: rgba(0,0,0,0.3);
width: 90%;
max-width: 700px;
height: 350px;
overflow-y: auto;
padding: 15px;
border-radius: 12px;
box-shadow: 0 0 20px rgba(0,0,0,0.7);
margin-bottom: 15px;
}
.message {
padding: 10px 15px;
margin-bottom: 10px;
border-radius: 15px;
max-width: 80%;
word-wrap: break-word;
box-shadow: 0 2px 6px rgba(0,0,0,0.3);
font-size: 1rem;
line-height: 1.3;
opacity: 0;
animation: fadeInUp 0.5s forwards;
}
.message.user {
background: #4caf50;
align-self: flex-end;
color: white;
}
.message.bot {
background: #3a3a5e;
align-self: flex-start;
color: #ddd;
}
@keyframes fadeInUp {
from {
opacity: 0;
transform: translateY(10px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
#question,
#context,
#long_answer {
width: 90%;
max-width: 700px;
padding: 10px 15px;
border-radius: 12px;
border: none;
margin-bottom: 15px;
font-size: 1rem;
font-family: inherit;
box-shadow: 0 0 10px rgba(0,0,0,0.4);
resize: vertical;
background: rgba(255,255,255,0.1);
color: white;
}
#context, #long_answer {
min-height: 120px; /* box più grandi */
font-size: 1rem;
line-height: 1.4;
}
#question {
min-height: 40px;
}
#controls {
width: 90%;
max-width: 700px;
display: flex;
justify-content: center;
gap: 20px;
margin-bottom: 20px;
}
button {
padding: 12px 20px;
font-size: 1.1rem;
font-weight: bold;
border-radius: 30px;
border: none;
cursor: pointer;
display: flex;
align-items: center;
gap: 10px;
transition: all 0.3s ease;
box-shadow: 0 4px 10px rgba(0,0,0,0.3);
user-select: none;
}
button i {
font-size: 1.3rem;
transition: all 0.3s ease;
}
#record-btn {
background: #e94e77;
color: white;
box-shadow: 0 0 15px #e94e77;
}
#record-btn.recording i.fa-microphone {
color: #ff6f91;
animation: pulseMic 1.5s infinite;
transform-origin: center center;
}
@keyframes pulseMic {
0%, 100% {
transform: scale(1);
color: #e94e77;
filter: drop-shadow(0 0 5px #e94e77);
}
50% {
transform: scale(1.2);
color: #ff6f91;
filter: drop-shadow(0 0 15px #ff6f91);
}
}
#send {
background: #4caf50;
color: white;
box-shadow: 0 0 15px #4caf50;
}
#send:active i.fa-paper-plane {
transform: translateX(5px) rotate(15deg);
color: #1b5e20;
filter: drop-shadow(0 0 5px #1b5e20);
}
</style>
</head>
<body>
<h2>Chatbot PubMedQA</h2>
<label for="question">Please insert your question or press 'Recording question':</label><br>
<input type="text" id="question" size="80"><br>
<button id="record-btn">Recording question</button><br><br>
<label for="context">Insert the abstract of the paper:</label><br>
<textarea id="context" rows="5" cols="80"></textarea><br>
<label for="long_answer"> Insert the conclusion of the paper:</label><br>
<textarea id="long_answer" rows="5" cols="80"></textarea><br>
<button id="send" onclick="sendQuestion()">Send</button><br><br>
<p id="status"></p>
<p id="answer"></p>
<button id="read-answer-btn" onclick="readAnswer()" style="display:none;">🔊 Read Answer</button>
<script>
const recordBtn = document.getElementById("record-btn");
const status = document.getElementById("status");
const questionInput = document.getElementById("question");
const answerElem = document.getElementById("answer");
const readBtn = document.getElementById("read-answer-btn");
let recognition;
let isRecording = false;
if (!('webkitSpeechRecognition' in window)) {
status.innerText = "Il riconoscimento vocale non è supportato da questo browser.";
recordBtn.disabled = true;
} else {
recognition = new webkitSpeechRecognition();
recognition.lang = 'en-US';
recognition.continuous = false;
recognition.interimResults = false;
recognition.onstart = () => {
status.innerText = "Recording...";
recordBtn.innerText = "🎙️ Stop recording";
isRecording = true;
};
recognition.onend = () => {
status.innerText = "End of the recording.";
recordBtn.innerText = "Recording question";
isRecording = false;
};
recognition.onresult = (event) => {
const transcript = event.results[0][0].transcript;
questionInput.value = transcript;
status.innerText = "Trascrizione: " + transcript;
};
recognition.onerror = (event) => {
status.innerText = 'Errore nel riconoscimento vocale: ' + event.error;
isRecording = false;
recordBtn.innerText = "Recording question";
};
recordBtn.onclick = () => {
if (isRecording) {
recognition.stop();
} else {
recognition.start();
}
};
}
async function sendQuestion() {
const question = questionInput.value;
const context = document.getElementById("context").value;
const long_answer = document.getElementById("long_answer").value;
status.innerText = "Processing...";
answerElem.innerText = "";
readBtn.style.display = "none";
try {
const response = await fetch("https://frammartina-pubmedqa-chatbot.hf.space/chat", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
question: question,
context: context,
long_answer: long_answer
})
});
if (!response.ok) throw new Error("Errore nella risposta dal server");
const data = await response.json();
answerElem.innerText = "Your answer: " + data.answer;
status.innerText = "Question answered successfully!";
readBtn.style.display = "inline"; // Show the read button
// Uncomment the next line if you want to read the answer automatically
// readAnswer();
} catch (error) {
status.innerText = "Errore: " + error.message;
}
}
function readAnswer() {
const text = answerElem.innerText;
if ('speechSynthesis' in window) {
window.speechSynthesis.cancel(); // Stop previous speeches
const utterance = new SpeechSynthesisUtterance(text);
utterance.lang = "en-US"; // Change this if you want a different language
window.speechSynthesis.speak(utterance);
} else {
alert("Sorry, your browser does not support speech synthesis.");
}
}
</script>
</body>
</html>