fix: support multilingual audio transcription

This commit is contained in:
2026-05-22 09:26:59 +08:00
parent eb4347a843
commit 642793500f
7 changed files with 69 additions and 35 deletions

View File

@@ -569,7 +569,7 @@
<section id="pipeline" data-search>
<h2>业务管线</h2>
<p>当前产品方向已收窄为“信息流广告快速复刻”:主界面左侧是拉满工作台可用高度的 65px 胶囊工具条,鼠标移入或键盘聚焦会从侧边滑出素材输入面板,点击素材任务按钮可固定展开,右侧主画布是信息流复刻工作表;工作台已取消 1800x1000 固定画布和整页 <code>zoom</code> 缩放,改为正常流式桌面容器,宽度跟随浏览器展开,只保留 1280px 最低操作宽度防止核心表格被压烂,避免小数缩放造成文字发虚和比例失衡。后台仍按 01-09 流程顺序计算素材任务、源视频、音频文案、抽帧、主体资产、产品资产、分镜文案、三字段规划和视频候选这些状态,但这些判断不再默认显现在工作区顶部,避免状态提示挤占首屏操作空间。用户粘贴 TK 链接或上传视频后点击“开始分析”,系统自动下载源视频;下载完成后并行启动音频文案路和视频视觉路。音频文案路提取原音频文案/字幕,分析讲话人、语速节奏、背景音乐/环境声/音效,并为后续新口播和分镜文案提供时间轴;视频视觉路同步抽取参考帧。源视频工作区主体链路是“上方参考帧池 + 转换层、下方主体元素结果栏”:参考帧池只作为竖向原始参考;转换层改为轻量对话式生图确认区,参考图可通过左侧缩略图 <code>+</code>、参考帧拖拽、胶片拖拽或本地图片拖入进入转换层,用户选择 GPT/Gemini 套件后先分析参考图,再在下方消息输入区发送复刻、创新、卡通、数量和画面要求;系统返回英文出图 prompt 后不再自动弹窗,发送区主按钮直接切换为“确认生成 N 张”,用户点击后才调用主体生成并把结果送到下方主体元素结果栏。主体元素结果栏保留已有套图输出、文件夹分组、单张重生、删除和 hover 预览逻辑,空态只保留紧凑提示,不再占据右侧整列。旧下方主体模板库不再作为主路径。波形下方的画面胶片由前端临时从源视频截取,密度可调,点击只跳转原视频时间点,双击或拖入参考帧池才调用手动抽帧接口正式写入关键帧;已写入的胶片显示“已添加”,相同素材、相同密度和时长下会复用内存缓存,避免返回页面时重复扫视频。产品图上传后独立形成产品资产包:自动识别视角、左右/上下/内外侧、结构点、比例和风险,并补缺角度。最终分镜规划按逐句时间轴把文案、主体元素和产品资产汇合;每条分镜默认是左侧“文案 / 场景一句话 / 人物+产品+动作”三字段、右侧横向视频候选轨。客户可直接改中文镜像,前端会调用改写/翻译链路自动优化对应英文主值;单条和整片都可选择生成数量,整片按行排队提交。视频候选提交后立即写入当前任务,完成后自动回填 mp4不需要用户另点“保存”候选卡的普通点击只用于打开预览右上角提供显式下载按钮候选选择不再作为默认点击语义。首尾帧、视觉规划、产品出现方式等细节保留在高级抽屉和后端自动展开逻辑里不再作为客户默认闸门。</p>
<p>当前产品方向已收窄为“信息流广告快速复刻”:主界面左侧是拉满工作台可用高度的 65px 胶囊工具条,鼠标移入或键盘聚焦会从侧边滑出素材输入面板,点击素材任务按钮可固定展开,右侧主画布是信息流复刻工作表;工作台已取消 1800x1000 固定画布和整页 <code>zoom</code> 缩放,改为正常流式桌面容器,宽度跟随浏览器展开,只保留 1280px 最低操作宽度防止核心表格被压烂,避免小数缩放造成文字发虚和比例失衡。后台仍按 01-09 流程顺序计算素材任务、源视频、音频文案、抽帧、主体资产、产品资产、分镜文案、三字段规划和视频候选这些状态,但这些判断不再默认显现在工作区顶部,避免状态提示挤占首屏操作空间。用户粘贴 TK 链接或上传视频后点击“开始分析”,系统自动下载源视频;下载完成后并行启动音频文案路和视频视觉路。音频文案路自动识别中文、英文和其他多语言原音频文案/字幕,统一补齐中文镜像,分析讲话人、语速节奏、背景音乐/环境声/音效,并为后续新口播和分镜文案提供时间轴;视频视觉路同步抽取参考帧。源视频工作区主体链路是“上方参考帧池 + 转换层、下方主体元素结果栏”:参考帧池只作为竖向原始参考;转换层改为轻量对话式生图确认区,参考图可通过左侧缩略图 <code>+</code>、参考帧拖拽、胶片拖拽或本地图片拖入进入转换层,用户选择 GPT/Gemini 套件后先分析参考图,再在下方消息输入区发送复刻、创新、卡通、数量和画面要求;系统返回英文出图 prompt 后不再自动弹窗,发送区主按钮直接切换为“确认生成 N 张”,用户点击后才调用主体生成并把结果送到下方主体元素结果栏。主体元素结果栏保留已有套图输出、文件夹分组、单张重生、删除和 hover 预览逻辑,空态只保留紧凑提示,不再占据右侧整列。旧下方主体模板库不再作为主路径。波形下方的画面胶片由前端临时从源视频截取,密度可调,点击只跳转原视频时间点,双击或拖入参考帧池才调用手动抽帧接口正式写入关键帧;已写入的胶片显示“已添加”,相同素材、相同密度和时长下会复用内存缓存,避免返回页面时重复扫视频。产品图上传后独立形成产品资产包:自动识别视角、左右/上下/内外侧、结构点、比例和风险,并补缺角度。最终分镜规划按逐句时间轴把文案、主体元素和产品资产汇合;每条分镜默认是左侧“文案 / 场景一句话 / 人物+产品+动作”三字段、右侧横向视频候选轨。客户可直接改中文镜像,前端会调用改写/翻译链路自动优化对应英文主值;单条和整片都可选择生成数量,整片按行排队提交。视频候选提交后立即写入当前任务,完成后自动回填 mp4不需要用户另点“保存”候选卡的普通点击只用于打开预览右上角提供显式下载按钮候选选择不再作为默认点击语义。首尾帧、视觉规划、产品出现方式等细节保留在高级抽屉和后端自动展开逻辑里不再作为客户默认闸门。</p>
<div class="pipeline">
<div class="step"><div class="num">01</div><h3>素材输入</h3><p>有当前素材任务即通过;输入框只负责创建或切换任务。</p></div>
<div class="step"><div class="num">02</div><h3>源视频下载</h3><p><code>job.video_url</code> 存在即通过;<code>created/downloading</code> 视为运行中。公开视频默认不带 cookies 下载;只有 TikTok 明确要求登录态时才配置 <code>YTDLP_COOKIES_FILE</code>,生产容器禁止使用 <code>YTDLP_COOKIES_FROM_BROWSER=chrome</code></p></div>
@@ -797,7 +797,7 @@ api/main.py
</div>
<div class="card">
<h3>AudioScript</h3>
<p>第一步音频解析的结构化产物。<code>pipeline_transcribe</code> 提取 <code>audio.wav</code> 后先保存原始英文转写、中文翻译、讲话人画像、口播节奏和背景音乐/环境声/音效分析。<code>rewritten_text</code> 是英文新口播,<code>rewritten_text_zh</code> 只作为团队审稿镜像;<code>voice_url</code> 等字段仍保留给后续新配音阶段。</p>
<p>第一步音频解析的结构化产物。<code>pipeline_transcribe</code> 提取 <code>audio.wav</code> 后先保存原语言转写(支持中文、英文和其他多语言)、中文镜像、讲话人画像、口播节奏和背景音乐/环境声/音效分析。<code>rewritten_text</code> 是英文新口播,<code>rewritten_text_zh</code> 只作为团队审稿镜像;<code>voice_url</code> 等字段仍保留给后续新配音阶段。</p>
<pre>AudioScript {
status: idle | rewriting | completed | failed,
source_text,
@@ -1006,7 +1006,7 @@ ProductRefStateItem {
</thead>
<tbody>
<tr><td>网页登录</td><td><code>POST /auth/login</code><code>GET /auth/check</code><code>POST /auth/logout</code></td><td><code>web/app/login/page.tsx</code>、Nginx <code>auth_request</code></td><td>登录页提交账号密码到 <code>/api/auth/login</code>,后端设置 HttpOnly 会话 Cookie生产 Nginx 对工作台和 <code>/api/</code><code>/auth/check</code> 做统一校验,未登录页面跳 <code>/login/</code>API 返回 JSON 401。</td></tr>
<tr><td>运行配置 / 模型标注</td><td><code>GET /health</code></td><td><code>getRuntimeHealth</code><code>ModelTrace</code></td><td>返回 <code>models</code>ASR、<code>asr_language</code><code>asr_base_url</code><code>asr_remote_enabled</code><code>asr_local_fallback_enabled</code><code>asr_audio_fallback_enabled</code><code>faster_whisper</code>、本机 ASR、ASR fallback、翻译、GPT 改写、GPT 画面理解、产品视角识别 <code>product_view</code>、主图像模型 <code>gpt-image-2</code>、图片故障兜底 <code>image_fallbacks</code>、短时熔断状态 <code>image_circuit</code>、主体 6 视图模型链路、Azure OpenAI TTS、视频别名和 Seedance 服务商。当前 <code>REWRITE_MODEL</code><code>AUDIO_REWRITE_MODEL</code><code>VISION_MODEL</code> 默认使用 <code>gpt-4o</code>;如果旧环境变量仍写 <code>gemini-*</code>,后端会归一化回 <code>GPT_TEXT_MODEL</code> / <code>REWRITE_MODEL</code>。语音只走 Azure OpenAI TTS<code>models.voice_tts_paths</code> 会回传当前尝试的语音路径,方便区分路径错误和语音服务不可用。前端所有当前主路径里会调用模型的按钮旁显示模型名,点击弹出小窗口查看模型链路和输入输出逻辑;不返回 API Key 或敏感凭证。</td></tr>
<tr><td>运行配置 / 模型标注</td><td><code>GET /health</code></td><td><code>getRuntimeHealth</code><code>ModelTrace</code></td><td>返回 <code>models</code>ASR、<code>asr_language</code>(默认 <code>auto</code>,表示中文/英文/多语言自动识别)<code>asr_base_url</code><code>asr_remote_enabled</code><code>asr_local_fallback_enabled</code><code>asr_audio_fallback_enabled</code><code>faster_whisper</code>、本机 ASR、ASR fallback、翻译、GPT 改写、GPT 画面理解、产品视角识别 <code>product_view</code>、主图像模型 <code>gpt-image-2</code>、图片故障兜底 <code>image_fallbacks</code>、短时熔断状态 <code>image_circuit</code>、主体 6 视图模型链路、Azure OpenAI TTS、视频别名和 Seedance 服务商。当前 <code>REWRITE_MODEL</code><code>AUDIO_REWRITE_MODEL</code><code>VISION_MODEL</code> 默认使用 <code>gpt-4o</code>;如果旧环境变量仍写 <code>gemini-*</code>,后端会归一化回 <code>GPT_TEXT_MODEL</code> / <code>REWRITE_MODEL</code>。语音只走 Azure OpenAI TTS<code>models.voice_tts_paths</code> 会回传当前尝试的语音路径,方便区分路径错误和语音服务不可用。前端所有当前主路径里会调用模型的按钮旁显示模型名,点击弹出小窗口查看模型链路和输入输出逻辑;不返回 API Key 或敏感凭证。</td></tr>
<tr><td>历史列表</td><td><code>GET /jobs</code></td><td><code>listJobs</code></td><td>所有 job 精简列表id/url/status/thumbnail/mtime…按 state.json mtime 倒序。前端 URL 无 <code>?job=</code> 时拉它回填全部历史;带 <code>limit</code> 可截断。</td></tr>
<tr><td>创建任务</td><td><code>POST /jobs</code></td><td><code>createJob</code></td><td>提交 TK 链接,后台开始下载;前端“开始”队列会在 downloaded 后自动触发音频解析。下载阶段默认不带 cookies生产环境必须显式保持 <code>YTDLP_COOKIES_FILE=</code><code>YTDLP_COOKIES_FROM_BROWSER=</code> 为空,避免容器内误读被打进镜像的开发 <code>api/.env</code>。只有 TikTok 明确要求登录态时,才把宿主机 <code>./secrets/tiktok_cookies.txt</code> 挂载进容器并设置 <code>YTDLP_COOKIES_FILE=/run/secrets/tiktok_cookies.txt</code>。生产容器没有 Chrome cookies 数据库,不能配置 <code>YTDLP_COOKIES_FROM_BROWSER=chrome</code></td></tr>
<tr><td>一键出片终端</td><td><code>POST /agent-runs</code><br><code>GET /agent-runs/{id}</code><br><code>GET /agent-runs/{id}/final.mp4</code><br><code>GET /agent-runs/{id}/contact.jpg</code></td><td><code>web/app/agent/page.tsx</code></td><td>快速出片页的唯一主接口。前端提交 TikTok 链接和最多 6 张产品图;后端创建 <code>Job</code><code>AgentRun</code>后台执行下载、产品图归一化、透明骨架主体参考复制、12 段镜头计划、视频生成、失败镜头自动重跑一次、审片接触表和 ffmpeg 最终合成。前端只轮询日志和结果,不直接拥有模型执行权。</td></tr>
@@ -1014,7 +1014,7 @@ ProductRefStateItem {
<tr><td>上传视频</td><td><code>POST /jobs/upload</code></td><td><code>uploadJob</code></td><td>保存 source.mp4然后同样进入下载完成状态当前上传后也加入第一步队列下载完成后自动解析音频。</td></tr>
<tr><td>删除输入视频</td><td><code>DELETE /jobs/{id}</code></td><td><code>deleteJob</code></td><td>从任务队列、URL 和磁盘 <code>jobs/&lt;id&gt;</code> 目录移除整个 job包括源视频、关键帧、元素提取图和生成视频。</td></tr>
<tr><td>解析视频</td><td><code>POST /jobs/{id}/analyze?frames=&amp;target=&amp;mode=&amp;quality=</code></td><td><code>analyzeJob</code></td><td>抽参考帧能力。当前开始流程会在视频下载完成后自动调用一次,默认 <code>frames=12</code><code>target=motion</code><code>quality=accurate</code><code>mode=replace</code>,形成全局动作/节奏参考帧池;原版视频旁的“抽参考 12 帧”也会用同一参数显式重跑。<code>target</code> 仍支持透明骨架人、综合、清晰主体、转场变化、表情瞬间、动作峰值。</td></tr>
<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>;远端启用时把 <code>audio.wav</code> 上传到 <code>ASR_BASE_URL</code> 的 OpenAI Audio Transcriptions 兼容接口,用 <code>ASR_MODEL</code> 提取原始文案,并传 <code>ASR_LANGUAGE=en</code> 降低英文素材延迟。微软官方路径包括 <code>/openai/deployments/{deployment}/audio/transcriptions?api-version=...</code><code>/openai/v1/audio/transcriptions?api-version=preview</code>;当前 SKG 网关探测这些路径均未返回可用 ASR<code>gpt-4o-transcribe</code> 返回 <code>DeploymentNotFound</code>。当前生产因此复制本地成功策略:<code>ASR_REMOTE_ENABLED=false</code><code>ASR_LOCAL_FALLBACK_ENABLED=true</code>,直接走容器内 CPU 版 <code>faster-whisper</code> 生成真实逐句时间轴;<code>ASR_AUDIO_FALLBACK_ENABLED=false</code>,避免 Gemini 多模态假字幕。后端会拒绝重复文本、逐秒假字幕或覆盖率过低的结果。中文翻译<code>TRANSLATE_MODEL</code> 按 ASR 段落补齐,失败时保留原文时间轴且中文可为空。再用 <code>ASR_FALLBACK_MODEL</code> 读取 <code>audio.wav</code> 和已有转写时间轴,多模态音频分析讲话人、语速节奏、停顿、背景音乐/环境声/音效,写入 <code>speaker_profile</code><code>rhythm_profile</code><code>background_audio_profile</code>;若模型分析失败,则用转写段落、时长和语速做本地估算兜底。当前第一步不默认生成 SKG 新口播和 Azure OpenAI 配音。失败后只要后台 worker 不在运行,就允许重新触发;前端也不再把失败状态下残留的半成品 transcript 当成音频完成。</td></tr>
<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>;远端启用时把 <code>audio.wav</code> 上传到 <code>ASR_BASE_URL</code> 的 OpenAI Audio Transcriptions 兼容接口,用 <code>ASR_MODEL</code> 提取原始文案<code>ASR_LANGUAGE</code> 默认空值/auto不传固定语种让远端和本地 ASR 自动识别中文、英文和其他多语言;只有确认素材固定语种时才填写 ISO-639-1 代码。微软官方路径包括 <code>/openai/deployments/{deployment}/audio/transcriptions?api-version=...</code><code>/openai/v1/audio/transcriptions?api-version=preview</code>;当前 SKG 网关探测这些路径均未返回可用 ASR<code>gpt-4o-transcribe</code> 返回 <code>DeploymentNotFound</code>。当前生产因此复制本地成功策略:<code>ASR_REMOTE_ENABLED=false</code><code>ASR_LOCAL_FALLBACK_ENABLED=true</code>,直接走容器内 CPU 版多语言 <code>faster-whisper</code> 生成真实逐句时间轴;<code>ASR_AUDIO_FALLBACK_ENABLED=false</code>,避免 Gemini 多模态假字幕。后端会拒绝重复文本、逐秒假字幕或覆盖率过低的结果,质量校验支持中文等非空格分词文本,不再按英文字符集误判。中文镜像<code>TRANSLATE_MODEL</code> 按 ASR 原语言段落补齐,原文已经是中文时保留为简体中文镜像;失败时保留原文时间轴且中文可为空。再用 <code>ASR_FALLBACK_MODEL</code> 读取 <code>audio.wav</code> 和已有转写时间轴,多模态音频分析讲话人、语速节奏、停顿、背景音乐/环境声/音效,写入 <code>speaker_profile</code><code>rhythm_profile</code><code>background_audio_profile</code>;若模型分析失败,则用转写段落、时长和语速做本地估算兜底。当前第一步不默认生成 SKG 新口播和 Azure OpenAI 配音。失败后只要后台 worker 不在运行,就允许重新触发;前端也不再把失败状态下残留的半成品 transcript 当成音频完成。</td></tr>
<tr><td>分镜脚本改写</td><td><code>POST /jobs/{id}/script/rewrite</code></td><td><code>rewriteStoryboardScript</code></td><td>根据原英文参考文案、当前英文新口播、英文 role enum、时间段和作者想法改写英文口播作者想法若含中文后端会先经 <code>_ensure_english</code> 兜底翻译。<code>mode=segment</code> 只改一段;<code>mode=all</code> 一次改完整片,要求整片前后连贯。后端按 <code>AUDIO_REWRITE_MODEL</code><code>ASR_FALLBACK_MODEL</code><code>TRANSLATE_MODEL</code> 依次尝试,全部失败时用英文本地模板保留可编辑文案。接口返回 <code>items[index,text,text_zh]</code>,其中 <code>text</code> 是写入模型链路的英文主值,<code>text_zh</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> 等路径。当前第一步不默认生成该文件。</td></tr>
@@ -1155,6 +1155,18 @@ ProductRefStateItem {
<h2>变更记录</h2>
<p>这个记录不是 git log 的替代品。它记录“产品理解发生了什么变化、影响了哪些源码、你以后描述需求时该怎么说”。后续每次改功能都要补一条。</p>
<div class="changelog">
<article class="change">
<header>
<h3>2026-05-22 · 音频解析改为中文和多语言自动识别</h3>
<span class="tag blue">ASR</span>
<span class="tag green">Audio</span>
</header>
<div class="body">
<p><strong>问题:</strong>音频解析默认把 <code>ASR_LANGUAGE</code> 固定为 <code>en</code>,本地容器兜底也使用 <code>faster-whisper tiny.en</code> 并强制 <code>language="en"</code>;中文或其他语言视频容易被压成英文识别路径,且质量校验按英文字符集计算重复率,会误伤中文字幕。</p>
<p><strong>改动:</strong><code>api/main.py</code><code>ASR_LANGUAGE</code> 默认改为空值/auto远端和 <code>faster-whisper</code> 都只在显式配置语种时才传语言提示;本地 <code>faster-whisper</code> 默认模型改为多语言 <code>base</code>Gemini 音频兜底也要求保留原语种而不是翻译成英文。ASR 质量校验改为 Unicode 文本 key翻译 prompt 改为“原语言字幕 → 简体中文”,中文原文会作为中文镜像保留。</p>
<p><strong>影响:</strong>后续音频解析默认支持中文、英文和其他多语言原文识别,分镜时间轴的 <code>en</code> 字段实际承载“原语言文案”,<code>zh</code> 字段承载中文镜像。若某个素材明确固定语种,可通过 <code>ASR_LANGUAGE=zh</code><code>en</code> 等 ISO-639-1 代码强制识别。</p>
</div>
</article>
<article class="change">
<header>
<h3>2026-05-21 · 分镜视频候选点击改为预览下载</h3>
@@ -1717,7 +1729,7 @@ ProductRefStateItem {
</header>
<div class="body">
<p><strong>问题:</strong>本地音频解析成功时实际链路是远端失败后落到 <code>mlx_whisper</code>,而生产强制 <code>ASR_BASE_URL=https://ai.skg.com/azure/v1</code> + <code>ASR_MODEL=gpt-4o-transcribe</code> 且关闭本地兜底。生产探测官方 Azure OpenAI 音频路径 <code>/openai/v1/audio/transcriptions?api-version=preview</code><code>/openai/deployments/{deployment}/audio/transcriptions?api-version=...</code> 仍不可用,当前部署名返回 <code>DeploymentNotFound</code></p>
<p><strong>改动:</strong>远端 ASR 请求新增 <code>ASR_LANGUAGE</code>,默认 <code>en</code>,用于按官方建议降低英文素材延迟;翻译请求也套用 <code>ASR_TIMEOUT_SECONDS</code>。生产配置临时改成 <code>ASR_REMOTE_ENABLED=false</code><code>ASR_LOCAL_FALLBACK_ENABLED=true</code><code>ASR_AUDIO_FALLBACK_ENABLED=false</code>,云端用容器内 <code>faster-whisper tiny.en</code> 复制本地“真实本机转写”路径。</p>
<p><strong>改动:</strong>当时远端 ASR 请求新增 <code>ASR_LANGUAGE</code> 并固定英文素材优先;翻译请求也套用 <code>ASR_TIMEOUT_SECONDS</code>。生产配置临时改成 <code>ASR_REMOTE_ENABLED=false</code><code>ASR_LOCAL_FALLBACK_ENABLED=true</code><code>ASR_AUDIO_FALLBACK_ENABLED=false</code>,云端用容器内 <code>faster-whisper</code> 复制本地“真实本机转写”路径。2026-05-22 后该路径已改为默认 <code>auto</code> 语种和多语言模型。</p>
<p><strong>影响:</strong>音频解析不再卡在不存在的 Azure deployment当前云端 CPU 实测同一失败 job 的 <code>audio.wav</code> 可在约 13.6 秒转出 17 段。等 SKG 网关提供真实 Azure ASR deployment 后,再把 <code>ASR_REMOTE_ENABLED=true</code> 并恢复对应部署名。</p>
</div>
</article>