# SKG TK 二创 API

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

## 启动

```bash
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 / 翻译 / 文案改写 / 视觉 brief）；远端 `whisper-1` 失败后先走本机 `mlx_whisper`，再用 `ASR_FALLBACK_MODEL` 走 Gemini 多模态音频识别，后端会拒绝疑似假字幕或覆盖率过低的时间轴
- GPT 图片网关（当前所有生图 / 修图 / 产品视角识别 / 主体资产 / 首尾帧都强制使用 `gpt-image-2`，不做其他图片模型 fallback）
- Azure OpenAI TTS（后续新配音阶段使用 `AZURE_OPENAI_API_KEY`；默认模型 `gpt-4o-mini-tts`，按 `AZURE_TTS_PATHS` 依次尝试语音路径）
