diff --git a/src/lib/components/TranscriptEditor.svelte b/src/lib/components/TranscriptEditor.svelte index e2e3bf4..7a7517d 100644 --- a/src/lib/components/TranscriptEditor.svelte +++ b/src/lib/components/TranscriptEditor.svelte @@ -60,21 +60,28 @@ function finishEditing(segmentId: string) { const trimmed = editText.trim(); if (trimmed) { - // Update the segment text and rebuild words from the edited text. - // The display renders segment.words, so we must update them too. segments.update(segs => segs.map(s => { if (s.id !== segmentId) return s; - // Rebuild words from the edited text, preserving timing from the - // original segment boundaries (individual word timing is lost on edit) - const newWords = trimmed.split(/\s+/).map((word, widx) => ({ - id: `${s.id}-word-${widx}`, - segment_id: s.id, - word, - start_ms: s.start_ms, - end_ms: s.end_ms, - confidence: 1.0, - word_index: widx, - })); + const newWordTexts = trimmed.split(/\s+/); + let newWords; + if (newWordTexts.length === s.words.length) { + // Same word count (e.g. spelling fix) — preserve each word's timing + newWords = s.words.map((w, widx) => ({ + ...w, + word: newWordTexts[widx], + })); + } else { + // Word count changed — fall back to segment-level timing + newWords = newWordTexts.map((word, widx) => ({ + id: `${s.id}-word-${widx}`, + segment_id: s.id, + word, + start_ms: s.start_ms, + end_ms: s.end_ms, + confidence: 1.0, + word_index: widx, + })); + } return { ...s, text: trimmed,