import React, { useState, useEffect, useRef } from 'react'; interface VoiceInputProps { onTranscript: (text: string) => void; isProcessing: boolean; isFullWidth?: boolean; } const VoiceInput: React.FC = ({ onTranscript, isProcessing, isFullWidth = false }) => { const [isListening, setIsListening] = useState(false); const recognitionRef = useRef(null); const timerRef = useRef(null); useEffect(() => { if ('SpeechRecognition' in window || 'webkitSpeechRecognition' in window) { const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition; recognitionRef.current = new SpeechRecognition(); recognitionRef.current.continuous = false; recognitionRef.current.lang = 'zh-CN'; recognitionRef.current.interimResults = false; recognitionRef.current.onresult = (event: any) => { const transcript = event.results[0][0].transcript; if (transcript) onTranscript(transcript); setIsListening(false); }; recognitionRef.current.onerror = (event: any) => { console.error('Speech recognition error', event.error); setIsListening(false); }; recognitionRef.current.onend = () => { setIsListening(false); }; } }, [onTranscript]); const startListening = (e: React.MouseEvent | React.TouchEvent) => { e.preventDefault(); if (isProcessing || isListening) return; if (recognitionRef.current) { try { recognitionRef.current.start(); setIsListening(true); } catch (e) { console.error("Failed to start recognition", e); } } else { alert("您的浏览器不支持语音识别,请使用 Chrome 或 Edge。"); } }; const stopListening = () => { if (isListening) { recognitionRef.current?.stop(); setIsListening(false); } }; return (
{isListening && isFullWidth && (
正在录音...
)}
); }; export default VoiceInput;