added speech functions
This commit is contained in:
@@ -20,6 +20,115 @@ $(document).ready(function () {
|
||||
// selection
|
||||
let selectedPartNumber = null;
|
||||
|
||||
// ===================
|
||||
// VOICE RECOGNITION SETUP
|
||||
// ===================
|
||||
const SpeechRecognition =
|
||||
window.SpeechRecognition || window.webkitSpeechRecognition;
|
||||
let recognition = null;
|
||||
let isVoiceActive = false;
|
||||
const magicWord = "salva"; // Parola magica scelta: "prossima" (fa andare alla riga successiva)
|
||||
|
||||
if (SpeechRecognition) {
|
||||
recognition = new SpeechRecognition();
|
||||
recognition.lang = "it-IT"; // Lingua italiana
|
||||
recognition.continuous = true; // Ascolto continuo
|
||||
recognition.interimResults = false; // Solo risultati finali per semplicità
|
||||
|
||||
recognition.onresult = function (event) {
|
||||
const transcript = event.results[
|
||||
event.results.length - 1
|
||||
][0].transcript
|
||||
.trim()
|
||||
.toLowerCase();
|
||||
console.log("Transcript vocale:", transcript);
|
||||
|
||||
const $currentRow = $("#partsTableBody tr:last"); // Ultima riga corrente
|
||||
const $descriptionInput = $currentRow.find(".part-description");
|
||||
|
||||
if (transcript.includes(magicWord)) {
|
||||
// Rimuovi la parola magica e aggiungi il resto alla descrizione corrente
|
||||
const cleanedTranscript = transcript
|
||||
.replace(magicWord, "")
|
||||
.trim();
|
||||
if (cleanedTranscript) {
|
||||
$descriptionInput.val(
|
||||
(
|
||||
$descriptionInput.val() +
|
||||
" " +
|
||||
cleanedTranscript
|
||||
).trim(),
|
||||
);
|
||||
$descriptionInput.trigger("blur"); // Salva se necessario
|
||||
}
|
||||
// Aggiungi nuova riga (simile a click su +)
|
||||
const maxPartNumber = Math.max(
|
||||
...$("#partsTableBody tr")
|
||||
.map(function () {
|
||||
return (
|
||||
parseInt($(this).find(".part-number").val()) ||
|
||||
0
|
||||
);
|
||||
})
|
||||
.get(),
|
||||
);
|
||||
addNewRow(maxPartNumber + 1);
|
||||
// Focus sulla nuova descrizione
|
||||
const $newRow = $("#partsTableBody tr:last");
|
||||
$newRow.find(".part-description").focus();
|
||||
} else {
|
||||
// Aggiungi il transcript alla descrizione corrente
|
||||
$descriptionInput.val(
|
||||
($descriptionInput.val() + " " + transcript).trim(),
|
||||
);
|
||||
$descriptionInput.trigger("blur"); // Salva se necessario
|
||||
}
|
||||
};
|
||||
|
||||
recognition.onerror = function (event) {
|
||||
console.error("Errore riconoscimento vocale:", event.error);
|
||||
if (event.error === "no-speech" || event.error === "aborted") {
|
||||
// Riavvia se necessario
|
||||
if (isVoiceActive) recognition.start();
|
||||
} else {
|
||||
alert("Errore nel riconoscimento vocale: " + event.error);
|
||||
toggleVoiceRecognition();
|
||||
}
|
||||
};
|
||||
|
||||
recognition.onend = function () {
|
||||
if (isVoiceActive) {
|
||||
recognition.start(); // Riavvia per ascolto continuo
|
||||
}
|
||||
};
|
||||
} else {
|
||||
console.warn("Riconoscimento vocale non supportato dal browser.");
|
||||
$("#toggleVoiceBtn").hide(); // Nascondi pulsante se non supportato
|
||||
}
|
||||
|
||||
function toggleVoiceRecognition() {
|
||||
if (!recognition) return;
|
||||
|
||||
isVoiceActive = !isVoiceActive;
|
||||
const $btn = $("#toggleVoiceBtn");
|
||||
if (isVoiceActive) {
|
||||
$btn.addClass("btn-danger").html(
|
||||
'<i class="fas fa-microphone-slash"></i> Stop Voce',
|
||||
);
|
||||
recognition.start();
|
||||
// Focus iniziale sull'ultima descrizione
|
||||
const $currentRow = $("#partsTableBody tr:last");
|
||||
$currentRow.find(".part-description").focus();
|
||||
} else {
|
||||
$btn.removeClass("btn-danger")
|
||||
.addClass("btn-secondary")
|
||||
.html('<i class="fas fa-microphone"></i> Voce');
|
||||
recognition.stop();
|
||||
}
|
||||
}
|
||||
|
||||
$("#toggleVoiceBtn").on("click", toggleVoiceRecognition);
|
||||
|
||||
// ===================
|
||||
// POPUP HANDLING
|
||||
// ===================
|
||||
|
||||
Reference in New Issue
Block a user