Update Script_Speech_recognition/speech_recognition.js

This commit is contained in:
Mário Panenko 2024-11-20 22:45:15 +00:00
parent 37b0402741
commit 50cc803e28

View File

@ -1,122 +1,71 @@
document.addEventListener('DOMContentLoaded', function() { document.addEventListener('DOMContentLoaded', function () {
const themeToggleBtn = document.getElementById('themeToggleBtn'); const startBtn = document.getElementById('startBtn'); // Microphone button
const body = document.body; const inputText = document.getElementById('inputText'); // Textarea
const h1 = document.querySelector('h1'); const statusText = document.getElementById('statusText'); // Optional status display
const textareas = document.querySelectorAll('textarea'); const timerDisplay = document.getElementById('timerDisplay'); // Timer display (if used)
const startBtn = document.getElementById('startBtn');
const timerDisplay = document.getElementById('timerDisplay');
const statusText = document.getElementById('statusText');
themeToggleBtn.addEventListener('click', function() {
// Toggle dark mode classes on different elements
body.classList.toggle('dark-mode');
h1.classList.toggle('dark-mode');
textareas.forEach(textarea => textarea.classList.toggle('dark-mode'));
startBtn.classList.toggle('dark-mode');
timerDisplay.classList.toggle('dark-mode');
statusText.classList.toggle('dark-mode');
// Update the icon based on the mode
if (body.classList.contains('dark-mode')) {
themeToggleBtn.textContent = '🌜'; // Moon icon for dark mode
} else {
themeToggleBtn.textContent = '🌞'; // Sun icon for light mode
}
});
// Speech recognition functionality
if ('SpeechRecognition' in window || 'webkitSpeechRecognition' in window) { if ('SpeechRecognition' in window || 'webkitSpeechRecognition' in window) {
const recognition = new (window.SpeechRecognition || window.webkitSpeechRecognition)(); const recognition = new (window.SpeechRecognition || window.webkitSpeechRecognition)();
recognition.lang = 'sk-SK'; // Set language to Slovak recognition.lang = 'sk-SK'; // Set language to Slovak
recognition.interimResults = true; recognition.interimResults = true;
recognition.maxAlternatives = 1;
recognition.continuous = true; recognition.continuous = true;
let recognizing = false; // Recognition state let recognizing = false; // Recognition state
let startTime; // To store start time of recording let timerInterval; // Timer interval
let timerInterval; // For the timer
let transcriptHistory = []; // Store transcripts
// Start/stop speech recognition with button // Start/Stop speech recognition
startBtn.onclick = () => { startBtn.onclick = () => {
if (!recognizing) { if (!recognizing) {
recognition.start(); recognition.start();
recognizing = true; recognizing = true;
console.log('Waiting for microphone permission...'); startBtn.textContent = "🛑"; // Change icon to indicate recording
startBtn.textContent = "🛑 Nahrávanie..."; // Button shows "Recording..." statusText && (statusText.textContent = "Nahrávanie prebieha...");
statusText.textContent = "Nahrávanie prebieha..."; startTimer();
} else { } else {
recognition.stop(); recognition.stop();
recognizing = false; recognizing = false;
console.log('Speech recognition stopped'); startBtn.textContent = "🎤"; // Reset icon
startBtn.textContent = "🎤"; // Button returns to original state statusText && (statusText.textContent = "Nahrávanie ukončené.");
statusText.textContent = "Nahrávanie ukončené."; stopTimer();
stopTimer(); // Stop timer
} }
}; };
// Timer function // Timer functionality
function startTimer() { function startTimer() {
startTime = Date.now(); const startTime = Date.now();
timerInterval = setInterval(() => { timerInterval = setInterval(() => {
const elapsedTime = Math.floor((Date.now() - startTime) / 1000); const elapsed = Math.floor((Date.now() - startTime) / 1000);
timerDisplay.textContent = `${elapsedTime}s`; // Display elapsed time timerDisplay && (timerDisplay.textContent = `${elapsed}s`);
}, 1000); // Update every second }, 1000);
} }
function stopTimer() { function stopTimer() {
clearInterval(timerInterval); clearInterval(timerInterval);
timerDisplay.textContent = ''; // Clear the timer display timerDisplay && (timerDisplay.textContent = "");
} }
// When recognition starts // Speech recognition results
recognition.onstart = function() { recognition.onresult = function (event) {
console.log('Speech recognition started'); let interim = "";
startTimer(); // Start the timer
statusText.textContent = "Nahrávanie prebieha..."; // Recording status
};
// Handling the results of speech recognition
recognition.onresult = function(event) {
let interimTranscript = ''; // To display interim results
for (let i = event.resultIndex; i < event.results.length; i++) { for (let i = event.resultIndex; i < event.results.length; i++) {
const transcript = event.results[i][0].transcript; const transcript = event.results[i][0].transcript;
if (event.results[i].isFinal) { if (event.results[i].isFinal) {
transcriptHistory.push(transcript); inputText.value += transcript + " ";
inputText.value += transcript + ' '; // Append final transcript to text area
} else { } else {
interimTranscript += transcript; // Update interim transcript interim += transcript;
} }
} }
// Show interim results combined with final results
inputText.value = transcriptHistory.join(' ') + ' ' + interimTranscript;
};
// When recognition ends
recognition.onend = function() {
if (!recognizing) {
recognizing = false;
console.log('Speech recognition ended');
stopTimer();
startBtn.textContent = "🎤"; // Restore button to original state
statusText.textContent = "Nahrávanie ukončené."; // Update status text
} else {
recognition.start(); // Auto-restart recognition if not manually stopped
}
}; };
// Handle recognition errors // Handle recognition errors
recognition.onerror = function(event) { recognition.onerror = function (event) {
console.error('Speech recognition error:', event.error); console.error("Speech recognition error:", event.error);
recognizing = false; // Stop recognition on error recognizing = false;
stopTimer(); // Stop timer startBtn.textContent = "🎤"; // Reset icon
startBtn.textContent = "🎤"; // Restore button to original state statusText && (statusText.textContent = "Chyba pri nahrávaní. Skúste znova.");
statusText.textContent = "Chyba pri nahrávaní. Skúste znova."; // Display error status stopTimer();
}; };
} else { } else {
alert('Tento prehliadač nepodporuje rozpoznávanie reči.'); alert("Tento prehliadač nepodporuje rozpoznávanie reči.");
} }
}); });