From 2bc60effc81d941b1143e1ee0f9c589d85da2060 Mon Sep 17 00:00:00 2001 From: leo <260626284+cameledev@users.noreply.github.com> Date: Thu, 28 May 2026 18:33:58 +0200 Subject: [PATCH] wip: realtime updates --- src/agents/voxtral_vllm_stt.py | 12 ++++++++++- .../features/subtitle/component/Subtitles.tsx | 20 ++++++++++--------- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/agents/voxtral_vllm_stt.py b/src/agents/voxtral_vllm_stt.py index 2219c826..c3ba65e1 100644 --- a/src/agents/voxtral_vllm_stt.py +++ b/src/agents/voxtral_vllm_stt.py @@ -409,7 +409,17 @@ class SpeechStream(stt.RecognizeStream): event_type = data.get("type") if event_type == "transcription.delta": - current_text += data.get("delta", "") + delta = data.get("delta", "") + if not delta: + continue + current_text += delta + self._event_ch.send_nowait( + stt.SpeechEvent( + type=stt.SpeechEventType.INTERIM_TRANSCRIPT, + request_id=request_id, + alternatives=[stt.SpeechData(text=current_text, language="")], + ) + ) elif event_type == "transcription.done": final_text = data.get("text") or current_text self._event_ch.send_nowait( diff --git a/src/frontend/src/features/subtitle/component/Subtitles.tsx b/src/frontend/src/features/subtitle/component/Subtitles.tsx index f434d98d..9df26d0f 100644 --- a/src/frontend/src/features/subtitle/component/Subtitles.tsx +++ b/src/frontend/src/features/subtitle/component/Subtitles.tsx @@ -65,6 +65,8 @@ const useTranscriptionState = () => { ) => { console.log(participant, segments) + + if (!participant || segments.length === 0) return if (segments.length > 1) { @@ -75,15 +77,15 @@ const useTranscriptionState = () => { const segment = segments[0] setTranscriptionSegments((prevSegments) => { - const existingSegmentIds = new Set(prevSegments.map((s) => s.id)) - if (existingSegmentIds.has(segment.id)) return prevSegments - return [ - ...prevSegments, - { - participant: participant, - ...segment, - }, - ] + const existingIndex = prevSegments.findIndex( + (s: TranscriptionSegmentWithParticipant) => s.id === segment.id + ) + if (existingIndex === -1) { + return [...prevSegments, { participant, ...segment }] + } + const next = prevSegments.slice() + next[existingIndex] = { ...next[existingIndex], ...segment } + return next }) }