refactor(whisper_server): 重构代码以模块化转录功能
将转录核心逻辑拆分为独立模块(transcriber.py、model_manager.py、audio_processor.py、formatters.py),提升代码可维护性和复用性。删除main.py文件,优化依赖管理并更新requirements.txt和pyproject.toml。
This commit is contained in:
131
formatters.py
Normal file
131
formatters.py
Normal file
@@ -0,0 +1,131 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
格式化输出模块
|
||||
负责将转录结果格式化为不同的输出格式(VTT、SRT、JSON)
|
||||
"""
|
||||
|
||||
import json
|
||||
from typing import List, Dict, Any
|
||||
|
||||
def format_vtt(segments: List) -> str:
|
||||
"""
|
||||
将转录结果格式化为VTT
|
||||
|
||||
Args:
|
||||
segments: 转录段落列表
|
||||
|
||||
Returns:
|
||||
str: VTT格式的字幕内容
|
||||
"""
|
||||
vtt_content = "WEBVTT\n\n"
|
||||
|
||||
for segment in segments:
|
||||
start = format_timestamp(segment.start)
|
||||
end = format_timestamp(segment.end)
|
||||
text = segment.text.strip()
|
||||
|
||||
if text:
|
||||
vtt_content += f"{start} --> {end}\n{text}\n\n"
|
||||
|
||||
return vtt_content
|
||||
|
||||
def format_srt(segments: List) -> str:
|
||||
"""
|
||||
将转录结果格式化为SRT
|
||||
|
||||
Args:
|
||||
segments: 转录段落列表
|
||||
|
||||
Returns:
|
||||
str: SRT格式的字幕内容
|
||||
"""
|
||||
srt_content = ""
|
||||
index = 1
|
||||
|
||||
for segment in segments:
|
||||
start = format_timestamp_srt(segment.start)
|
||||
end = format_timestamp_srt(segment.end)
|
||||
text = segment.text.strip()
|
||||
|
||||
if text:
|
||||
srt_content += f"{index}\n{start} --> {end}\n{text}\n\n"
|
||||
index += 1
|
||||
|
||||
return srt_content
|
||||
|
||||
def format_json(segments: List, info: Any) -> str:
|
||||
"""
|
||||
将转录结果格式化为JSON
|
||||
|
||||
Args:
|
||||
segments: 转录段落列表
|
||||
info: 转录信息对象
|
||||
|
||||
Returns:
|
||||
str: JSON格式的转录结果
|
||||
"""
|
||||
result = {
|
||||
"segments": [{
|
||||
"id": i,
|
||||
"start": segment.start,
|
||||
"end": segment.end,
|
||||
"text": segment.text.strip(),
|
||||
"words": [{
|
||||
"word": word.word,
|
||||
"start": word.start,
|
||||
"end": word.end,
|
||||
"probability": word.probability
|
||||
} for word in segment.words] if hasattr(segment, 'words') and segment.words else []
|
||||
} for i, segment in enumerate(segments)],
|
||||
"language": info.language,
|
||||
"language_probability": info.language_probability if hasattr(info, 'language_probability') else None,
|
||||
"duration": info.duration,
|
||||
"all_language_probs": info.all_language_probs if hasattr(info, 'all_language_probs') else None
|
||||
}
|
||||
return json.dumps(result, indent=2, ensure_ascii=False)
|
||||
|
||||
def format_timestamp(seconds: float) -> str:
|
||||
"""
|
||||
格式化时间戳为VTT格式
|
||||
|
||||
Args:
|
||||
seconds: 秒数
|
||||
|
||||
Returns:
|
||||
str: 格式化的时间戳 (HH:MM:SS.mmm)
|
||||
"""
|
||||
hours = int(seconds // 3600)
|
||||
minutes = int((seconds % 3600) // 60)
|
||||
seconds = seconds % 60
|
||||
return f"{hours:02d}:{minutes:02d}:{seconds:06.3f}"
|
||||
|
||||
def format_timestamp_srt(seconds: float) -> str:
|
||||
"""
|
||||
格式化时间戳为SRT格式
|
||||
|
||||
Args:
|
||||
seconds: 秒数
|
||||
|
||||
Returns:
|
||||
str: 格式化的时间戳 (HH:MM:SS,mmm)
|
||||
"""
|
||||
hours = int(seconds // 3600)
|
||||
minutes = int((seconds % 3600) // 60)
|
||||
secs = int(seconds % 60)
|
||||
msecs = int((seconds - int(seconds)) * 1000)
|
||||
return f"{hours:02d}:{minutes:02d}:{secs:02d},{msecs:03d}"
|
||||
|
||||
def format_time(seconds: float) -> str:
|
||||
"""
|
||||
格式化时间为可读格式
|
||||
|
||||
Args:
|
||||
seconds: 秒数
|
||||
|
||||
Returns:
|
||||
str: 格式化的时间 (HH:MM:SS)
|
||||
"""
|
||||
hours = int(seconds // 3600)
|
||||
minutes = int((seconds % 3600) // 60)
|
||||
secs = int(seconds % 60)
|
||||
return f"{hours:02d}:{minutes:02d}:{secs:02d}"
|
||||
Reference in New Issue
Block a user