|
""" |
|
Formatting utilities for timestamps and speaker segments. |
|
""" |
|
|
|
class TimeFormatter: |
|
@staticmethod |
|
def format_timestamp(seconds: float) -> str: |
|
"""Format seconds into MM:SS.ss format. |
|
|
|
Args: |
|
seconds (float): Time in seconds |
|
|
|
Returns: |
|
str: Formatted time string |
|
""" |
|
minutes = int(seconds // 60) |
|
seconds = seconds % 60 |
|
return f"{minutes:02d}:{seconds:05.2f}" |
|
|
|
@staticmethod |
|
def format_speaker_segments(diarization_result, transcription): |
|
"""Format speaker segments with transcribed text. |
|
|
|
Args: |
|
diarization_result: Diarization model output |
|
transcription: Whisper transcription output |
|
|
|
Returns: |
|
list: Formatted speaker segments |
|
""" |
|
if diarization_result is None: |
|
return [] |
|
|
|
formatted_segments = [] |
|
whisper_segments = transcription.get('segments', []) |
|
|
|
try: |
|
for turn, _, speaker in diarization_result.itertracks(yield_label=True): |
|
current_text = "" |
|
for w_segment in whisper_segments: |
|
w_start = float(w_segment['start']) |
|
w_end = float(w_segment['end']) |
|
|
|
if (w_start >= turn.start and w_start < turn.end) or \ |
|
(w_end > turn.start and w_end <= turn.end): |
|
current_text += w_segment['text'].strip() + " " |
|
|
|
formatted_segments.append({ |
|
'speaker': str(speaker), |
|
'start': float(turn.start), |
|
'end': float(turn.end), |
|
'text': current_text.strip() |
|
}) |
|
|
|
except Exception as e: |
|
print(f"Error formatting segments: {str(e)}") |
|
return [] |
|
|
|
return formatted_segments |