一、搞清楚你的目标
咱们今天要做的事,说白了就是:通过代码远程控制芯步那台30W云TTS音柱,让它能播、能停。
这玩意儿在停车场、车间、加油站这些地方用得比较多,30W功率户外也够响,关键是它开放了HTTP接口,不用自己去录音上传,直接丢文本过去它就给你念出来。
但官方文档大多只讲了怎么“播”,没说怎么“停”——别急,它的接口设计其实支持,只是需要你对order参数稍微变个魔术。
二、先认识下这台音柱的“脾气”
2.1 它支持啥?
TTS播报:直接POST文本,设备端合成语音(芯片级TTS,毫秒级响应,不是软件合成的)
控制类命令:音量、音色、语速、语调、停止播放等
2.2 核心命令速查表
| 功能 | order参数示例 | 说明 |
|---|---|---|
| 播报文本 | {"play:gbk:16":"你好世界"} | GBK编码,16代表音量级别 |
| 停止播放 | {"stop":"0"} | 0=停止当前,1=全部停止 |
| 调节音量 | {"volume":"5"} | 0-9级 |
| 切换音色 | {"voice":"1"} | 0女声/1男声 |
注意:暂停的实现在官方文档里通常叫“stop”,而不是“pause”——它会把当前播放直接打断。如果你想实现“暂停后还能接着播”,那就需要自己在应用层做状态管理(后面会说)。
三、搞定鉴权(这块最容易踩坑)
调用任何接口之前,必须先过鉴权这一关。芯步的签名规则是:
其中:
AppSecret:你账号下的开发者密钥(控制台获取)ts:当前Unix时间戳(秒)+:字符串拼接
举个栗子(伪代码)
坑点提醒:时间戳单位是秒,不是毫秒。很多人用Java的System.currentTimeMillis()直接除以1000取整就对了。
四、核心:实现播放和暂停
4.1 发起一次TTS播报
HTTP请求示例:
参数说明
play:gbk:16:16是音量等级(0-9,这里16会不会是笔误?文档写0-9,但示例用16,实测先用9以内)支持多音字标注、数字读法(金额/手机号自动识别)
4.2 暂停/停止当前播放
stop参数:
"0":仅停止当前正在播放的这一条"1":清空整个播放队列(如果有连续多条)
4.3 完整代码示例(Python版)
五、高级技巧:实现“真暂停”(可恢复)
上面说的stop是直接打断,如果想实现“暂停→恢复续播”,官方接口不直接支持,但有两种变通方案:
方案一:分段播放 + 记忆位置
播放前先把长文本拆成短句列表
维护一个当前播放到第几句的状态(存在Redis或内存里)
“暂停”时调用
stop打断,记录索引“恢复”时从断点索引继续播下一句
缺点:句子之间会有微小间隔,不够连贯。
方案二:静音“伪暂停”
不调用stop,而是把音量瞬间调到0:
恢复时恢复原音量:
优点:播放进度没断,恢复无缝隙缺点:设备实际还在播,只是听不见,会白白消耗网络流量和设备CPU。
六、进阶功能:查询设备状态
有时候你想知道音柱现在在不在线、在播什么,可以用设备详情接口
返回示例:
但这个接口返回的是设备整体在线状态,并不是“正在播放/空闲”这种细粒度状态。如果你想精确知道当前是否在播,需要在应用层自己做标记——下发播报命令时记录一下,收到stop时清除标记。
七、常见踩坑与解决方案
| 问题 | 原因 | 解决办法 |
|---|---|---|
| 签名错误 | 时间戳单位错/拼接顺序错 | 确认用秒级ts,拼接是md5(AppSecret)+ts再md5 |
| 设备无响应 | 设备离线或WiFi断连 | 检查设备在线状态,音柱只支持2.4G WiFi |
| 中文乱码 | 编码问题 | play命令指定gbk编码 |
| 暂停后恢复不了 | stop打断了就无法恢复 | 用静音方案或自己分段管理 |
八、总结
整体来看,芯步30W音柱的二次开发还是比较顺的——接口统一、文档齐全、支持多语言调用。核心就记住三点:
鉴权签名:md5(md5(密钥)+时间戳),别弄反了
播放
{"play:gbk:16":"文本"}停止
{"stop":"0"}(官方没叫pause,但一样用)
至于“暂停续播”这种高级需求,官方没原生支持,但用静音或分段方案都能曲线救国。如果你的业务场景非常需要这个能力,也可以考虑用它的