Merge perf/stream-segments: streaming partial transcript segments and speaker updates
This commit is contained in:
@@ -87,7 +87,11 @@
|
||||
audioUrl = convertFileSrc(filePath);
|
||||
waveformPlayer?.loadAudio(audioUrl);
|
||||
|
||||
// Start pipeline — show overlay immediately before heavy processing
|
||||
// Clear previous results
|
||||
segments.set([]);
|
||||
speakers.set([]);
|
||||
|
||||
// Start pipeline (transcription + diarization)
|
||||
isTranscribing = true;
|
||||
transcriptionProgress = 0;
|
||||
transcriptionStage = 'Starting...';
|
||||
@@ -109,6 +113,68 @@
|
||||
if (typeof message === 'string') transcriptionMessage = message;
|
||||
});
|
||||
|
||||
const unlistenSegment = await listen<{
|
||||
index: number;
|
||||
text: string;
|
||||
start_ms: number;
|
||||
end_ms: number;
|
||||
words: Array<{ word: string; start_ms: number; end_ms: number; confidence: number }>;
|
||||
}>('pipeline-segment', (event) => {
|
||||
const seg = event.payload;
|
||||
const newSeg: Segment = {
|
||||
id: `seg-${seg.index}`,
|
||||
project_id: '',
|
||||
media_file_id: '',
|
||||
speaker_id: null,
|
||||
start_ms: seg.start_ms,
|
||||
end_ms: seg.end_ms,
|
||||
text: seg.text,
|
||||
original_text: null,
|
||||
confidence: null,
|
||||
is_edited: false,
|
||||
edited_at: null,
|
||||
segment_index: seg.index,
|
||||
words: seg.words.map((w, widx) => ({
|
||||
id: `word-${seg.index}-${widx}`,
|
||||
segment_id: `seg-${seg.index}`,
|
||||
word: w.word,
|
||||
start_ms: w.start_ms,
|
||||
end_ms: w.end_ms,
|
||||
confidence: w.confidence,
|
||||
word_index: widx,
|
||||
})),
|
||||
};
|
||||
segments.update(segs => [...segs, newSeg]);
|
||||
});
|
||||
|
||||
const unlistenSpeaker = await listen<{
|
||||
updates: Array<{ index: number; speaker: string }>;
|
||||
}>('pipeline-speaker-update', (event) => {
|
||||
const { updates } = event.payload;
|
||||
// Build speakers from unique labels
|
||||
const uniqueLabels = [...new Set(updates.map(u => u.speaker))].sort();
|
||||
const newSpeakers: Speaker[] = uniqueLabels.map((label, idx) => ({
|
||||
id: `speaker-${idx}`,
|
||||
project_id: '',
|
||||
label,
|
||||
display_name: null,
|
||||
color: speakerColors[idx % speakerColors.length],
|
||||
}));
|
||||
speakers.set(newSpeakers);
|
||||
|
||||
// Update existing segments with speaker assignments
|
||||
const speakerLookup = new Map(newSpeakers.map(s => [s.label, s.id]));
|
||||
segments.update(segs =>
|
||||
segs.map((seg, i) => {
|
||||
const update = updates.find(u => u.index === i);
|
||||
if (update) {
|
||||
return { ...seg, speaker_id: speakerLookup.get(update.speaker) ?? null };
|
||||
}
|
||||
return seg;
|
||||
})
|
||||
);
|
||||
});
|
||||
|
||||
try {
|
||||
const result = await invoke<{
|
||||
segments: Array<{
|
||||
@@ -180,6 +246,8 @@
|
||||
alert(`Pipeline failed: ${err}`);
|
||||
} finally {
|
||||
unlisten();
|
||||
unlistenSegment();
|
||||
unlistenSpeaker();
|
||||
isTranscribing = false;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user