PrimeBot 启元 Q1 & T1 技能整活工作台
OFFICIAL JUKEBOX · 高阶炫技标杆

示例技能:点歌台(jukebox)

《官方点歌台》—— 联网搜歌 + ffmpeg 转 wav + 自相关算 BPM + 卡点自由舞

😜 调皮课代表大白话划重点(30 秒读懂核心)
这是官方已上架 PrimeHub 市场的高阶参考案例!它展示了怎么接用户点歌参数、怎么对付 CDN 断流做断点续传、怎么用 ffmpeg 把 mp3 转成机器人唯一爱吃的 .wav,甚至用纯标准库算出整首歌的 BPM 节拍并在音乐里排队跳随机舞步!

一个完整真实技能:纯 API 点歌——每次运行联网抓网易云热歌榜 → 随机点一首 → gdstudio API 搜+下载(128k)→ ffmpeg 转 wav → 离线节拍分析(每首歌现场算 BPM, 不写死任何节奏)→ 音乐起 → 舞步按小节在节拍网格上持续随机触发 → 音乐停谢幕。

已上架 PrimeHub(搜索「点歌台」)。

点歌方式(优先级从高到低)

  1. 用户点名(真点歌):机器人把用户说的话传进技能(argv 或环境变量 JUKEBOX_REQUEST),代码剥掉「放/来一首/我想听」等口癖取歌名 → 原样搜索下载, 点名优先、不随机换;点名的歌搜不到会播报一声再从热歌榜换。
  2. 固定歌单(可选):media/songlist.txt 一行一首「歌名 歌手」,或 src/main.py 顶部 PLAYLIST 加歌 → re-pack 上传后机器人只跳这个单子。
  3. 兜底(默认):每次运行联网抓热歌榜随机抽(不重样,记录在 /tmp/jukebox_history.txt),搜不到/下不动自动换下一首重试。

入口通道以真机验证为准(lumina 是否把唤醒词后的语句传给 main.py)——代码里两条都接了。

看什么(学习点)

文件位置学什么
load_songlist() / pick_song()API 点歌入口:热歌榜随机 + 不重样 + 可选固定歌单
find_song() / download_song()联网取资源:urllib + 重试 + ffmpeg 转码(板载只吃 wav)
analyze_beats()纯 stdlib 离线节拍分析:能量包络 + 自相关 → BPM
speak()TTS 轮询等真实播完的标准写法(无完成回调平台必用)
music_really_over()音频状态抖动的滤波处理(长音频状态 1↔2 抖动)
主循环 play_animation(anim, interrupt=False)音频持续时动作排队执行的唯一正确姿势
MOVE_POOL + next_move()持续随机动作池(避免重复上一拍)

跑起来

打包:python3 pack.py example-jukebox;调试按 SKILL_PUBLISH_GUIDE.md 第 5 步。 MAX_DANCE_SEC(默认 90s)保护电机;MOVE_POOL 换舞池动作。