# SKG TK 二创 API

FastAPI 后端，跑 yt-dlp + ffmpeg + ASR/翻译/英文 SKG 产品介绍文案 + Azure OpenAI 英文配音管线。

## 启动

```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` — 健康检查 + 配置状态
- `GET  /documents` — 后端数据库里的文档归类列表；一条 TK 链接或一次上传视频默认一个 document
- `POST /jobs` `{url}` — 创建 job，后台下载源视频，视频就绪后可手动解析或提取音频
- `GET  /jobs/{id}` — 当前状态 + 产物；若原始音轨已拆出，会返回 `source_audio_url`
- `POST /jobs/{id}/transcribe` — 触发音频提取 + ASR + 翻译 + SKG 英文产品介绍文案；文案长度按原音频时长估算，配置 Azure OpenAI TTS 后从 Azure 音色池生成配音。前端 Audio 节点提供“提取音频 / 重新提取音频”按钮，可与抽帧并行，不自动触发
- `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 张关键帧（0-9）

## Mock 模式

未设 `LLM_API_KEY` 时，转录走本地 mock，便于 UI 联调；未设 `AZURE_OPENAI_API_KEY` 且无法复用 `LLM_API_KEY` 时只生成改写文案，不生成配音文件。

## 依赖

- `ffmpeg` 系统二进制（拆轨 / 抽帧）
- `yt-dlp` 系统二进制（也可走 Python 包）
- SQLite 元数据数据库（默认 `APP_DB_URL=sqlite:///./jobs/app.db`）；只存 document / job / media asset 元数据，原视频、音频、抽帧和生成文件继续放 `jobs/<jobId>/`
- OpenAI 兼容 LLM 网关（ASR / 翻译 / 文案改写）；如果 `/audio/transcriptions` 不可用，会用 `ASR_FALLBACK_MODEL` 走 Gemini 多模态音频识别
- Azure OpenAI TTS（英文产品介绍文案配音，使用 `AZURE_OPENAI_API_KEY` 或回退复用 `LLM_API_KEY`；默认音色池 `alloy,verse,shimmer`）
