Stabilize interim speech capture

This commit is contained in:
dsyoon
2026-01-28 22:18:05 +09:00
parent 63f759e5e9
commit c05da7dc9e

View File

@@ -37,6 +37,7 @@ function App() {
const isRecordingRef = useRef(false) const isRecordingRef = useRef(false)
const lastResultAtRef = useRef<number>(Date.now()) const lastResultAtRef = useRef<number>(Date.now())
const restartLockRef = useRef(false) const restartLockRef = useRef(false)
const finalizeTimerRef = useRef<number | null>(null)
const hasSpeechRecognition = useMemo(() => { const hasSpeechRecognition = useMemo(() => {
return 'SpeechRecognition' in window || 'webkitSpeechRecognition' in window return 'SpeechRecognition' in window || 'webkitSpeechRecognition' in window
@@ -117,6 +118,7 @@ function App() {
recognition.lang = 'ko-KR' recognition.lang = 'ko-KR'
recognition.interimResults = true recognition.interimResults = true
recognition.continuous = true recognition.continuous = true
recognition.maxAlternatives = 3
recognition.onresult = (event) => { recognition.onresult = (event) => {
lastResultAtRef.current = Date.now() 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 = () => { recognition.onend = () => {
if (finalizeTimerRef.current) {
window.clearTimeout(finalizeTimerRef.current)
finalizeTimerRef.current = null
}
void commitLiveIfAny() void commitLiveIfAny()
liveTextRef.current = '' liveTextRef.current = ''
if (isRecordingRef.current) { if (isRecordingRef.current) {
@@ -175,6 +188,10 @@ function App() {
if (!meetingIdRef.current) return if (!meetingIdRef.current) return
const trimmed = text.trim() const trimmed = text.trim()
if (!trimmed) return if (!trimmed) return
if (finalizeTimerRef.current) {
window.clearTimeout(finalizeTimerRef.current)
finalizeTimerRef.current = null
}
lastResultAtRef.current = Date.now() lastResultAtRef.current = Date.now()
const ts = new Date().toISOString() const ts = new Date().toISOString()
liveTextRef.current = '' liveTextRef.current = ''