pocket / lib /transcript.ts
aaryangupta22's picture
Upload 27 files
395b1d0 verified
Raw
History Blame Contribute Delete
1.6 kB
import type { SpeakerTurn } from "./types";
const SPEAKER_LINE = /^((?:Speaker\s+\d+)(?:\s*\([^)]+\))?|[A-Za-z][^:]{0,40}):\s*(.+)$/;
export function parseSpeakerTurns(transcript: string): SpeakerTurn[] {
const turns: SpeakerTurn[] = [];
for (const line of transcript.split("\n")) {
const trimmed = line.trim();
if (!trimmed) continue;
const match = trimmed.match(SPEAKER_LINE);
if (match) {
turns.push({ speaker: match[1].trim(), text: match[2].trim() });
} else if (turns.length > 0) {
turns[turns.length - 1].text += ` ${trimmed}`;
} else {
turns.push({ speaker: "Speaker 1", text: trimmed });
}
}
return turns;
}
export function getUniqueSpeakers(turns: SpeakerTurn[]): string[] {
const seen = new Set<string>();
const speakers: string[] = [];
for (const turn of turns) {
if (!seen.has(turn.speaker)) {
seen.add(turn.speaker);
speakers.push(turn.speaker);
}
}
return speakers;
}
export const SPEAKER_COLORS = [
"text-indigo-400",
"text-emerald-400",
"text-amber-400",
"text-pink-400",
"text-cyan-400",
"text-violet-400",
];
export const SPEAKER_BG_COLORS = [
"bg-indigo-500/10 border-indigo-500/20",
"bg-emerald-500/10 border-emerald-500/20",
"bg-amber-500/10 border-amber-500/20",
"bg-pink-500/10 border-pink-500/20",
"bg-cyan-500/10 border-cyan-500/20",
"bg-violet-500/10 border-violet-500/20",
];
export function speakerColorIndex(speaker: string, speakers: string[]): number {
const idx = speakers.indexOf(speaker);
return idx >= 0 ? idx % SPEAKER_COLORS.length : 0;
}