From b2c2534388ca86904b060543c7dcbf3b934717b6 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 18 Jan 2026 15:09:58 +0000 Subject: [PATCH 1/2] Fix web app speaker diarization and language handling Issues: 1. Speaker diarization: Web app checked for 'speakerId' (camelCase) but backend sends 'speaker_id' (snake_case). This caused all speakers to be identified as speaker 0 because the fallback string parsing incorrectly assumed 1-indexed speakers when Deepgram uses 0-indexed. 2. Language support: Web app always used 'multi' regardless of user's language preference, unlike mobile/desktop which fetch user settings. This caused issues for users with single_language_mode enabled. Fixes: - Add 'speaker_id' (snake_case) to the fallback chain in segment parsing - Fetch user's language preference before creating transcription socket --- web/app/src/hooks/useRecording.ts | 11 ++++++++++- web/app/src/lib/transcriptionSocket.ts | 4 ++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/web/app/src/hooks/useRecording.ts b/web/app/src/hooks/useRecording.ts index 2f8984dc28..222bb8191d 100644 --- a/web/app/src/hooks/useRecording.ts +++ b/web/app/src/hooks/useRecording.ts @@ -7,7 +7,7 @@ import { isAudioCaptureSupported, } from '@/lib/audioCapture'; import { createTranscriptionSocket } from '@/lib/transcriptionSocket'; -import { processInProgressConversation } from '@/lib/api'; +import { processInProgressConversation, getUserLanguage } from '@/lib/api'; /** * Hook to manage recording lifecycle. @@ -66,8 +66,17 @@ export function useRecording() { pausedDurationRef.current = 0; try { + // Fetch user's language preference (fallback to 'multi' if not available) + let language = 'multi'; + try { + language = await getUserLanguage(); + } catch (langErr) { + console.warn('Failed to fetch user language, using multi:', langErr); + } + // Create transcription socket const socket = createTranscriptionSocket({ + language, onSegment: (segment: TranscriptSegment) => { if (!isMountedRef.current) return; setSegments((prev) => { diff --git a/web/app/src/lib/transcriptionSocket.ts b/web/app/src/lib/transcriptionSocket.ts index 41d5154904..2b69ea3ec7 100644 --- a/web/app/src/lib/transcriptionSocket.ts +++ b/web/app/src/lib/transcriptionSocket.ts @@ -241,7 +241,7 @@ export class TranscriptionSocket { const segment: TranscriptSegment = { id: segmentData.id || `seg-${Date.now()}-${Math.random()}`, text: segmentData.text || '', - speaker: parseSpeakerId(segmentData.speakerId ?? segmentData.speaker), + speaker: parseSpeakerId(segmentData.speakerId ?? segmentData.speaker_id ?? segmentData.speaker), isUser: segmentData.isUser ?? segmentData.is_user ?? false, timestamp: Date.now(), }; @@ -256,7 +256,7 @@ export class TranscriptionSocket { const segment: TranscriptSegment = { id: data.id || `seg-${Date.now()}-${Math.random()}`, text: data.text, - speaker: parseSpeakerId(data.speakerId ?? data.speaker), + speaker: parseSpeakerId(data.speakerId ?? data.speaker_id ?? data.speaker), isUser: data.isUser ?? data.is_user ?? false, timestamp: Date.now(), }; From fd079d23e6b08e8ee1989b28d3356e00759e1ace Mon Sep 17 00:00:00 2001 From: Salman Date: Sun, 18 Jan 2026 08:51:26 -0800 Subject: [PATCH 2/2] Update web/app/src/hooks/useRecording.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- web/app/src/hooks/useRecording.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/app/src/hooks/useRecording.ts b/web/app/src/hooks/useRecording.ts index 222bb8191d..bca9c4384e 100644 --- a/web/app/src/hooks/useRecording.ts +++ b/web/app/src/hooks/useRecording.ts @@ -7,7 +7,7 @@ import { isAudioCaptureSupported, } from '@/lib/audioCapture'; import { createTranscriptionSocket } from '@/lib/transcriptionSocket'; -import { processInProgressConversation, getUserLanguage } from '@/lib/api'; +import { processInProgressConversation, getTranscriptionPreferences } from '@/lib/api'; /** * Hook to manage recording lifecycle.