Spaces:
Sleeping
Sleeping
import React, { useEffect } from 'react' | |
import { useSetAtom } from 'jotai' | |
import { useBing } from '@/lib/hooks/use-bing' | |
import Image from 'next/image' | |
import VoiceIcon from '@/assets/images/voice.svg' | |
import VoiceButton from './ui/voice' | |
import { SR } from '@/lib/bots/bing/sr' | |
import { voiceListenAtom } from '@/state' | |
const sr = new SR(['发送', '清空', '退出']) | |
const Voice = ({ setInput, input, sendMessage, isSpeaking }: Pick<ReturnType<typeof useBing>, 'setInput' | 'sendMessage' | 'input' | 'isSpeaking'>) => { | |
const setListen = useSetAtom(voiceListenAtom) | |
useEffect(() => { | |
if (sr.listening) return | |
sr.transcript = !isSpeaking | |
}, [isSpeaking]) | |
useEffect(() => { | |
sr.onchange = (msg: string, command?: string) => { | |
switch (command) { | |
case '退出': | |
sr.stop() | |
break; | |
case '发送': | |
sendMessage(input) | |
case '清空': | |
setInput('') | |
break; | |
default: | |
setInput(input + msg) | |
} | |
} | |
}, [input, setInput, sendMessage]) | |
const switchSR = (enable: boolean = false) => { | |
setListen(enable) | |
if (enable) { | |
sr.start() | |
} else { | |
sr.stop() | |
} | |
} | |
return sr.listening ? ( | |
<VoiceButton onClick={() => switchSR(false)} /> | |
) : ( | |
<Image alt="start voice" src={VoiceIcon} width={24} className="-mt-0.5" onClick={() => switchSR(true)} /> | |
) | |
}; | |
export default Voice; | |