diff --git a/client/src/App.tsx b/client/src/App.tsx index e6e7726..beaa855 100644 --- a/client/src/App.tsx +++ b/client/src/App.tsx @@ -37,6 +37,7 @@ function App() { const isRecordingRef = useRef(false) const lastResultAtRef = useRef(Date.now()) const restartLockRef = useRef(false) + const finalizeTimerRef = useRef(null) const hasSpeechRecognition = useMemo(() => { return 'SpeechRecognition' in window || 'webkitSpeechRecognition' in window @@ -117,6 +118,7 @@ function App() { recognition.lang = 'ko-KR' recognition.interimResults = true recognition.continuous = true + recognition.maxAlternatives = 3 recognition.onresult = (event) => { lastResultAtRef.current = Date.now() @@ -148,6 +150,13 @@ function App() { }, ] }) + if (finalizeTimerRef.current) { + window.clearTimeout(finalizeTimerRef.current) + } + finalizeTimerRef.current = window.setTimeout(() => { + void commitLiveIfAny() + finalizeTimerRef.current = null + }, 1200) } } @@ -156,6 +165,10 @@ function App() { } recognition.onend = () => { + if (finalizeTimerRef.current) { + window.clearTimeout(finalizeTimerRef.current) + finalizeTimerRef.current = null + } void commitLiveIfAny() liveTextRef.current = '' if (isRecordingRef.current) { @@ -175,6 +188,10 @@ function App() { if (!meetingIdRef.current) return const trimmed = text.trim() if (!trimmed) return + if (finalizeTimerRef.current) { + window.clearTimeout(finalizeTimerRef.current) + finalizeTimerRef.current = null + } lastResultAtRef.current = Date.now() const ts = new Date().toISOString() liveTextRef.current = ''