auto-save 2026-05-14 10:59 (~6)
This commit is contained in:
@@ -18,7 +18,7 @@ uvicorn main:app --port 4291 --reload
|
||||
- `GET /health` — 健康检查 + 配置状态
|
||||
- `POST /jobs` `{url}` — 创建 job,后台跑下载/拆轨/抽帧
|
||||
- `GET /jobs/{id}` — 当前状态 + 产物
|
||||
- `POST /jobs/{id}/transcribe` — 触发 ASR + 翻译 + SKG 文案改写;配置 MiniMax 后生成配音
|
||||
- `POST /jobs/{id}/transcribe` — 触发音频提取 + ASR + 翻译 + SKG 文案改写;配置 MiniMax 后生成配音。前端 Audio 节点提供“提取音频 / 重新提取音频”按钮,不依赖抽帧完成
|
||||
- `GET /jobs/{id}/video.mp4` — 原视频
|
||||
- `GET /jobs/{id}/audio.wav` — 拆轨后的原始音频,供前端底部音频条生成波形
|
||||
- `GET /jobs/{id}/audio-script.mp3` — 改写文案的 MiniMax 配音
|
||||
|
||||
24
api/main.py
24
api/main.py
@@ -97,7 +97,8 @@ def llm() -> OpenAI:
|
||||
return _llm_client
|
||||
|
||||
# Pipeline 状态:
|
||||
# created → downloading → downloaded(停,等用户点解析)→ splitting → frames_extracted
|
||||
# created → downloading → downloaded(停,等用户点解析/提取音频)
|
||||
# → splitting → frames_extracted
|
||||
# → transcribing → transcribed | failed
|
||||
JobStatus = Literal[
|
||||
"created", "downloading", "downloaded",
|
||||
@@ -1563,7 +1564,17 @@ async def pipeline_transcribe(job_id: str) -> None:
|
||||
wav = d / "audio.wav"
|
||||
try:
|
||||
if not wav.exists():
|
||||
raise RuntimeError("audio.wav 不存在")
|
||||
mp4 = d / "source.mp4"
|
||||
if not mp4.exists():
|
||||
raise RuntimeError("source.mp4 不存在,视频导入完成后再提取音频")
|
||||
update(job, status="transcribing", message="ffmpeg 提取音频轨…", progress=max(job.progress, 45), error="")
|
||||
run([
|
||||
"ffmpeg", "-y", "-i", str(mp4),
|
||||
"-vn", "-ac", "1", "-ar", "16000", "-c:a", "pcm_s16le",
|
||||
str(wav),
|
||||
])
|
||||
if not wav.exists():
|
||||
raise RuntimeError("音频提取完成但找不到 audio.wav")
|
||||
|
||||
if not LLM_API_KEY:
|
||||
# 无 key 模式:mock 数据
|
||||
@@ -2004,9 +2015,12 @@ async def trigger_transcribe(job_id: str, bg: BackgroundTasks) -> Job:
|
||||
job = JOBS.get(job_id)
|
||||
if not job:
|
||||
raise HTTPException(404, "job not found")
|
||||
if job.status not in {"frames_extracted", "transcribed", "failed"}:
|
||||
raise HTTPException(409, f"status must be frames_extracted/transcribed/failed, got {job.status}")
|
||||
update(job, status="transcribing", progress=max(job.progress, 72), error="", message="准备音频转写…")
|
||||
mp4 = job_dir(job_id) / "source.mp4"
|
||||
if job.status in {"created", "downloading"} or not mp4.exists():
|
||||
raise HTTPException(409, f"video not ready, got {job.status}")
|
||||
if job.status in {"splitting", "transcribing"} or job.audio_script.status == "rewriting":
|
||||
raise HTTPException(409, f"job is busy, got {job.status}")
|
||||
update(job, status="transcribing", progress=max(job.progress, 45), error="", message="准备提取音频…")
|
||||
bg.add_task(pipeline_transcribe, job_id)
|
||||
return job
|
||||
|
||||
|
||||
Reference in New Issue
Block a user