CATALOG

一、搞清楚你的目标

咱们今天要做的事,说白了就是:通过代码远程控制芯步那台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是直接打断,如果想实现“暂停→恢复续播”,官方接口不直接支持,但有两种变通方案:

方案一:分段播放 + 记忆位置

  1. 播放前先把长文本拆成短句列表

  2. 维护一个当前播放到第几句的状态(存在Redis或内存里)

  3. “暂停”时调用stop打断,记录索引

  4. “恢复”时从断点索引继续播下一句

缺点:句子之间会有微小间隔,不够连贯。

方案二:静音“伪暂停”

不调用stop,而是把音量瞬间调到0:

恢复时恢复原音量:

优点:播放进度没断,恢复无缝隙缺点:设备实际还在播,只是听不见,会白白消耗网络流量和设备CPU。

六、进阶功能:查询设备状态

有时候你想知道音柱现在在不在线、在播什么,可以用设备详情接口

返回示例:

但这个接口返回的是设备整体在线状态,并不是“正在播放/空闲”这种细粒度状态。如果你想精确知道当前是否在播,需要在应用层自己做标记——下发播报命令时记录一下,收到stop时清除标记。

七、常见踩坑与解决方案

问题原因解决办法
签名错误时间戳单位错/拼接顺序错确认用秒级ts,拼接是md5(AppSecret)+ts再md5
设备无响应设备离线或WiFi断连检查设备在线状态,音柱只支持2.4G WiFi
中文乱码编码问题play命令指定gbk编码
暂停后恢复不了stop打断了就无法恢复用静音方案或自己分段管理

八、总结

整体来看,芯步30W音柱的二次开发还是比较顺的——接口统一、文档齐全、支持多语言调用。核心就记住三点:

  1. 鉴权签名:md5(md5(密钥)+时间戳),别弄反了

  2. 播放{"play:gbk:16":"文本"}

  3. 停止{"stop":"0"}(官方没叫pause,但一样用)

至于“暂停续播”这种高级需求,官方没原生支持,但用静音或分段方案都能曲线救国。如果你的业务场景非常需要这个能力,也可以考虑用它的