From a6eddf1c1464280ad37df93ec09cce7de9e3d372 Mon Sep 17 00:00:00 2001 From: kang Date: Mon, 18 May 2026 15:51:30 +0800 Subject: [PATCH] chore: remove personal voice channel remnants --- .memory/status.md | 7 +++--- RULES.md | 3 +-- api/.env.example | 2 +- api/main.py | 3 --- deploy/.env.production.example | 2 +- docs/source-analysis.html | 44 +++++++++++++++++++++------------- web/lib/api.ts | 2 -- 7 files changed, 35 insertions(+), 28 deletions(-) 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}/transcribetriggerTranscribe若尚未拆轨,先从 source.mp4 提取 audio.wav 并回填 source_audio_url;随后用 ASR 提取原始文案,翻译成中文,写入 audio_script.source_textsource_zh 和逐句 transcript。远端 ASR_MODEL 失败后先走本机 LOCAL_ASR_BIN/LOCAL_ASR_MODEL(默认 mlx_whisper),再尝试 ASR_FALLBACK_MODEL。后端会拒绝重复文本、逐秒假字幕或覆盖率过低的结果,不再把不可听的多模态输出写进时间轴。再用 ASR_FALLBACK_MODEL 多模态音频分析讲话人、语速节奏、停顿、背景音乐/环境声/音效,写入 speaker_profilerhythm_profilebackground_audio_profile。当前第一步不默认生成 SKG 新口播和 Azure OpenAI 配音。 分镜脚本改写POST /jobs/{id}/script/rewriterewriteStoryboardScript根据原参考文案、当前新口播、分镜角色、时间段和作者想法改写中文口播,默认主模型为 AUDIO_REWRITE_MODEL=gpt-4o,失败后再尝试 ASR fallback 和翻译模型。mode=segment 只改一段;mode=all 一次改完整片,要求整片前后连贯。接口只返回 items[index,text],前端暂存在当前页面状态里,保存规划或生成首尾帧时写入 StoryboardScene.action。 原始音频文件GET /jobs/{id}/audio.wavsourceAudioUrl返回拆轨得到的 wav;当前主界面不再渲染底部吸附音频条,右侧复刻工作表会读取该文件生成参考图式横向响度波形,并和原视频、逐句时间轴联动;波形标题栏显示当前播放秒数、总时长和鼠标指针停点秒数。 - 改写配音文件GET /jobs/{id}/audio-script.mp3apiAssetUrl(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.mp3apiAssetUrl(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}/describedescribeFrame调用 VISION_MODEL=gpt-4o 做关键帧画面理解,写入 frame.description,后续可从 objects 加候选元素。 @@ -1002,7 +1002,7 @@ ProductRefStateItem {

阻塞 / 占位