import { useState, useCallback, useRef, useEffect } from 'react'; interface UseSpeechRecognitionOptions { onResult: (transcript: string) => void; lang?: string; } interface UseSpeechRecognitionReturn { isListening: boolean; start: () => void; stop: () => void; isSupported: boolean; } export function useSpeechRecognition({ onResult, lang = 'en-US' }: UseSpeechRecognitionOptions): UseSpeechRecognitionReturn { const [isListening, setIsListening] = useState(false); const recognitionRef = useRef(null); const isSupported = typeof window !== 'undefined' && ('SpeechRecognition' in window || 'webkitSpeechRecognition' in window); useEffect(() => { if (!isSupported) return; const SpeechRecognition = (window as any).SpeechRecognition || (window as any).webkitSpeechRecognition; const recognition = new SpeechRecognition(); recognition.continuous = true; recognition.interimResults = true; recognition.lang = lang; recognition.onresult = (event: any) => { let transcript = ''; for (let i = event.resultIndex; i < event.results.length; i++) { transcript += event.results[i][0].transcript; } if (event.results[event.resultIndex].isFinal) { onResult(transcript); } }; recognition.onerror = () => { setIsListening(false); }; recognition.onend = () => { setIsListening(false); }; recognitionRef.current = recognition; return () => { try { recognition.stop(); } catch (e) {} }; }, [isSupported, lang, onResult]); const start = useCallback(() => { if (!recognitionRef.current || isListening) return; try { recognitionRef.current.start(); setIsListening(true); } catch (e) {} }, [isListening]); const stop = useCallback(() => { if (!recognitionRef.current || !isListening) return; try { recognitionRef.current.stop(); setIsListening(false); } catch (e) {} }, [isListening]); return { isListening, start, stop, isSupported }; }