formats.py 1.2 KB

123456789101112131415161718192021222324252627282930313233343536
  1. def _srt_time(seconds: float) -> str:
  2. total = int(seconds)
  3. ms = int((seconds - total) * 1000)
  4. h, m, s = total // 3600, (total % 3600) // 60, total % 60
  5. return f"{h:02}:{m:02}:{s:02},{ms:03d}"
  6. def _segment_fields(segment) -> tuple:
  7. if isinstance(segment, dict):
  8. return segment["start"], segment["end"], segment["text"], segment.get("speaker")
  9. return segment.start, segment.end, segment.text, None
  10. def to_srt(segments: list, with_speaker: bool = True) -> str:
  11. lines = []
  12. for i, seg in enumerate(segments, start=1):
  13. start, end, text, speaker = _segment_fields(seg)
  14. lines.append(str(i))
  15. lines.append(f"{_srt_time(start)} --> {_srt_time(end)}")
  16. if with_speaker and speaker:
  17. lines.append(f"({speaker}): {text.strip()}")
  18. else:
  19. lines.append(text.strip())
  20. lines.append("")
  21. return "\n".join(lines)
  22. def to_txt(segments: list, with_speaker: bool = True) -> str:
  23. lines = []
  24. for seg in segments:
  25. _, _, text, speaker = _segment_fields(seg)
  26. if with_speaker and speaker:
  27. lines.append(f"({speaker}): {text.strip()}")
  28. else:
  29. lines.append(text.strip())
  30. return "\n".join(lines)