listen-mode-audio-streaming
当处理听课模式的流式音频、buffering、TTS 请求门禁与播放连续性问题时使用本技能。统一音频来源选择、分段合并策略和请求触发时机。
适合你,如果需要在流式音频场景中处理缓冲和播放问题
/ 下载安装
/ 通过 npx 安装 校验哈希
npx oh-my-skill add hc-tec/learning-agent/listen-mode-audio-streaming/ 通过 bash 安装
curl -fsSL https://oh-my-skill.com/install.sh | bash -s -- hc-tec/learning-agent/listen-mode-audio-streaming/ 已经装过?验证本机副本,不用重装
npx oh-my-skill verify hc-tec/learning-agent/listen-mode-audio-streaming安装目标可用 --agent / --scope 或 --to 明确指定;省略时只会在唯一已存在的 agent 目录上自动选择,零命中或多命中会停止并提示。content_hash 缺失或不一致均拒装。
0GitHub stars
~1.5K上下文体积 · 单文件
索引托管
怎么用
技能原文 SKILL.md
听课模式流式音频
核心规则
is_speakable且暂无可播音频时视为 buffering,不自动跳过。- 音频来源单选:优先
audioTracks,不可播时才回退audio_url/audio_segments。 - 分段去重 key 使用
element_id + position + segment_index,并允许后到分段提升isFinal。
工作流
- 合并增量
audio_segments后再写回状态,不直接全量替换。 - 仅新增当前步骤可播片段时不重置整段播放;结构变化才重启。
- 用户手动切 marker 时立即清除当前 buffering 状态。
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。 - 音频播放 icon 的可见性需受
is_speakable控制:当is_speakable === false时不展示播放按钮。 - 处理
audio_segment/audio_complete时禁止直接把Record<string, unknown>断言为目标类型,必须先做字段级归一化再写入upsertAudioSegment/upsertAudioComplete。 - 用 Storybook 或
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是否一致。 - 阅读/听课模式切换只切换课时展示形态,不应硬断正在进行的
/runSSE;只有重修、离开课时、lesson reset 等真实生命周期结束场景才触发全局 stream stop。 - 进入听课模式后持续扫描当前 lesson 已有正文中
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前,要先过滤尾部终止标点:默认删除句号、逗号、冒号、分号等收尾符号,但保留问号、叹号、省略号,以及成对标点的后半个(如”、)、》)。 - 听课模式组装 item 时,如果 final
element事件只把完整audio_url放在 element 顶层或payload.audio,而当前 item 已经有audioTracks/audio_segments,必须把完整 URL 回填到对应 position 的audioTracks;不要让 Slide 映射层因为优先使用audioTracks而丢掉完整 mp3 URL。 - 当需要在线上显式区分 buffering 卡住原因时,优先把 loading 文案拆成“未收到当前页音频 / 正在加载当前页音频 / 正在等待当前页后续音频片段”三类可配置文案,不要继续只透传单一字符串。
AudioPlayer已经播放过流式audio_segment后,不要在同一播放会话中切到audio_complete.audio_url续播;完整 URL 只用于未来重播或零 segment 缓存回放,否则 mp3 拼接/seek 偏差会导致句首几个字重复。
备注
- 回放疑难问题时优先复用 Storybook 的原始
runfixture,按 SSE 顺序重放data:片段。
按 Apache-2.0 许可原样转载,未经改动 · 在 GitHub 查看 →
评论
登录即可评论;带「已验证安装」的,是发布者名下有本店的安装或持有记录。
…