Manusで任意のスキルを実行
ワンクリックで
ワンクリックで
ワンクリックでManusで任意のスキルを実行
始める$pwd:
listen-mode-audio-streaming
// 当处理听课模式的流式音频、buffering、TTS 请求门禁与播放连续性问题时使用本技能。统一音频来源选择、分段合并策略和请求触发时机。
$ git log --oneline --stat
stars:290
forks:107
updated:2026年5月19日 05:14
SKILL.md
// 当处理听课模式的流式音频、buffering、TTS 请求门禁与播放连续性问题时使用本技能。统一音频来源选择、分段合并策略和请求触发时机。
当 cook-web 需要调整 Next.js App Router 全局或路由级错误兜底页时使用本技能。错误页应直接展示错误名称、message、digest、cause、URL 和可用 stack,避免只提示用户查看控制台。
当修复 ai-shifu 聊天页在移动端与桌面端布局判定不一致的问题时使用本技能。基于真实可见视口宽度而不是仅 `#root.clientWidth` 计算 `frameLayout`,在 `resize` 与 `visualViewport.resize` 时同步,并在断点纠正后关闭过期的移动端抽屉状态。
当 ai-shifu 聊天流从 block 粒度向 element 粒度演进,或历史记录与 SSE 渲染一致性出现问题时使用本技能。统一 element_bid 渲染键、兼容旧字段并收敛 AskBlock 归并逻辑。
当 learner 端听课模式需要接入 markdown-flow-ui 的移动端播放器新能力时使用本技能。覆盖横竖屏状态透传、自定义横屏 header、以及播放器文案国际化接入。
当 cook-web 页面在浏览器 fullscreen 场景下需要展示基于 Dialog 的支付弹窗、设置弹窗或业务弹层时,使用本技能排查 portal 容器是否落在全屏节点外。
当 cook-web 需要新增共享 loading 动画时,使用本技能统一公共组件目录、非破坏性导出方式,以及圆点序列动画的可配置实现。
| name | listen-mode-audio-streaming |
| description | 当处理听课模式的流式音频、buffering、TTS 请求门禁与播放连续性问题时使用本技能。统一音频来源选择、分段合并策略和请求触发时机。 |
is_speakable 且暂无可播音频时视为 buffering,不自动跳过。audioTracks,不可播时才回退 audio_url/audio_segments。element_id + position + segment_index,并允许后到分段提升 isFinal。audio_segments 后再写回状态,不直接全量替换。run 请求体 listen 必须跟随当前真实听课状态:只有 learningMode === 'listen' 且课程 tts_enabled 可用时才发送 listen=true;阅读模式即使课程支持听课也必须发送 listen=false。LIKE_STATUS 仅表示流结束信号,TTS 还需校验 is_speakable 或已有可播音频。generated-blocks/:id/tts,禁止 onStepChange 自动补拉。listen-mode 映射 elementList 时显式透传 isAudioStreaming。type/error 或 event_type/error,立即弹出 destructive toast。is_speakable 控制:当 is_speakable === false 时不展示播放按钮。audio_segment/audio_complete 时禁止直接把 Record<string, unknown> 断言为目标类型,必须先做字段级归一化再写入 upsertAudioSegment/upsertAudioComplete。markdown-flow-ui 回放 data.json 排查时,elementList 的组装路径必须和 ai-shifu 听课模式保持同构,禁止额外做 story 专用的音频归属重排补偿。elementList 时,若内容本身是 <iframe data-tag="video" ...></iframe> 形式的视频 iframe,即使后端 element_type 仍是通用类型,也要优先把 slide element 的 type 推断为 video。record 历史接口时,若 payload.audio.subtitle_cues 存在,必须在 elementList 中显式透传为 subtitle_cues,不要只保留 content 导致字幕时间轴元数据在渲染层丢失。run 的 audio_segment 若已生成当前累计字幕 cue,必须同步透传到对应 element patch 的 payload.audio.subtitle_cues,不要等到 audio_complete 才返回字幕。tts_enabled 虽然沿用后端字段名,但前端产品语义视为“听课模式开关”;改动作者端文案或 learner 端默认模式时,必须同时检查设置页文案、课程信息映射和 /c/... 布局层默认 learningMode 是否一致。/run SSE;只有重修、离开课时、lesson reset 等真实生命周期结束场景才触发全局 stream stop。is_speakable !== false 且有有效 element_bid 的内容块;历史回放内容天然可补,流式 /run 新内容必须等后端在原有事务 commit 之后发出 audio_backfill_ready 才能调用 generated-blocks/:id/tts?listen=true,禁止用尚未提交的 streaming element 直接补音频。补生成对同一 generated block 做 in-flight 去重;第一段音频可播后允许进入播放,整条 TTS SSE 继续补齐后续 position;没有可补正文或补音频失败时,不再提示重修或强制切回阅读,只保持当前模式并用 toast/缓冲态反馈。subtitle_cues[].text 透传给 markdown-flow-ui/slide 前,要先过滤尾部终止标点:默认删除句号、逗号、冒号、分号等收尾符号,但保留问号、叹号、省略号,以及成对标点的后半个(如 ”、)、》)。element 事件只把完整 audio_url 放在 element 顶层或 payload.audio,而当前 item 已经有 audioTracks/audio_segments,必须把完整 URL 回填到对应 position 的 audioTracks;不要让 Slide 映射层因为优先使用 audioTracks 而丢掉完整 mp3 URL。AudioPlayer 已经播放过流式 audio_segment 后,不要在同一播放会话中切到 audio_complete.audio_url 续播;完整 URL 只用于未来重播或零 segment 缓存回放,否则 mp3 拼接/seek 偏差会导致句首几个字重复。run fixture,按 SSE 顺序重放 data: 片段。