前言
在使用 SU-03T 离线语音模组开发语音控制音乐播放功能时,一个常见的需求是:通过语音命令实现"上一首"、"下一首"等切歌功能。很多开发者初次接触时会疑惑------能否不借助外部 MP3 模块,直接在 SU-03T 内部实现这个功能?
答案是可以 。通过 SU-03T 平台的变量控制功能,我们可以实现音乐播放列表的管理和切换功能。本文将详细讲解实现方法。
一、应用场景分析
1.1 典型需求
用户真实反馈的需求场景:
"SU-03T这个模块可以不借助MP3模块实现切歌上一首下一首吗?"
"我想的是我这个指令里面有很多首歌,命令下一首他就实现第一首,再命令下一首就实现库里面的第二首"
核心需求拆解:
- 预设多首音频文件(如音乐、语音提示等)
- 通过语音命令切换不同的音频
- 记住当前播放位置,支持顺序切换
- 无需外部 MP3 模块或复杂硬件
1.2 解决方案概述
SU-03T 平台提供了变量功能,可以存储和传递数值状态。通过结合:
- 变量存储:记录当前播放的曲目编号
- 命令词控制:触发切歌动作
- 变量引用:根据变量值选择对应的回复语
即可实现完整的播放列表控制功能。
二、实现原理
2.1 变量功能简介
SU-03T 平台中的变量可以:
- 存储整数值(0-65535)
- 通过命令词修改变量值
- 在回复语中引用变量值
- 跨命令保持状态
2.2 逻辑流程图
┌─────────────┐
│ 上电初始化 │ → 变量 "track_num" = 1
└─────────────┘
│
▼
┌─────────────┐ "下一首" ┌─────────────┐
│ 等待语音命令 │ ─────────────→│ track_num++ │
└─────────────┘ └─────────────┘
│ │
│ "播放第一首" ▼
│ ┌─────────────┐
└───────────────────────→│ track_num=1 │
└─────────────┘
│
▼
┌───────────────┐
│ 播放对应音频 │
│ 根据track_num │
└───────────────┘
三、平台配置步骤
3.1 创建变量
- 进入智能公元平台,选择 离线语音 → SU-03T
- 在左侧导航栏找到 变量管理
- 点击"添加变量",创建如下变量:
| 变量名 | 类型 | 初始值 | 说明 |
|---|---|---|---|
track_num |
整数 | 1 | 当前曲目编号 |
total_tracks |
整数 | 5 | 总曲目数量(可选) |
3.2 配置命令词
命令词1:播放第一首
| 配置项 | 值 |
|---|---|
| 命令词 | 播放第一首 |
| 控制详情 | 设置变量 track_num = 1 |
| 回复语 | "正在播放第一首歌曲" |
| 音频/个性化 | 上传第一首音频文件 |
命令词2:下一首
| 配置项 | 值 |
|---|---|
| 命令词 | 下一首 |
| 控制详情 | 设置变量 track_num = track_num + 1 |
| 条件判断 | 如果 track_num > total_tracks,则 track_num = 1(循环) |
| 回复语 | "正在播放第{track_num}首歌曲" |
命令词3:上一首
| 配置项 | 值 |
|---|---|
| 命令词 | 上一首 |
| 控制详情 | 设置变量 track_num = track_num - 1 |
| 条件判断 | 如果 track_num < 1,则 track_num = total_tracks(循环) |
| 回复语 | "正在播放第{track_num}首歌曲" |
3.3 配置变量引用播放
由于 SU-03T 平台回复语系统不支持直接根据变量值选择不同音频,需要采用多命令词的方式:
方案A:多命令词实现(推荐)
为每个曲目创建独立的命令词:
| 命令词 | 变量操作 | 音频文件 |
|---|---|---|
播放第一首 |
track_num=1 | audio1.mp3 |
播放第二首 |
track_num=2 | audio2.mp3 |
播放第三首 |
track_num=3 | audio3.mp3 |
| ... | ... | ... |
然后"下一首"命令通过跳转功能调用对应的命令词:
下一首:
track_num = track_num + 1
如果 track_num > 总数,则 track_num = 1
跳转到:播放第{track_num}首
方案B:串口控制外部播放
如果需要灵活控制更多音频,可以使用 SU-03T 的串口输出功能,配合 MCU 或外部模块:
-
SU-03T 通过串口发送曲目编号
-
外部 MCU 接收后控制音频播放
SU-03T 串口输出格式示例:
CMD_PLAY_TRACK:1\n
CMD_PLAY_TRACK:2\n
四、完整配置示例
4.1 五首歌曲播放列表配置
假设有5首歌曲,配置如下:
初始化配置
在事件触发 或开机播报中设置:
变量 track_num = 1
命令词配置表
| 命令词 | 变量操作 | 跳转目标 | 音频 |
|---|---|---|---|
下一首 |
track_num+1, 若>5则=1 | 播放第N首 | - |
上一首 |
track_num-1, 若<1则=5 | 播放第N首 | - |
播放第一首 |
track_num=1 | - | song1.mp3 |
播放第二首 |
track_num=2 | - | song2.mp3 |
播放第三首 |
track_num=3 | - | song3.mp3 |
播放第四首 |
track_num=4 | - | song4.mp3 |
播放第五首 |
track_num=5 | - | song5.mp3 |
4.2 添加随机播放功能
如果需要"随机播放"功能,可以添加:
| 命令词 | 变量操作 | 说明 |
|---|---|---|
随机播放 |
track_num = 随机数(1-5) | 跳转到播放第N首 |
五、高级应用技巧
5.1 播放模式切换
可以添加"循环模式"、"单曲循环"等状态变量:
c
// 变量定义
play_mode = 0 // 0:顺序播放 1:循环播放 2:随机播放
is_repeat = 0 // 0:不重复 1:单曲重复
5.2 音量记忆
记录用户设置的音量:
| 命令词 | 变量操作 | 说明 |
|---|---|---|
音量大一点 |
volume = volume + 10 | 限制最大100 |
音量小一点 |
volume = volume - 10 | 限制最小0 |
恢复默认音量 |
volume = 50 | 恢复默认 |
5.3 播放进度记忆(需外部配合)
如果需要断点续播,需要:
- MCU 记录播放进度
- SU-03T 发送播放/暂停指令时传递进度信息
六、常见问题解答
Q1:为什么不直接用 MP3 模块?
A:使用 SU-03T 内置音频功能的优点:
- 硬件更简单,减少外部模块
- 成本更低
- 功耗更小
- 系统集成度更高
Q2:可以支持多少首音频?
A:
- 受限于 SU-03T 的 Flash 存储空间(2MB)
- 一般可存储 5-10 首短音频或提示音
- 如需更多音频,建议使用外部存储或串口控制方案
Q3:如何实现无缝切换?
A:
- 设置音频的"退出回复"为立即执行
- 在下一首命令中先停止当前播放
- 或使用串口通知外部 MCU 处理切换逻辑
Q4:变量断电后会保存吗?
A:
- SU-03T 的普通变量断电后不保存
- 如需记忆功能,需要通过串口将状态保存到外部 MCU
七、完整代码示例
7.1 变量初始化(平台配置)
变量名: track_num
类型: 整数
初始值: 1
变量名: total_tracks
类型: 整数
初始值: 5
7.2 命令词JSON配置示例
json
{
"commands": [
{
"name": "下一首",
"words": ["下一首", "播放下一首", "切歌"],
"actions": [
{
"type": "variable_set",
"variable": "track_num",
"operation": "add",
"value": 1,
"condition": "track_num <= total_tracks"
},
{
"type": "variable_set",
"variable": "track_num",
"operation": "set",
"value": 1,
"condition": "track_num > total_tracks"
},
{
"type": "jump",
"target": "播放第{track_num}首"
}
]
}
]
}
八、总结
通过 SU-03T 的变量功能,我们可以完全依靠模组内部实现音乐播放的切歌控制,无需额外的 MP3 模块。关键点是:
- 合理使用变量:记录当前状态(曲目编号、播放模式等)
- 善用跳转功能:通过条件跳转实现复杂逻辑
- 考虑存储限制:2MB Flash 限制了音频数量和时长
- 必要时结合串口:复杂播放控制可配合 MCU 实现
希望本指南能帮助您快速实现 SU-03T 音乐播放控制功能!