@@ -919,7 +919,7 @@ ProductRefStateItem {
< tr > < td > 音频文案轨< / td > < td > < code > POST /jobs/{id}/transcribe< / code > < / td > < td > < code > triggerTranscribe< / code > < / td > < td > 若尚未拆轨,先从 < code > source.mp4< / code > 提取 < code > audio.wav< / code > 并回填 < code > source_audio_url< / code > ;随后用 ASR 提取原始文案,翻译成中文,写入 < code > audio_script.source_text< / code > 、< code > source_zh< / code > 和逐句 < code > transcript< / code > 。远端 < code > ASR_MODEL< / code > 失败后先走本机 < code > LOCAL_ASR_BIN< / code > /< code > LOCAL_ASR_MODEL< / code > (默认 < code > mlx_whisper< / code > ),再尝试 < code > ASR_FALLBACK_MODEL< / code > 。后端会拒绝重复文本、逐秒假字幕或覆盖率过低的结果,不再把不可听的多模态输出写进时间轴。再用 < code > ASR_FALLBACK_MODEL< / code > 多模态音频分析讲话人、语速节奏、停顿、背景音乐/环境声/音效,写入 < code > speaker_profile< / code > 、< code > rhythm_profile< / code > 、< code > background_audio_profile< / code > 。当前第一步不默认生成 SKG 新口播和 Azure OpenAI 配音。< / td > < / tr >
< tr > < td > 分镜脚本改写< / td > < td > < code > POST /jobs/{id}/script/rewrite< / code > < / td > < td > < code > rewriteStoryboardScript< / code > < / td > < td > 根据原参考文案、当前新口播、分镜角色、时间段和作者想法改写中文口播,默认主模型为 < code > AUDIO_REWRITE_MODEL=gpt-4o< / code > ,失败后再尝试 ASR fallback 和翻译模型。< code > mode=segment< / code > 只改一段;< code > mode=all< / code > 一次改完整片,要求整片前后连贯。接口只返回 < code > items[index,text]< / code > ,前端暂存在当前页面状态里,保存规划或生成首尾帧时写入 < code > StoryboardScene.action< / code > 。< / td > < / tr >
< tr > < td > 原始音频文件< / td > < td > < code > GET /jobs/{id}/audio.wav< / code > < / td > < td > < code > sourceAudioUrl< / code > < / td > < td > 返回拆轨得到的 wav; 当前主界面不再渲染底部吸附音频条, 右侧复刻工作表会读取该文件生成参考图式横向响度波形, 并和原视频、逐句时间轴联动; 波形标题栏显示当前播放秒数、总时长和鼠标指针停点秒数。< / td > < / tr >
< tr > < td > 改写配音文件< / td > < td > < code > GET /jobs/{id}/audio-script.mp3< / code > < / td > < td > < code > apiAssetUrl(job.audio_script.voice_url)< / code > < / td > < td > 后续新配音阶段保留的 TTS 产物;服务端固定走 < code > VOICE_PROVIDER=azure_openai< / code > ,通过 < code > AZURE_OPENAI_BASE_URL< / code > 的 OpenAI 协议生成 mp3, 并按 < code > AZURE_TTS_PATHS< / code > 依次尝试 < code > /audio/speech< / code > 、< code > /v1/audio/speech< / code > 等路径。MiniMax 不再作为 fallback。 当前第一步不默认生成该文件。< / td > < / tr >
< tr > < td > 改写配音文件< / td > < td > < code > GET /jobs/{id}/audio-script.mp3< / code > < / td > < td > < code > apiAssetUrl(job.audio_script.voice_url)< / code > < / td > < td > 后续新配音阶段保留的 TTS 产物;服务端固定走 < code > VOICE_PROVIDER=azure_openai< / code > ,通过 < code > AZURE_OPENAI_BASE_URL< / code > 的 OpenAI 协议生成 mp3, 并按 < code > AZURE_TTS_PATHS< / code > 依次尝试 < code > /audio/speech< / code > 、< code > /v1/audio/speech< / code > 等路径。当前第一步不默认生成该文件。< / td > < / tr >
< tr > < td > 手动加帧< / td > < td > < code > POST /jobs/{id}/frames?t=< / code > < / td > < td > < code > addManualFrame< / code > < / td > < td > 按视频时间戳抽一帧, index 递增但 frames 按 timestamp 排序。当前主界面会把原版视频播放器的播放秒数传给 < code > AudioIntakePanel< / code > 标题栏右侧的“当前点抽帧”。< / td > < / tr >
< tr > < td > 删除关键帧< / td > < td > < code > DELETE /jobs/{id}/frames/{idx}< / code > < / td > < td > < code > deleteFrame< / code > < / td > < td > 删除单张关键帧并清掉对应选择态;当前主界面每张缩略图右下角提供删除入口,方便手动抽错后直接修正。< / td > < / tr >
< tr > < td > Vision 识别< / td > < td > < code > POST /frames/{idx}/describe< / code > < / td > < td > < code > describeFrame< / code > < / td > < td > 调用 < code > VISION_MODEL=gpt-4o< / code > 做关键帧画面理解,写入 frame.description, 后续可从 objects 加候选元素。< / td > < / tr >
@@ -1002,7 +1002,7 @@ ProductRefStateItem {
< h3 > 阻塞 / 占位< / h3 >
< ul >
< li > ASR: 优先走当前 OpenAI-compatible 音频转写入口;如果该网关没有 < code > /audio/transcriptions< / code > ,自动 fallback 到 < code > ASR_FALLBACK_MODEL< / code > (默认 < code > gemini-2.5-flash< / code > )的多模态音频识别。< / li >
< li > Voice: 当前语音通道固定是 < code > VOICE_PROVIDER=azure_openai< / code > ,通过 < code > AZURE_OPENAI_BASE_URL=https://ai.skg.com/azure< / code > 的 OpenAI 协议生成 TTS; 后端按 < code > AZURE_TTS_PATHS< / code > 依次尝试路径。第一步暂不默认调用, MiniMax 不再作为 fallback 。< / li >
< li > Voice: 当前语音通道固定是 < code > VOICE_PROVIDER=azure_openai< / code > ,通过 < code > AZURE_OPENAI_BASE_URL=https://ai.skg.com/azure< / code > 的 OpenAI 协议生成 TTS; 后端按 < code > AZURE_TTS_PATHS< / code > 依次尝试路径。第一步暂不默认调用。< / li >
< li > Audio Product Brief: 默认是通用 SKG 放松产品卖点;当前第一步只保留配置,后续分镜/新配音阶段再使用。< / li >
< li > Video Gen: 当前视频通道固定优先 Seedance; < code > VIDEO_API_BASE_URL=https://ai.skg.com/doubao< / code > 走 content JSON 异步任务,提交后写入候选片段并轮询到完成。< / li >
< li > Compose: 还没做本地 ffmpeg 字幕/TTS 合成。< / li >
@@ -1044,6 +1044,18 @@ ProductRefStateItem {
< h2 > 变更记录< / h2 >
< p > 这个记录不是 git log 的替代品。它记录“产品理解发生了什么变化、影响了哪些源码、你以后描述需求时该怎么说”。后续每次改功能都要补一条。< / p >
< div class = "changelog" >
< article class = "change" >
< header >
< h3 > 2026-05-18 · 删除个人语音通道残留< / h3 >
< span class = "tag violet" > API< / span >
< span class = "tag cyan" > Model< / span >
< / header >
< div class = "body" >
< p > < strong > 问题:< / strong > 旧个人语音通道虽然已不再作为活动路径,但仓库里仍有健康检查字段、前端类型、环境注释和文档历史文字残留,容易被误认为可用模型方案。< / p >
< p > < strong > 改动:< / strong > < code > /health< / code > 不再返回旧语音通道相关字段;< code > web/lib/api.ts< / code > 删除对应类型;< code > api/.env.example< / code > 、< code > deploy/.env.production.example< / code > 、< code > RULES.md< / code > 、< code > .memory/status.md< / code > 和本页移除相关名称和配置引用。语音只保留 Azure OpenAI TTS。< / p >
< p > < strong > 影响:< / strong > 后续模型分工里只描述 Azure OpenAI TTS; 不要再把个人语音通道作为候选、fallback 或环境变量方案。< / p >
< / div >
< / article >
< article class = "change" >
< header >
< h3 > 2026-05-18 · 新增后端文档数据库< / h3 >
@@ -1076,9 +1088,9 @@ ProductRefStateItem {
< span class = "tag cyan" > Model< / span >
< / header >
< div class = "body" >
< p > < strong > 问题:< / strong > 语音生成测试失败时无法区分是 Azure OpenAI TTS 路径配置不对,还是整条语音服务不可用;同时旧 MiniMax 分支仍可能被环境变量或前端文案误导。< / p >
< p > < strong > 改动:< / strong > 后端固定 < code > VOICE_PROVIDER=azure_openai< / code > ,删除 MiniMax TTS 活动配置和 fallback; < code > _azure_openai_tts_sync< / code > 改为按 < code > AZURE_TTS_PATHS< / code > 依次尝试多个 OpenAI-compatible 语音路径,失败时返回每个 URL 的 HTTP 状态或连接错误。< code > /health< / code > 新增 < code > models.voice_tts_paths< / code > 和 < code > models.minimax_disabled=true< / code > 。< / p >
< p > < strong > 影响:< / strong > 后续排查语音时先看失败信息里的路径和状态码:如果所有路径 404/405, 优先调 < code > AZURE_TTS_PATHS< / code > ;如果连接/鉴权/上游错误,则按 Azure 语音服务可用性或 Key 排查。前端和状态文档不再把 MiniMax 当作候选 语音方案。< / p >
< p > < strong > 问题:< / strong > 语音生成测试失败时无法区分是 Azure OpenAI TTS 路径配置不对,还是整条语音服务不可用;同时 TTS 分支仍可能被环境变量或前端文案误导。< / p >
< p > < strong > 改动:< / strong > 后端固定 < code > VOICE_PROVIDER=azure_openai< / code > ,删除旧 TTS 活动配置和 fallback; < code > _azure_openai_tts_sync< / code > 改为按 < code > AZURE_TTS_PATHS< / code > 依次尝试多个 OpenAI-compatible 语音路径,失败时返回每个 URL 的 HTTP 状态或连接错误。< code > /health< / code > 新增 < code > models.voice_tts_paths< / code > 。< / p >
< p > < strong > 影响:< / strong > 后续排查语音时先看失败信息里的路径和状态码:如果所有路径 404/405, 优先调 < code > AZURE_TTS_PATHS< / code > ;如果连接/鉴权/上游错误,则按 Azure 语音服务可用性或 Key 排查。前端和状态文档不再展示旧 语音方案。< / p >
< / div >
< / article >
< article class = "change" >
@@ -1253,7 +1265,7 @@ ProductRefStateItem {
< span class = "tag amber" > Config< / span >
< / header >
< div class = "body" >
< p > < strong > 问题:< / strong > 之前图片、文本、音频分析共用 < code > LLM_BASE_URL< / code > , 配音默认仍是 MiniMax ,视频虽然已接豆包/Seedance, 但模型标注没有把“生图 GPT / 语音 Azure / 视频 Seedance”三条高优先级链路清楚拆开。< / p >
< p > < strong > 问题:< / strong > 之前图片、文本、音频分析共用 < code > LLM_BASE_URL< / code > , 语音通道不够清晰 ,视频虽然已接豆包/Seedance, 但模型标注没有把“生图 GPT / 语音 Azure / 视频 Seedance”三条高优先级链路清楚拆开。< / p >
< p > < strong > 改动:< / strong > < code > api/main.py< / code > 新增 < code > IMAGE_BASE_URL< / code > 、< code > IMAGE_API_KEY< / code > 、< code > VOICE_PROVIDER< / code > 、< code > AZURE_OPENAI_BASE_URL< / code > 、< code > AZURE_OPENAI_API_KEY< / code > 、< code > AZURE_TTS_MODEL< / code > 等配置;图片调用改走图片专用 OpenAI-compatible client, 文字生图走 < code > /images/generations< / code > ,图生图后续已收敛到 < code > /images/edits< / code > ,默认 < code > gpt-image-2< / code > ; TTS 新增 Azure OpenAI 协议 < code > /audio/speech< / code > 通道,默认 < code > VOICE_PROVIDER=azure_openai< / code > ; < code > GET /health< / code > 回传图片、主体、语音和视频的实际模型与 base URL 供前端模型标注使用。< / p >
< p > < strong > 影响:< / strong > < code > api/main.py< / code > 、< code > web/lib/api.ts< / code > 、< code > RULES.md< / code > 、< code > .project.json< / code > 、< code > docs/source-analysis.html< / code > 。真实 key 仍只写本地 < code > api/.env< / code > / 生产环境变量,不能入库。< / p >
< / div >
@@ -1614,7 +1626,7 @@ ProductRefStateItem {
< / header >
< div class = "body" >
< p > < strong > 问题:< / strong > 用户明确否定前一版“开始后自动抽帧、分镜、元素、合成”的推进方式,当前只需要把信息流广告快速复刻的第一步跑通:粘贴 TK 链接或上传视频,下载源视频,提取原音频文案,并分析讲话人、节奏和背景音。< / p >
< p > < strong > 改动:< / strong > < code > web/app/page.tsx< / code > 的开始流程改为下载完成后只自动触发 < code > triggerTranscribe< / code > ;上传视频也加入同一音频解析队列。< code > AdRecreationBoard< / code > 主渲染改成左侧素材输入 + 右侧音频解析工作表,不再显示“追加分镜”“开始抽帧”“生成全部视频”。< code > AudioStrip< / code > 右侧改为原文案/翻译/声音背景音分析。< code > AudioScript< / code > 新增 < code > background_audio_profile< / code > ,后端 < code > pipeline_transcribe< / code > 先保存原文案、中文翻译、讲话人、节奏和背景音分析,当前第一步不默认生成 SKG 新口播或 MiniMax 配音。< / p >
< p > < strong > 改动:< / strong > < code > web/app/page.tsx< / code > 的开始流程改为下载完成后只自动触发 < code > triggerTranscribe< / code > ;上传视频也加入同一音频解析队列。< code > AdRecreationBoard< / code > 主渲染改成左侧素材输入 + 右侧音频解析工作表,不再显示“追加分镜”“开始抽帧”“生成全部视频”。< code > AudioStrip< / code > 右侧改为原文案/翻译/声音背景音分析。< code > AudioScript< / code > 新增 < code > background_audio_profile< / code > ,后端 < code > pipeline_transcribe< / code > 先保存原文案、中文翻译、讲话人、节奏和背景音分析,当前第一步不默认生成 SKG 新口播或 TTS 配音。< / p >
< p > < strong > 影响:< / strong > < code > web/app/page.tsx< / code > 、< code > web/components/ad-recreation-board.tsx< / code > 、< code > web/components/audio-strip.tsx< / code > 、< code > web/lib/api.ts< / code > 、< code > api/main.py< / code > 、< code > RULES.md< / code > 、< code > .project.json< / code > 、< code > docs/source-analysis.html< / code > 。后续需求应先描述“音频解析完成后是否进入下一步”,不要默认把抽帧/分镜/合成塞进开始动作。< / p >
< / div >
< / article >
@@ -2049,11 +2061,11 @@ ProductRefStateItem {
< header >
< h3 > 2026-05-14 · 音频提取直接生成英文产品口播< / h3 >
< span class = "tag gray" > Audio< / span >
< span class = "tag green" > MiniMax < / span >
< span class = "tag green" > TTS < / span >
< / header >
< div class = "body" >
< p > < strong > 问题:< / strong > “提取音频”不能只做原音频转文字再改写,用户需要点击后直接得到介绍 SKG 产品的英文文案和配音,长度尽量贴近原音频,并且声音不能生硬。< / p >
< p > < strong > 改动:< / strong > < code > pipeline_transcribe< / code > 提取 < code > audio.wav< / code > 后读取原音频时长,用该时长估算英文口播词数;< code > _rewrite_audio_script_sync< / code > 改为生成自然、有趣、可直接 TTS 的 SKG 英文产品介绍。ASR/翻译保留为对照和节奏参考, ASR 不可用时仍继续生成产品口播。MiniMax voice_id 改为从 < code > MINIMAX_TTS_VOICE_POOL < / code > 随机选择男声、女声或成熟声。< / p >
< p > < strong > 改动:< / strong > < code > pipeline_transcribe< / code > 提取 < code > audio.wav< / code > 后读取原音频时长,用该时长估算英文口播词数;< code > _rewrite_audio_script_sync< / code > 改为生成自然、有趣、可直接 TTS 的 SKG 英文产品介绍。ASR/翻译保留为对照和节奏参考, ASR 不可用时仍继续生成产品口播。TTS voice_id 改为从 < code > 语音音色池 < / code > 随机选择男声、女声或成熟声。< / p >
< p > < strong > 影响:< / strong > < code > api/main.py< / code > 、< code > api/.env.example< / code > 、< code > api/README.md< / code > 、< code > RULES.md< / code > 、< code > web/components/nodes/index.tsx< / code > 、< code > web/components/audio-strip.tsx< / code > 、< code > web/components/dashboard.tsx< / code > 、< code > docs/source-analysis.html< / code > 。< / p >
< / div >
< / article >
@@ -2115,7 +2127,7 @@ ProductRefStateItem {
< / header >
< div class = "body" >
< p > < strong > 问题:< / strong > 等待抽帧完成后自动启动音频,不符合“先把声音文案拿出来审核”的工作流;用户需要在音频卡片上直接触发。< / p >
< p > < strong > 改动:< / strong > 移除前端抽帧完成后的自动转写逻辑;< code > AudioNode< / code > 保留并固定显示“提取音频 / 重新提取音频”按钮,点击音频卡片也会立即打开底部音频条。后端 < code > /transcribe< / code > 不再要求 < code > frames_extracted< / code > ,视频就绪后可直接从 < code > source.mp4< / code > 拆出 < code > audio.wav< / code > ,并按原音频时长生成 SKG 英文产品介绍和 MiniMax 随机英文配音;抽帧中触发时不抢主状态,而是用 < code > audio_script.status< / code > 表示音频处理中。当当前网关的 < code > whisper-1< / code > audio endpoint 返回 404 时,会 fallback 到 Gemini 多模态音频识别; ASR 不可用时也会继续按原音频时长生成产品口播,不把可用文案标成前端错误。< / p >
< p > < strong > 改动:< / strong > 移除前端抽帧完成后的自动转写逻辑;< code > AudioNode< / code > 保留并固定显示“提取音频 / 重新提取音频”按钮,点击音频卡片也会立即打开底部音频条。后端 < code > /transcribe< / code > 不再要求 < code > frames_extracted< / code > ,视频就绪后可直接从 < code > source.mp4< / code > 拆出 < code > audio.wav< / code > ,并按原音频时长生成 SKG 英文产品介绍和 TTS 随机英文配音;抽帧中触发时不抢主状态,而是用 < code > audio_script.status< / code > 表示音频处理中。当当前网关的 < code > whisper-1< / code > audio endpoint 返回 404 时,会 fallback 到 Gemini 多模态音频识别; ASR 不可用时也会继续按原音频时长生成产品口播,不把可用文案标成前端错误。< / p >
< p > < strong > 影响:< / strong > < code > web/app/page.tsx< / code > 、< code > web/components/nodes/index.tsx< / code > 、< code > api/main.py< / code > 、< code > docs/source-analysis.html< / code > 。< / p >
< / div >
< / article >
@@ -2127,7 +2139,7 @@ ProductRefStateItem {
< / header >
< div class = "body" >
< p > < strong > 问题:< / strong > 音频和文案只在节点或侧栏里展示,审核时缺少“文字和声音时间轴对应”的空间;英文口播和中文翻译也没有上下对齐。< / p >
< p > < strong > 改动:< / strong > 新增 < code > web/components/audio-strip.tsx< / code > ,在主工作台底部吸附显示,可拖拽调整高度、可收起。每个音频段按时间横向排列,上方显示英文,中间显示中文翻译,下方显示对应波形条;底部原音频播放器驱动时间轴,播放时绿色指针会沿全局波形移动,并在当前字幕节点内同步走过该段。右侧显示按原音频时长生成的 SKG 英文产品口播、MiniMax 随机英文配音和产品依据。后端新增 < code > source_audio_url< / code > 和 < code > GET /jobs/{id}/audio.wav< / code > 只读接口,前端用 Web Audio API 解码生成波形峰值。< / p >
< p > < strong > 改动:< / strong > 新增 < code > web/components/audio-strip.tsx< / code > ,在主工作台底部吸附显示,可拖拽调整高度、可收起。每个音频段按时间横向排列,上方显示英文,中间显示中文翻译,下方显示对应波形条;底部原音频播放器驱动时间轴,播放时绿色指针会沿全局波形移动,并在当前字幕节点内同步走过该段。右侧显示按原音频时长生成的 SKG 英文产品口播、TTS 随机英文配音和产品依据。后端新增 < code > source_audio_url< / code > 和 < code > GET /jobs/{id}/audio.wav< / code > 只读接口,前端用 Web Audio API 解码生成波形峰值。< / p >
< p > < strong > 影响:< / strong > < code > web/app/page.tsx< / code > 、< code > web/components/audio-strip.tsx< / code > 、< code > web/lib/api.ts< / code > 、< code > api/main.py< / code > 、< code > docs/source-analysis.html< / code > 。< / p >
< / div >
< / article >
@@ -2139,7 +2151,7 @@ ProductRefStateItem {
< / header >
< div class = "body" >
< p > < strong > 问题:< / strong > 音频识别成功后只显示改写文案,用户看不到它和原音频之间的变化关系,难以判断“是不是把参考视频转成我们自己的话”。< / p >
< p > < strong > 改动:< / strong > < code > AudioNode< / code > 增加轻量对照摘要:改前显示原音频识别/翻译预览,改后显示 SKG 英文产品口播;侧栏 < code > Rewrite< / code > 面板改为完整审核视图,先列原音频逐段 ASR/翻译,再列英文产品介绍稿、产品卖点依据和 MiniMax 英文配音播放器。< / p >
< p > < strong > 改动:< / strong > < code > AudioNode< / code > 增加轻量对照摘要:改前显示原音频识别/翻译预览,改后显示 SKG 英文产品口播;侧栏 < code > Rewrite< / code > 面板改为完整审核视图,先列原音频逐段 ASR/翻译,再列英文产品介绍稿、产品卖点依据和 TTS 英文配音播放器。< / p >
< p > < strong > 影响:< / strong > < code > web/components/nodes/index.tsx< / code > 、< code > web/components/dashboard.tsx< / code > 、< code > docs/source-analysis.html< / code > 。< / p >
< / div >
< / article >
@@ -2182,14 +2194,14 @@ ProductRefStateItem {
< / article >
< article class = "change" >
< header >
< h3 > 2026-05-14 · 音频处理接入 SKG 英文产品口播与 MiniMax 配音< / h3 >
< h3 > 2026-05-14 · 音频处理接入 SKG 英文产品口播与 TTS 配音< / h3 >
< span class = "tag gray" > Audio< / span >
< span class = "tag green" > MiniMax < / span >
< span class = "tag green" > TTS < / span >
< / header >
< div class = "body" >
< p > < strong > 问题:< / strong > 音频处理节点之前只说明“音轨 → ASR → 翻译 → 改写”,没有按原音频时长生成的产品介绍产物,也没有配音输出;用户无法直接拿到符合 SKG 产品语境的英文口播。< / p >
< p > < strong > 改动:< / strong > < code > Job< / code > 新增 < code > audio_script< / code > , < code > pipeline_transcribe< / code > 提取 < code > audio.wav< / code > 后按原音频秒数生成 SKG 英文产品介绍文案,并在配置 < code > MINIMAX_API_KEY < / code > 时调用 MiniMax T2A 输出 < code > /jobs/{id}/audio-script.mp3< / code > 。MiniMax voice_id 从英文男声、女声、成熟声池随机选择;前端 < code > AudioNode< / code > 和侧栏 Rewrite 区显示模型链路、英文产品文案和配音播放器。< / p >
< p > < strong > 边界:< / strong > MiniMax 官方 Speech API 当前接入的是 TTS 配音,不替代 ASR; 原始音频文案提取仍走现有 OpenAI-compatible audio transcription 入口。< / p >
< p > < strong > 改动:< / strong > < code > Job< / code > 新增 < code > audio_script< / code > , < code > pipeline_transcribe< / code > 提取 < code > audio.wav< / code > 后按原音频秒数生成 SKG 英文产品介绍文案,并在配置 < code > 语音 API Key < / code > 时调用 TTS T2A 输出 < code > /jobs/{id}/audio-script.mp3< / code > 。TTS voice_id 从英文男声、女声、成熟声池随机选择;前端 < code > AudioNode< / code > 和侧栏 Rewrite 区显示模型链路、英文产品文案和配音播放器。< / p >
< p > < strong > 边界:< / strong > TTS 官方 Speech API 当前接入的是 TTS 配音,不替代 ASR; 原始音频文案提取仍走现有 OpenAI-compatible audio transcription 入口。< / p >
< p > < strong > 影响:< / strong > < code > api/main.py< / code > 、< code > api/.env.example< / code > 、< code > api/README.md< / code > 、< code > web/lib/api.ts< / code > 、< code > web/components/nodes/index.tsx< / code > 、< code > web/components/dashboard.tsx< / code > 、< code > web/app/page.tsx< / code > 、< code > docs/source-analysis.html< / code > 。< / p >
< / div >
< / article >