mirror of
https://github.com/christianvidalwolf-prog/Craze-Data-check.git
synced 2026-08-03 14:35:23 +02:00
74 lines
2.0 KiB
TypeScript
74 lines
2.0 KiB
TypeScript
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<any>(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 };
|
||
|
|
}
|