LibreChat/client/src/components/Input/SpeechRecognition.tsx

88 lines
2 KiB
TypeScript
Raw Normal View History

2023-08-05 09:18:31 -05:00
import { useState, useEffect } from 'react';
const useSpeechRecognition = (ask) => {
const [isSpeechSupported, setIsSpeechSupported] = useState(false);
const [isListening, setIsListening] = useState(false);
const [text, setText] = useState('');
useEffect(() => {
if ('SpeechRecognition' in window || 'webkitSpeechRecognition' in window) {
setIsSpeechSupported(true);
} else {
console.log("Browser does not support SpeechRecognition");
setIsSpeechSupported(false);
return;
}
const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
const recognition = new SpeechRecognition();
recognition.onstart = () => {
console.log("Speech recognition started");
};
recognition.interimResults = true;
recognition.onresult = (event) => {
let transcript = '';
for (let i = 0; i < event.results.length; i++) {
const result = event.results[i];
transcript += result[0].transcript;
if (result.isFinal) {
setText(transcript);
ask({ text: transcript });
}
}
// Set the text with both interim and final results
setText(transcript);
};
recognition.onend = () => {
setIsListening(false);
setText('');
};
if (isListening) {
recognition.start();
} else {
recognition.stop();
}
return () => {
recognition.stop();
};
2023-08-05 19:29:27 -05:00
}, [isListening]);
2023-08-05 09:18:31 -05:00
2023-08-05 09:50:50 -05:00
const toggleListening = (event) => {
if (event) {
event.preventDefault();
}
2023-08-09 14:48:31 -05:00
if (isSpeechSupported) {
setIsListening((prevState) => !prevState);
}
2023-08-05 09:18:31 -05:00
};
2023-08-09 15:21:24 -05:00
const handleKeyDown = (e) => {
2023-08-09 15:15:58 -05:00
if (e.shiftKey && e.altKey && e.key === 'L') {
if (isSpeechSupported) {
toggleListening();
}
}
};
useEffect(() => {
window.addEventListener('keydown', handleKeyDown);
return () => {
window.removeEventListener('keydown', handleKeyDown);
};
2023-08-09 15:36:55 -05:00
});
2023-08-09 15:15:58 -05:00
2023-08-05 09:18:31 -05:00
return { isSpeechSupported, isListening, text, toggleListening };
};
export default useSpeechRecognition;