2023-06-03 21:09:00 +03:00
|
|
|
import { useEffect, useState } from "react";
|
|
|
|
import { isSpeechRecognitionSupported } from "../helpers/isSpeechRecognitionSupported";
|
2023-06-11 00:59:16 +03:00
|
|
|
import useChats from "./useChats";
|
2023-06-03 21:09:00 +03:00
|
|
|
|
|
|
|
export const useSpeech = () => {
|
|
|
|
const [isListening, setIsListening] = useState(false);
|
|
|
|
const [speechSupported, setSpeechSupported] = useState(false);
|
2023-06-11 00:59:16 +03:00
|
|
|
|
|
|
|
const { setMessage } = useChats();
|
2023-06-03 21:09:00 +03:00
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
if (isSpeechRecognitionSupported()) {
|
|
|
|
setSpeechSupported(true);
|
|
|
|
const SpeechRecognition =
|
|
|
|
window.SpeechRecognition || window.webkitSpeechRecognition;
|
|
|
|
|
|
|
|
const mic = new SpeechRecognition();
|
|
|
|
|
|
|
|
mic.continuous = true;
|
|
|
|
mic.interimResults = false;
|
|
|
|
mic.lang = "en-US";
|
|
|
|
|
|
|
|
mic.onstart = () => {
|
|
|
|
console.log("Mics on");
|
|
|
|
};
|
|
|
|
|
|
|
|
mic.onend = () => {
|
|
|
|
console.log("Mics off");
|
|
|
|
};
|
|
|
|
|
|
|
|
mic.onerror = (event: SpeechRecognitionErrorEvent) => {
|
|
|
|
console.log(event.error);
|
|
|
|
setIsListening(false);
|
|
|
|
};
|
|
|
|
|
|
|
|
mic.onresult = (event: SpeechRecognitionEvent) => {
|
|
|
|
const interimTranscript =
|
|
|
|
event.results[event.results.length - 1][0].transcript;
|
2023-06-11 00:59:16 +03:00
|
|
|
setMessage((prevMessage) => ["user", prevMessage + interimTranscript]);
|
2023-06-03 21:09:00 +03:00
|
|
|
};
|
|
|
|
|
|
|
|
if (isListening) {
|
|
|
|
mic.start();
|
|
|
|
}
|
|
|
|
|
|
|
|
return () => {
|
|
|
|
if (mic) {
|
|
|
|
mic.stop();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
2023-06-11 00:59:16 +03:00
|
|
|
}, [isListening, setMessage]);
|
2023-06-03 21:09:00 +03:00
|
|
|
|
|
|
|
const startListening = () => {
|
|
|
|
setIsListening((prevIsListening) => !prevIsListening);
|
|
|
|
};
|
|
|
|
|
|
|
|
return { startListening, speechSupported, isListening };
|
|
|
|
};
|