/
Max_Cherep
/
super-transcription
Обзор
Документация
Войти
/
Max_Cherep
/
super-transcription
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
scripts/export_transcript.py
116 строк
3 KB
maxim.cherepanov
Add VL-first hybrid screenshots, EN markers, and lightbox.
31 июл 2026, 19:22
31 июл 2026, 19:22
9df8b25
Код
Авторство
О чём код?
"""Экспорт сегментов транскрипта в timed TXT / SRT.""" from __future__ import annotations from dataclasses import dataclass from pathlib import Path @dataclass(frozen=True) class Segment: start: float end: float text: str speaker: int | None = None def speaker_prefix(speaker: int | None) -> str: """Префикс `[Speaker N]` или пустая строка.""" if speaker is None: return "" return f"[Speaker {int(speaker)}]" def format_segment_text(seg: Segment) -> str: """Текст сегмента с опциональным префиксом спикера.""" text = (seg.text or "").strip() if not text: return "" prefix = speaker_prefix(seg.speaker) if not prefix: return text return f"{prefix} {text}" def _clamp_sec(sec: float) -> float: return 0.0 if sec < 0 else sec def _fmt_ts_txt(sec: float) -> str: sec = _clamp_sec(sec) h = int(sec // 3600) m = int((sec % 3600) // 60) s = sec % 60 return f"{h:02d}:{m:02d}:{s:06.3f}" def _fmt_ts_srt(sec: float) -> str: """SRT: HH:MM:SS,mmm (запятая).""" sec = _clamp_sec(sec) total_ms = int(round(sec * 1000.0)) h, rem = divmod(total_ms, 3_600_000) m, rem = divmod(rem, 60_000) s, ms = divmod(rem, 1000) return f"{h:02d}:{m:02d}:{s:02d},{ms:03d}" def format_timed_txt(segments: list[Segment], *, with_timestamps: bool = True) -> str: lines: list[str] = [] for seg in segments: text = format_segment_text(seg) if not text: continue if with_timestamps: lines.append(f"[{_fmt_ts_txt(seg.start)} → {_fmt_ts_txt(seg.end)}] {text}") else: lines.append(text) return "\n".join(lines) + ("\n" if lines else "") def format_srt(segments: list[Segment]) -> str: blocks: list[str] = [] idx = 0 for seg in segments: text = format_segment_text(seg) if not text: continue idx += 1 start = _fmt_ts_srt(seg.start) end = _fmt_ts_srt(max(seg.end, seg.start)) blocks.append(f"{idx}\n{start} --> {end}\n{text}\n") return "\n".join(blocks) def write_timed_txt( path: Path, segments: list[Segment], *, with_timestamps: bool = True, ) -> None: path.parent.mkdir(parents=True, exist_ok=True) path.write_text( format_timed_txt(segments, with_timestamps=with_timestamps), encoding="utf-8", ) def write_srt(path: Path, segments: list[Segment]) -> None: path.parent.mkdir(parents=True, exist_ok=True) path.write_text(format_srt(segments), encoding="utf-8") def write_transcript( path: Path, segments: list[Segment], *, output_format: str = "txt", with_timestamps: bool = True, ) -> None: fmt = (output_format or "txt").lower().lstrip(".") if fmt == "srt": write_srt(path, segments) return if fmt == "txt": write_timed_txt(path, segments, with_timestamps=with_timestamps) return raise ValueError(f"unsupported output_format: {output_format}")