fix(asr): use content_dir for subtitle output instead of video_path
PR Test / lint (pull_request) Successful in 2s

- Add content_dir field to ASRInput schema
- Pass content_dir from pipeline when creating ASRInput
- Modify _try_official_subtitle to use content_dir for output
- Modify _run_whisper_basic to use content_dir for output
- Add validation for empty video_path in Whisper fallback

Root cause: DownloadProcessor sets content_file="" for video types,
causing Path("").parent to resolve to current directory instead of
content directory. Subtitle files were written to wrong location.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-15 22:58:02 +08:00
parent b6ff7c81aa
commit 8ad64a4d1b
4 changed files with 48 additions and 22 deletions
+2
View File
@@ -185,11 +185,13 @@ class Pipeline:
# ASR needs video path from download step
download_result = results.get("download", {})
video_path = download_result.get("content_file", "")
step_input = ASRInput(
content_id=parsed.content_id,
platform=parsed.platform,
video_path=video_path,
content_type=parsed.content_type,
content_dir=str(content_dir),
)
elif step_name == "analyze":
# Analyze needs metadata and content files
+14 -6
View File
@@ -172,9 +172,10 @@ class ASRProcessor:
Note:
无字幕返回 None(不是抛异常),让流程继续到 Whisper
"""
video_path = Path(input_data.video_path)
output_dir = video_path.parent
base_name = video_path.stem
# 使用 content_dir 作为输出目录(而不是从 video_path 推断)
output_dir = Path(input_data.content_dir)
# 使用 content_id 作为基础文件名
base_name = f"{input_data.platform}_{input_data.content_id}_subtitle"
# 输出文件路径
txt_path = output_dir / f"{base_name}.txt"
@@ -343,11 +344,18 @@ class ASRProcessor:
ASR 处理结果
Raises:
RuntimeError: Whisper.cpp 路径不存在或执行失败
RuntimeError: Whisper.cpp 路径不存在或执行失败,或 video_path 为空
"""
# 检查 video_path 是否有效
if not input_data.video_path:
raise RuntimeError(
"video_path 为空,无法执行 Whisper 语音识别。"
"请确保视频文件已下载(对于没有官方字幕的视频,需要先下载视频文件)。"
)
video_path = Path(input_data.video_path)
output_dir = video_path.parent
base_name = video_path.stem
output_dir = Path(input_data.content_dir)
base_name = f"{input_data.platform}_{input_data.content_id}_whisper"
# 获取 Whisper.cpp 路径
try:
+4 -2
View File
@@ -198,11 +198,13 @@ class ASRInput(StepInput):
继承 StepInput 的基础字段,添加视频路径和内容类型。
Attributes:
video_path: 视频文件路径
video_path: 视频文件路径(可能为空,用于 Whisper 降级)
content_type: 内容类型,默认为 'video'
content_dir: 内容目录路径,用于输出字幕文件
"""
video_path: str = Field(..., description="视频文件路径")
video_path: str = Field(default="", description="视频文件路径(可能为空)")
content_type: str = Field(default="video", description="内容类型")
content_dir: str = Field(..., description="内容目录路径")
class ASROutput(StepOutput):