Files
20260512-skg-tk/api
kang 3ed3f721eb fix(api): harden subprocess/SSRF/concurrency and add db pool
- run(): add timeout (download 600s via DOWNLOAD_TIMEOUT_SECONDS, else 300s);
  TimeoutExpired now kills the child and fails the job instead of hanging forever
- create_job: validate_source_url() rejects file://, private/loopback/link-local
  IPs and off-allowlist hosts (SOURCE_URL_ALLOWED_HOSTS) — closes SSRF/local-read
- per-job RLock guards save_state/update/update_generated_video and the retry
  check-and-set so concurrent video workers can't clobber state.json
- db: psycopg_pool connection pool (graceful fallback if unavailable); write
  failures surfaced via logging.error instead of silent print
- read-only media GET routes use job_path() (no mkdir) to stop empty-dir spam
- wrap remaining Image.open() in with-blocks to avoid fd leaks

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-30 02:04:59 +08:00
..
2026-05-27 17:18:45 +08:00
2026-05-12 15:51:42 +08:00

SKG TK 二创 API

FastAPI 后端,跑 yt-dlp + ffmpeg + ASR/翻译/音频画像、抽帧、GPT 图像生成/修图、Azure OpenAI TTS 预留和视频候选预留管线。

启动

cd api
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env  # 按需填 LLM_API_KEY / AZURE_OPENAI_API_KEY
uvicorn main:app --host 127.0.0.1 --port 4291

不要在长下载、抽帧、音频处理时带 --reload 跑后端reload 会等待后台任务结束,表现为端口还在但新请求卡住。

路由

  • GET /health — 健康检查 + 配置状态
  • POST /jobs {url} — 创建 job后台下载源视频前端“开始分析”会在视频就绪后自动启动音频解析和视觉抽帧
  • POST /jobs/{id}/download/retry — TK 链接下载失败后重试下载;上传视频任务不能重下载
  • GET /jobs/{id} — 当前状态 + 产物;若原始音轨已拆出,会返回 source_audio_url
  • POST /jobs/{id}/transcribe — 触发音频提取 + ASR + 中文翻译 + 讲话人 / 节奏 / 背景音分析;当前第一步不默认生成 SKG 新口播或 TTS 配音
  • GET /jobs/{id}/video.mp4 — 原视频
  • GET /jobs/{id}/audio.wav — 拆轨后的原始音频,供前端音频波形和多模态音频分析使用
  • GET /jobs/{id}/audio-script.mp3 — 后续新配音阶段保留的 Azure OpenAI TTS 文件
  • GET /jobs/{id}/frames/{i}.jpg — 第 i 张参考帧;当前主流程自动抽 12 张动作 / 节奏参考帧,也支持手动按当前播放点补帧

Mock 模式

未设 LLM_API_KEY 时,转录走本地 mock便于 UI 联调;未设 AZURE_OPENAI_API_KEY 时,后续 TTS 文件不会生成,但不影响当前第一步音频解析。

依赖

  • ffmpeg 系统二进制(拆轨 / 抽帧)
  • yt-dlp 系统二进制(也可走 Python 包)
  • OpenAI 兼容 LLM 网关ASR / 翻译 / 文案改写 / 视觉 briefASR 默认自动识别中文、英文和其他多语言,远端失败后先走容器内多语言 faster-whisper / 本机 mlx_whisper,再按开关用 ASR_FALLBACK_MODEL 走多模态音频识别,后端会拒绝疑似假字幕或覆盖率过低的时间轴
  • GPT 图片网关(当前所有生图 / 修图 / 产品视角识别 / 主体资产 / 首尾帧都强制使用 gpt-image-2,不做其他图片模型 fallback
  • Azure OpenAI TTS后续新配音阶段使用 AZURE_OPENAI_API_KEY;默认模型 gpt-4o-mini-tts,按 AZURE_TTS_PATHS 依次尝试语音路径)