Peppa Wake Up(起床啦 - 小猪佩奇英文磨耳朵)
Overview
用户说"起床啦"时,自动播放小猪佩奇英文版音频,并从上次播放位置续播;支持按集数/标题选择章节、手动关闭。播放通过 scripts/play_audio.ps1(WPF MediaPlayer / Media Foundation 引擎)完成,进度每 1.5 秒写入 ~/.workbuddy/peppa-audio/progress.json,因此任何方式中断后都能准确定位续播点。
核心文件
scripts/play_audio.ps1— 后台播放 + 周期性进度写入(必用)scripts/stop_audio.ps1— 停止播放references/episodes.json— 章节目录(index、code、title)references/source-strategy.md— 音频在线获取与本地缓存策略
数据目录(skill 之外):~/.workbuddy/peppa-audio/
- progress.json — {episodeIndex, episodeTitle, position(秒), status, updatedAt}
- current.pid — 正在播放的进程号
- cache/ — 已下载的音频,命名如 S01E01.mp3
指令识别
| 用户说 | 动作 |
|---|---|
| 起床啦 / 开始听 | 从 progress.json 续播 |
| 播放第N集 / S01E05 / 某集标题 | 切到该集,从头或续播该集 |
| 下一集 | 播 episodeIndex+1 |
| 从头开始 / 重播 | position 置 0 播当前集 |
| 进度 / 听到哪了 | 读 progress.json 汇报 |
| 关掉 / 停止 / 不听了 | 停止播放,汇报停止位置 |
播放流程(续播 = "起床啦")
- 读
~/.workbuddy/peppa-audio/progress.json。不存在则默认episodeIndex=0, position=0。
- status 为finished时:表示上一集已自然播完,progress.json 中已是下一集的 index,从 position 0 开始。 - 从
references/episodes.json找到该episodeIndex对应集;同时计算NextEpisodeIndex = (index+1) % 该季总集数。 - 按
references/source-strategy.md确保缓存文件~/.workbuddy/peppa-audio/cache/<code>.mp3存在(首次某集需联网下载,之后离线直用)。 - 后台启动播放(必须用 PowerShell 工具并设
run_in_background: true,不要用 Bash 调 powershell,会被安全检查拦截;同时系统默认执行策略禁止直接&运行脚本,必须用下面的 Bypass 形式):
powershell -NoProfile -ExecutionPolicy Bypass -File "C:\Users\lee\.workbuddy\skills\peppa-wake-up\scripts\play_audio.ps1" -Path "<缓存mp3绝对路径>" -StartOffset <续播秒数> -EpisodeIndex <index> -EpisodeTitle "<标题>" -NextEpisodeIndex <下一集index>
- 等 5 秒后读
progress.json确认status为playing,向用户报告:「正在播放 S01E01 Muddy Puddles,从第 X 分 Y 秒继续」。若为error,按 source-strategy.md 兜底处理。
选章节 / 从头开始 / 下一集
- 计算目标集的 index 与起始 position(选集通常从 0 开始,除非该集已有进度且用户未说"从头")。
- 播放前先调用
stop_audio.ps1停掉当前播放(如有),再按上面第 4 步启动。 - 用户指定了 episodes.json 中没有的集(如第二季):先按 source-strategy.md「扩充章节」更新 episodes.json 再播放。
停止播放(手动关闭)
- 用 PowerShell 工具运行
stop_audio.ps1(前台,同样使用powershell -NoProfile -ExecutionPolicy Bypass -File ...形式)。 - 读
progress.json向用户汇报:「已停止,听到 S01E05 的第 2 分 18 秒,下次说'起床啦'会从这里继续」。
- 进度每 1.5 秒落盘,停止最多误差 1.5 秒,无需额外保存。
注意事项
- 播放脚本必须后台运行(
run_in_background: true),否则会阻塞会话。 - 若用户问"现在放的什么/听到哪了",直接读
progress.json回答,不要重启播放。 - 连续两次"起床啦":第一次已在播放时,第二次直接读进度汇报即可,不要重复启动(可用
current.pid是否存在 + 进程是否存活判断)。 - 音量默认 80,用户要求调大/调小时给
-Volume传 0-100 的值并重启播放。