diff --git a/.memory/status.md b/.memory/status.md
index 26538c0..7657eda 100644
--- a/.memory/status.md
+++ b/.memory/status.md
@@ -26,7 +26,7 @@
| 新口播改写 | `AUDIO_REWRITE_MODEL=gpt-4o` | 默认跟随 `REWRITE_MODEL`;旧 Gemini 覆盖值会自动归一化。 |
| 产品视角识别 | `PRODUCT_VIEW_MODEL=gpt-image-2` | 产品图批量识别视角、左右 / 上下 / 内外侧、用途和风险。 |
| 所有生图 / 修图 | `gpt-image-2` | 服务端硬锁,无图片模型 fallback;覆盖关键帧生图、水印清理、元素提取、主体资产包、产品补角度、首尾帧。 |
-| 配音 | `VOICE_PROVIDER=azure_openai` + `AZURE_TTS_MODEL=gpt-4o-mini-tts` | 语音固定 Azure OpenAI TTS;MiniMax 不再作为 fallback。后端会按 `AZURE_TTS_PATHS` 依次尝试路径,便于区分路径错误和整条语音服务不可用。 |
+| 配音 | `VOICE_PROVIDER=azure_openai` + `AZURE_TTS_MODEL=gpt-4o-mini-tts` | 语音固定 Azure OpenAI TTS。后端会按 `AZURE_TTS_PATHS` 依次尝试路径,便于区分路径错误和整条语音服务不可用。 |
| 视频 | `VIDEO_MODEL=seedance` | 当前主流程暂停直接提交;生产通道默认 `ai.skg.com/doubao`,Seedance 真实 ID 由 `VIDEO_MODEL_SEEDANCE` 配置。 |
## 当前主流程
@@ -87,7 +87,7 @@ POST /jobs/{id}/frames/{idx}/storyboard/video
2. 所有生图入口服务端只允许 `gpt-image-2`,不要重新加 Gemini 图片模型或其他 fallback。
3. 画面理解和文案改写默认归 GPT:`VISION_MODEL`、`REWRITE_MODEL`、`AUDIO_REWRITE_MODEL` 会拦截旧 `gemini-*` 覆盖值。
4. Gemini 仍保留在 ASR fallback / 音频分析 / 翻译链路,不要误删。
-5. 语音只走 Azure OpenAI TTS;不要新增或依赖 MiniMax 配音配置。
+5. 语音只走 Azure OpenAI TTS;不要新增或依赖其他配音通道配置。
6. 当前主流程不直接批量提交视频;先走“分镜规划 → 首尾帧 → 人工审核”。
7. 产品素材池默认是“同一产品”,不做不同产品身份判断;视角识别必须按佩戴者左 / 右、上 / 下、内 / 外侧描述。
8. 自动抽帧默认是 `frames=6` + `target=random_subject` + `quality=accurate` + `mode=replace`;如果需要特定动作或表情,用“当前点抽帧”手动补。
@@ -96,9 +96,10 @@ POST /jobs/{id}/frames/{idx}/storyboard/video
11. 关键帧 `index` 是稳定 ID,不等于数组下标;前端取帧用 `frames.find(x => x.index === idx)`。
## 最近变更
+- 2026-05-18:清理个人语音通道残留,`/health`、前端类型、环境模板和文档不再暴露相关字段或配置。
- 2026-05-18:新增后端数据库层,SQLite 默认落在 `APP_DB_URL` / `DATABASE_URL` 或 `JOBS_DIR/app.db`;`/documents` 返回文档归类列表,`/health.database` 返回 DB 状态。
- 2026-05-18:`VISION_MODEL`、`REWRITE_MODEL`、`AUDIO_REWRITE_MODEL` 切到 GPT 默认模型 `gpt-4o`,并加旧 Gemini 环境变量归一化保护。
-- 2026-05-18:语音通道固定 Azure OpenAI TTS,移除 MiniMax fallback,并按 `AZURE_TTS_PATHS` 尝试语音路径。
+- 2026-05-18:语音通道固定 Azure OpenAI TTS,并按 `AZURE_TTS_PATHS` 尝试语音路径。
- 2026-05-18:当前主路径暂停直接提交视频,改为逐条首尾帧闸门。
- 2026-05-18:媒体素材交互统一收口到 `MediaAssetTile`。
- 2026-05-18:产品图视角识别和产品缺角度补图收敛到 `gpt-image-2`。
diff --git a/RULES.md b/RULES.md
index 3b5218e..a4e6bbd 100644
--- a/RULES.md
+++ b/RULES.md
@@ -65,10 +65,9 @@
- `IMAGE_BASE_URL` / `IMAGE_API_KEY` / `IMAGE_MODEL`:OpenAI 兼容生图网关;当前所有生图入口一律强制使用 `gpt-image-2`,不做其他图片模型 fallback
- `GPT_IMAGE_MODEL` / `SUBJECT_ASSET_IMAGE_MODEL` / `SUBJECT_ASSET_IMAGE_MODELS`:保留兼容旧环境变量名,但服务端会强制主体 6 视图和所有其他生图入口都只使用 `gpt-image-2`
- `AI_HTTP_PROXY` / `IMAGE_HTTP_PROXY`:可选的 AI 网关出站代理;本地 launchd 后台进程不一定继承 shell 的 `http_proxy/https_proxy`,如生图报 DNS / ConnectError,可在本地 `api/.env` 配置后重启后端。`/health` 只回传是否配置代理,不回传代理地址。
-- `VOICE_PROVIDER`:配音通道,服务端固定使用 `azure_openai`;旧环境若写 `minimax` 会被忽略
+- `VOICE_PROVIDER`:配音通道,服务端固定使用 `azure_openai`
- `AZURE_OPENAI_BASE_URL` / `AZURE_OPENAI_API_KEY`:微软 Azure OpenAI 协议配音网关;本地未单独配置 Key 时回退复用 `LLM_API_KEY`
- `AZURE_TTS_MODEL` / `AZURE_TTS_VOICE_ID` / `AZURE_TTS_VOICE_POOL` / `AZURE_TTS_PATH` / `AZURE_TTS_PATHS`:Azure OpenAI TTS 模型、默认音色、音色池和 OpenAI 协议语音路径;后端会按 `AZURE_TTS_PATHS` 依次尝试,便于区分路径不对和整条语音服务不可用
-- MiniMax TTS 不再作为语音 fallback;不要新增或依赖 `MINIMAX_*` 配置
- `POE_API_KEY` / `VIDEO_API_KEY`:视频生成通道 Key,只能放本地环境变量
- `APP_DB_URL` / `DATABASE_URL`:后端元数据数据库;当前内置实现支持 `sqlite:///`,生产默认 `sqlite:////data/jobs/app.db`。文档归类以 `documents` 为顶层,一条 TK 链接或一次上传默认一个 document,`jobs` 和 `media_assets` 归属到 `document_id`。
- `WEB_AUTH_USERNAME` / `WEB_AUTH_PASSWORD` / `WEB_AUTH_SESSION_SECRET`:生产网页登录和会话签名配置;密码和 session secret 只放服务器环境变量,不入库
diff --git a/api/.env.example b/api/.env.example
index 7b0990e..e480e98 100644
--- a/api/.env.example
+++ b/api/.env.example
@@ -37,7 +37,7 @@ VIDEO_MODEL_VEO3=veo-3.1-fast
# 音频文案改写 + Azure OpenAI 配音
AUDIO_REWRITE_MODEL=gpt-4o
AUDIO_PRODUCT_BRIEF="SKG 智能按摩产品,主打日常肩颈、腰背、眼部、膝盖或足部放松;广告表达要高级、干净、可信,不做医疗疗效承诺。"
-# 语音通道服务端固定为 azure_openai;旧 VOICE_PROVIDER=minimax 会被忽略。
+# 语音通道服务端固定为 Azure OpenAI。
VOICE_PROVIDER=azure_openai
AZURE_OPENAI_BASE_URL=https://ai.skg.com/azure
AZURE_OPENAI_API_KEY=
diff --git a/api/main.py b/api/main.py
index e04b104..3b9d4be 100644
--- a/api/main.py
+++ b/api/main.py
@@ -97,8 +97,6 @@ AUDIO_PRODUCT_BRIEF = os.getenv(
"SKG 智能按摩产品,主打日常肩颈、腰背、眼部、膝盖或足部放松;广告表达要高级、干净、可信,不做医疗疗效承诺。",
).strip()
AUDIO_REWRITE_MODEL = gpt_model_env("AUDIO_REWRITE_MODEL", REWRITE_MODEL)
-# Voice is intentionally fixed to Azure OpenAI. Older envs may still contain
-# VOICE_PROVIDER=minimax, but the runtime must not fall back to MiniMax.
VOICE_PROVIDER = "azure_openai"
AZURE_OPENAI_BASE_URL = os.getenv("AZURE_OPENAI_BASE_URL", "https://ai.skg.com/azure").strip().rstrip("/")
AZURE_OPENAI_API_KEY = os.getenv("AZURE_OPENAI_API_KEY", LLM_API_KEY).strip()
@@ -3084,7 +3082,6 @@ def health() -> dict:
"voice_id": AZURE_TTS_VOICE_ID,
"voice_pool": AZURE_TTS_VOICE_POOL,
"voice_configured": bool(AZURE_OPENAI_API_KEY),
- "minimax_disabled": True,
"video": VIDEO_MODEL,
"video_aliases": VIDEO_MODEL_ALIASES,
"video_provider": video_provider_name(),
diff --git a/deploy/.env.production.example b/deploy/.env.production.example
index 3cd1f02..6793290 100644
--- a/deploy/.env.production.example
+++ b/deploy/.env.production.example
@@ -39,7 +39,7 @@ AI_HTTP_PROXY=
# Audio rewrite and Azure OpenAI TTS
AUDIO_REWRITE_MODEL=gpt-4o
AUDIO_PRODUCT_BRIEF="SKG smart massage products for daily neck, shoulder, back, eye, knee, and foot relaxation. Keep claims premium, clean, credible, and non-medical."
-# Voice is fixed to Azure OpenAI in the backend; legacy VOICE_PROVIDER=minimax is ignored.
+# Voice is fixed to Azure OpenAI in the backend.
VOICE_PROVIDER=azure_openai
AZURE_OPENAI_BASE_URL=https://ai.skg.com/azure
AZURE_OPENAI_API_KEY=
diff --git a/docs/source-analysis.html b/docs/source-analysis.html
index 4d8f707..6192a85 100644
--- a/docs/source-analysis.html
+++ b/docs/source-analysis.html
@@ -919,7 +919,7 @@ ProductRefStateItem {
| 音频文案轨 | POST /jobs/{id}/transcribe | triggerTranscribe | 若尚未拆轨,先从 source.mp4 提取 audio.wav 并回填 source_audio_url;随后用 ASR 提取原始文案,翻译成中文,写入 audio_script.source_text、source_zh 和逐句 transcript。远端 ASR_MODEL 失败后先走本机 LOCAL_ASR_BIN/LOCAL_ASR_MODEL(默认 mlx_whisper),再尝试 ASR_FALLBACK_MODEL。后端会拒绝重复文本、逐秒假字幕或覆盖率过低的结果,不再把不可听的多模态输出写进时间轴。再用 ASR_FALLBACK_MODEL 多模态音频分析讲话人、语速节奏、停顿、背景音乐/环境声/音效,写入 speaker_profile、rhythm_profile、background_audio_profile。当前第一步不默认生成 SKG 新口播和 Azure OpenAI 配音。 |
| 分镜脚本改写 | POST /jobs/{id}/script/rewrite | rewriteStoryboardScript | 根据原参考文案、当前新口播、分镜角色、时间段和作者想法改写中文口播,默认主模型为 AUDIO_REWRITE_MODEL=gpt-4o,失败后再尝试 ASR fallback 和翻译模型。mode=segment 只改一段;mode=all 一次改完整片,要求整片前后连贯。接口只返回 items[index,text],前端暂存在当前页面状态里,保存规划或生成首尾帧时写入 StoryboardScene.action。 |
| 原始音频文件 | GET /jobs/{id}/audio.wav | sourceAudioUrl | 返回拆轨得到的 wav;当前主界面不再渲染底部吸附音频条,右侧复刻工作表会读取该文件生成参考图式横向响度波形,并和原视频、逐句时间轴联动;波形标题栏显示当前播放秒数、总时长和鼠标指针停点秒数。 |
- | 改写配音文件 | GET /jobs/{id}/audio-script.mp3 | apiAssetUrl(job.audio_script.voice_url) | 后续新配音阶段保留的 TTS 产物;服务端固定走 VOICE_PROVIDER=azure_openai,通过 AZURE_OPENAI_BASE_URL 的 OpenAI 协议生成 mp3,并按 AZURE_TTS_PATHS 依次尝试 /audio/speech、/v1/audio/speech 等路径。MiniMax 不再作为 fallback。当前第一步不默认生成该文件。 |
+ | 改写配音文件 | GET /jobs/{id}/audio-script.mp3 | apiAssetUrl(job.audio_script.voice_url) | 后续新配音阶段保留的 TTS 产物;服务端固定走 VOICE_PROVIDER=azure_openai,通过 AZURE_OPENAI_BASE_URL 的 OpenAI 协议生成 mp3,并按 AZURE_TTS_PATHS 依次尝试 /audio/speech、/v1/audio/speech 等路径。当前第一步不默认生成该文件。 |
| 手动加帧 | POST /jobs/{id}/frames?t= | addManualFrame | 按视频时间戳抽一帧,index 递增但 frames 按 timestamp 排序。当前主界面会把原版视频播放器的播放秒数传给 AudioIntakePanel 标题栏右侧的“当前点抽帧”。 |
| 删除关键帧 | DELETE /jobs/{id}/frames/{idx} | deleteFrame | 删除单张关键帧并清掉对应选择态;当前主界面每张缩略图右下角提供删除入口,方便手动抽错后直接修正。 |
| Vision 识别 | POST /frames/{idx}/describe | describeFrame | 调用 VISION_MODEL=gpt-4o 做关键帧画面理解,写入 frame.description,后续可从 objects 加候选元素。 |
@@ -1002,7 +1002,7 @@ ProductRefStateItem {
阻塞 / 占位
- ASR:优先走当前 OpenAI-compatible 音频转写入口;如果该网关没有
/audio/transcriptions,自动 fallback 到 ASR_FALLBACK_MODEL(默认 gemini-2.5-flash)的多模态音频识别。
- - Voice:当前语音通道固定是
VOICE_PROVIDER=azure_openai,通过 AZURE_OPENAI_BASE_URL=https://ai.skg.com/azure 的 OpenAI 协议生成 TTS;后端按 AZURE_TTS_PATHS 依次尝试路径。第一步暂不默认调用,MiniMax 不再作为 fallback。
+ - Voice:当前语音通道固定是
VOICE_PROVIDER=azure_openai,通过 AZURE_OPENAI_BASE_URL=https://ai.skg.com/azure 的 OpenAI 协议生成 TTS;后端按 AZURE_TTS_PATHS 依次尝试路径。第一步暂不默认调用。
- Audio Product Brief:默认是通用 SKG 放松产品卖点;当前第一步只保留配置,后续分镜/新配音阶段再使用。
- Video Gen:当前视频通道固定优先 Seedance;
VIDEO_API_BASE_URL=https://ai.skg.com/doubao 走 content JSON 异步任务,提交后写入候选片段并轮询到完成。
- Compose:还没做本地 ffmpeg 字幕/TTS 合成。
@@ -1044,6 +1044,18 @@ ProductRefStateItem {
变更记录
这个记录不是 git log 的替代品。它记录“产品理解发生了什么变化、影响了哪些源码、你以后描述需求时该怎么说”。后续每次改功能都要补一条。
+
+
+ 2026-05-18 · 删除个人语音通道残留
+ API
+ Model
+
+
+
问题:旧个人语音通道虽然已不再作为活动路径,但仓库里仍有健康检查字段、前端类型、环境注释和文档历史文字残留,容易被误认为可用模型方案。
+
改动:/health 不再返回旧语音通道相关字段;web/lib/api.ts 删除对应类型;api/.env.example、deploy/.env.production.example、RULES.md、.memory/status.md 和本页移除相关名称和配置引用。语音只保留 Azure OpenAI TTS。
+
影响:后续模型分工里只描述 Azure OpenAI TTS;不要再把个人语音通道作为候选、fallback 或环境变量方案。
+
+
2026-05-18 · 新增后端文档数据库
@@ -1076,9 +1088,9 @@ ProductRefStateItem {
Model
-
问题:语音生成测试失败时无法区分是 Azure OpenAI TTS 路径配置不对,还是整条语音服务不可用;同时旧 MiniMax 分支仍可能被环境变量或前端文案误导。
-
改动:后端固定 VOICE_PROVIDER=azure_openai,删除 MiniMax TTS 活动配置和 fallback;_azure_openai_tts_sync 改为按 AZURE_TTS_PATHS 依次尝试多个 OpenAI-compatible 语音路径,失败时返回每个 URL 的 HTTP 状态或连接错误。/health 新增 models.voice_tts_paths 和 models.minimax_disabled=true。
-
影响:后续排查语音时先看失败信息里的路径和状态码:如果所有路径 404/405,优先调 AZURE_TTS_PATHS;如果连接/鉴权/上游错误,则按 Azure 语音服务可用性或 Key 排查。前端和状态文档不再把 MiniMax 当作候选语音方案。
+
问题:语音生成测试失败时无法区分是 Azure OpenAI TTS 路径配置不对,还是整条语音服务不可用;同时 TTS 分支仍可能被环境变量或前端文案误导。
+
改动:后端固定 VOICE_PROVIDER=azure_openai,删除旧 TTS 活动配置和 fallback;_azure_openai_tts_sync 改为按 AZURE_TTS_PATHS 依次尝试多个 OpenAI-compatible 语音路径,失败时返回每个 URL 的 HTTP 状态或连接错误。/health 新增 models.voice_tts_paths。
+
影响:后续排查语音时先看失败信息里的路径和状态码:如果所有路径 404/405,优先调 AZURE_TTS_PATHS;如果连接/鉴权/上游错误,则按 Azure 语音服务可用性或 Key 排查。前端和状态文档不再展示旧语音方案。
@@ -1253,7 +1265,7 @@ ProductRefStateItem {
Config
-
问题:之前图片、文本、音频分析共用 LLM_BASE_URL,配音默认仍是 MiniMax,视频虽然已接豆包/Seedance,但模型标注没有把“生图 GPT / 语音 Azure / 视频 Seedance”三条高优先级链路清楚拆开。
+
问题:之前图片、文本、音频分析共用 LLM_BASE_URL,语音通道不够清晰,视频虽然已接豆包/Seedance,但模型标注没有把“生图 GPT / 语音 Azure / 视频 Seedance”三条高优先级链路清楚拆开。
改动:api/main.py 新增 IMAGE_BASE_URL、IMAGE_API_KEY、VOICE_PROVIDER、AZURE_OPENAI_BASE_URL、AZURE_OPENAI_API_KEY、AZURE_TTS_MODEL 等配置;图片调用改走图片专用 OpenAI-compatible client,文字生图走 /images/generations,图生图后续已收敛到 /images/edits,默认 gpt-image-2;TTS 新增 Azure OpenAI 协议 /audio/speech 通道,默认 VOICE_PROVIDER=azure_openai;GET /health 回传图片、主体、语音和视频的实际模型与 base URL 供前端模型标注使用。
影响:api/main.py、web/lib/api.ts、RULES.md、.project.json、docs/source-analysis.html。真实 key 仍只写本地 api/.env / 生产环境变量,不能入库。
@@ -1614,7 +1626,7 @@ ProductRefStateItem {
问题:用户明确否定前一版“开始后自动抽帧、分镜、元素、合成”的推进方式,当前只需要把信息流广告快速复刻的第一步跑通:粘贴 TK 链接或上传视频,下载源视频,提取原音频文案,并分析讲话人、节奏和背景音。
-
改动:web/app/page.tsx 的开始流程改为下载完成后只自动触发 triggerTranscribe;上传视频也加入同一音频解析队列。AdRecreationBoard 主渲染改成左侧素材输入 + 右侧音频解析工作表,不再显示“追加分镜”“开始抽帧”“生成全部视频”。AudioStrip 右侧改为原文案/翻译/声音背景音分析。AudioScript 新增 background_audio_profile,后端 pipeline_transcribe 先保存原文案、中文翻译、讲话人、节奏和背景音分析,当前第一步不默认生成 SKG 新口播或 MiniMax 配音。
+
改动:web/app/page.tsx 的开始流程改为下载完成后只自动触发 triggerTranscribe;上传视频也加入同一音频解析队列。AdRecreationBoard 主渲染改成左侧素材输入 + 右侧音频解析工作表,不再显示“追加分镜”“开始抽帧”“生成全部视频”。AudioStrip 右侧改为原文案/翻译/声音背景音分析。AudioScript 新增 background_audio_profile,后端 pipeline_transcribe 先保存原文案、中文翻译、讲话人、节奏和背景音分析,当前第一步不默认生成 SKG 新口播或 TTS 配音。
影响:web/app/page.tsx、web/components/ad-recreation-board.tsx、web/components/audio-strip.tsx、web/lib/api.ts、api/main.py、RULES.md、.project.json、docs/source-analysis.html。后续需求应先描述“音频解析完成后是否进入下一步”,不要默认把抽帧/分镜/合成塞进开始动作。
@@ -2049,11 +2061,11 @@ ProductRefStateItem {
2026-05-14 · 音频提取直接生成英文产品口播
Audio
- MiniMax
+ TTS
问题:“提取音频”不能只做原音频转文字再改写,用户需要点击后直接得到介绍 SKG 产品的英文文案和配音,长度尽量贴近原音频,并且声音不能生硬。
-
改动:pipeline_transcribe 提取 audio.wav 后读取原音频时长,用该时长估算英文口播词数;_rewrite_audio_script_sync 改为生成自然、有趣、可直接 TTS 的 SKG 英文产品介绍。ASR/翻译保留为对照和节奏参考,ASR 不可用时仍继续生成产品口播。MiniMax voice_id 改为从 MINIMAX_TTS_VOICE_POOL 随机选择男声、女声或成熟声。
+
改动:pipeline_transcribe 提取 audio.wav 后读取原音频时长,用该时长估算英文口播词数;_rewrite_audio_script_sync 改为生成自然、有趣、可直接 TTS 的 SKG 英文产品介绍。ASR/翻译保留为对照和节奏参考,ASR 不可用时仍继续生成产品口播。TTS voice_id 改为从 语音音色池 随机选择男声、女声或成熟声。
影响:api/main.py、api/.env.example、api/README.md、RULES.md、web/components/nodes/index.tsx、web/components/audio-strip.tsx、web/components/dashboard.tsx、docs/source-analysis.html。
@@ -2115,7 +2127,7 @@ ProductRefStateItem {
问题:等待抽帧完成后自动启动音频,不符合“先把声音文案拿出来审核”的工作流;用户需要在音频卡片上直接触发。
-
改动:移除前端抽帧完成后的自动转写逻辑;AudioNode 保留并固定显示“提取音频 / 重新提取音频”按钮,点击音频卡片也会立即打开底部音频条。后端 /transcribe 不再要求 frames_extracted,视频就绪后可直接从 source.mp4 拆出 audio.wav,并按原音频时长生成 SKG 英文产品介绍和 MiniMax 随机英文配音;抽帧中触发时不抢主状态,而是用 audio_script.status 表示音频处理中。当当前网关的 whisper-1 audio endpoint 返回 404 时,会 fallback 到 Gemini 多模态音频识别;ASR 不可用时也会继续按原音频时长生成产品口播,不把可用文案标成前端错误。
+
改动:移除前端抽帧完成后的自动转写逻辑;AudioNode 保留并固定显示“提取音频 / 重新提取音频”按钮,点击音频卡片也会立即打开底部音频条。后端 /transcribe 不再要求 frames_extracted,视频就绪后可直接从 source.mp4 拆出 audio.wav,并按原音频时长生成 SKG 英文产品介绍和 TTS 随机英文配音;抽帧中触发时不抢主状态,而是用 audio_script.status 表示音频处理中。当当前网关的 whisper-1 audio endpoint 返回 404 时,会 fallback 到 Gemini 多模态音频识别;ASR 不可用时也会继续按原音频时长生成产品口播,不把可用文案标成前端错误。
影响:web/app/page.tsx、web/components/nodes/index.tsx、api/main.py、docs/source-analysis.html。
@@ -2127,7 +2139,7 @@ ProductRefStateItem {
问题:音频和文案只在节点或侧栏里展示,审核时缺少“文字和声音时间轴对应”的空间;英文口播和中文翻译也没有上下对齐。
-
改动:新增 web/components/audio-strip.tsx,在主工作台底部吸附显示,可拖拽调整高度、可收起。每个音频段按时间横向排列,上方显示英文,中间显示中文翻译,下方显示对应波形条;底部原音频播放器驱动时间轴,播放时绿色指针会沿全局波形移动,并在当前字幕节点内同步走过该段。右侧显示按原音频时长生成的 SKG 英文产品口播、MiniMax 随机英文配音和产品依据。后端新增 source_audio_url 和 GET /jobs/{id}/audio.wav 只读接口,前端用 Web Audio API 解码生成波形峰值。
+
改动:新增 web/components/audio-strip.tsx,在主工作台底部吸附显示,可拖拽调整高度、可收起。每个音频段按时间横向排列,上方显示英文,中间显示中文翻译,下方显示对应波形条;底部原音频播放器驱动时间轴,播放时绿色指针会沿全局波形移动,并在当前字幕节点内同步走过该段。右侧显示按原音频时长生成的 SKG 英文产品口播、TTS 随机英文配音和产品依据。后端新增 source_audio_url 和 GET /jobs/{id}/audio.wav 只读接口,前端用 Web Audio API 解码生成波形峰值。
影响:web/app/page.tsx、web/components/audio-strip.tsx、web/lib/api.ts、api/main.py、docs/source-analysis.html。
@@ -2139,7 +2151,7 @@ ProductRefStateItem {
问题:音频识别成功后只显示改写文案,用户看不到它和原音频之间的变化关系,难以判断“是不是把参考视频转成我们自己的话”。
-
改动:AudioNode 增加轻量对照摘要:改前显示原音频识别/翻译预览,改后显示 SKG 英文产品口播;侧栏 Rewrite 面板改为完整审核视图,先列原音频逐段 ASR/翻译,再列英文产品介绍稿、产品卖点依据和 MiniMax 英文配音播放器。
+
改动:AudioNode 增加轻量对照摘要:改前显示原音频识别/翻译预览,改后显示 SKG 英文产品口播;侧栏 Rewrite 面板改为完整审核视图,先列原音频逐段 ASR/翻译,再列英文产品介绍稿、产品卖点依据和 TTS 英文配音播放器。
影响:web/components/nodes/index.tsx、web/components/dashboard.tsx、docs/source-analysis.html。
@@ -2182,14 +2194,14 @@ ProductRefStateItem {
- 2026-05-14 · 音频处理接入 SKG 英文产品口播与 MiniMax 配音
+ 2026-05-14 · 音频处理接入 SKG 英文产品口播与 TTS 配音
Audio
- MiniMax
+ TTS
问题:音频处理节点之前只说明“音轨 → ASR → 翻译 → 改写”,没有按原音频时长生成的产品介绍产物,也没有配音输出;用户无法直接拿到符合 SKG 产品语境的英文口播。
-
改动:Job 新增 audio_script,pipeline_transcribe 提取 audio.wav 后按原音频秒数生成 SKG 英文产品介绍文案,并在配置 MINIMAX_API_KEY 时调用 MiniMax T2A 输出 /jobs/{id}/audio-script.mp3。MiniMax voice_id 从英文男声、女声、成熟声池随机选择;前端 AudioNode 和侧栏 Rewrite 区显示模型链路、英文产品文案和配音播放器。
-
边界:MiniMax 官方 Speech API 当前接入的是 TTS 配音,不替代 ASR;原始音频文案提取仍走现有 OpenAI-compatible audio transcription 入口。
+
改动:Job 新增 audio_script,pipeline_transcribe 提取 audio.wav 后按原音频秒数生成 SKG 英文产品介绍文案,并在配置 语音 API Key 时调用 TTS T2A 输出 /jobs/{id}/audio-script.mp3。TTS voice_id 从英文男声、女声、成熟声池随机选择;前端 AudioNode 和侧栏 Rewrite 区显示模型链路、英文产品文案和配音播放器。
+
边界:TTS 官方 Speech API 当前接入的是 TTS 配音,不替代 ASR;原始音频文案提取仍走现有 OpenAI-compatible audio transcription 入口。
影响:api/main.py、api/.env.example、api/README.md、web/lib/api.ts、web/components/nodes/index.tsx、web/components/dashboard.tsx、web/app/page.tsx、docs/source-analysis.html。
diff --git a/web/lib/api.ts b/web/lib/api.ts
index 108cc6c..3521622 100644
--- a/web/lib/api.ts
+++ b/web/lib/api.ts
@@ -173,7 +173,6 @@ export interface RuntimeModels {
voice_pool?: string[]
voice_configured?: boolean
voice_tts_paths?: string[]
- minimax_disabled?: boolean
video?: string
video_aliases?: Record
video_provider?: string
@@ -614,7 +613,6 @@ export interface BackendHealth {
rewrite?: string
audio_rewrite?: string
voice_tts_paths?: string[]
- minimax_disabled?: boolean
video?: string
video_aliases?: Record
video_base_url?: string