Spaces:
Running
Running
import classNames from "classnames"; | |
import { FaMicrophone } from "react-icons/fa"; | |
import SpeechRecognition, { | |
useSpeechRecognition, | |
} from "react-speech-recognition"; | |
import { useUpdateEffect } from "react-use"; | |
function SpeechPrompt({ | |
setPrompt, | |
}: { | |
setPrompt: React.Dispatch<React.SetStateAction<string>>; | |
}) { | |
const { | |
transcript, | |
listening, | |
browserSupportsSpeechRecognition, | |
resetTranscript, | |
} = useSpeechRecognition(); | |
const startListening = () => | |
SpeechRecognition.startListening({ continuous: true }); | |
useUpdateEffect(() => { | |
if (transcript) setPrompt(transcript); | |
}, [transcript]); | |
useUpdateEffect(() => { | |
if (!listening) resetTranscript(); | |
}, [listening]); | |
if (!browserSupportsSpeechRecognition) { | |
return null; | |
} | |
return ( | |
<button | |
className={classNames( | |
"flex cursor-pointer flex-none items-center justify-center rounded-full text-sm font-semibold size-8 text-center bg-gray-800 hover:bg-gray-700 text-white shadow-sm dark:shadow-highlight/20 disabled:bg-gray-300 disabled:text-gray-500 disabled:cursor-not-allowed disabled:hover:bg-gray-300", | |
{ | |
"animate-pulse !bg-orange-500": listening, | |
} | |
)} | |
onTouchStart={startListening} | |
onMouseDown={startListening} | |
onTouchEnd={SpeechRecognition.stopListening} | |
onMouseUp={SpeechRecognition.stopListening} | |
> | |
<FaMicrophone className="text-base" /> | |
</button> | |
); | |
} | |
export default SpeechPrompt; | |