摘要: 随着 AI 技术的进步, 智能语音开始将人机交互从手 + 眼睛的传统模式中解放出来带给人们更便捷更风趣更有人情味的体验, 让被操作对象变得不再只是一个死板的工具, 而更像是一个有生命的助理帮我打开空调, 明天上班需要带伞吗, 快递到哪了在万物互联的时代, 你的所有需求只需要一句话便能实现
随着 AI 技术的进步, 智能语音开始将人机交互从手 + 眼睛的传统模式中解放出来带给人们更便捷更风趣更有人情味的体验, 让被操作对象变得不再只是一个死板的工具, 而更像是一个有生命的助理帮我打开空调, 明天上班需要带伞吗, 帮我冲 100 块钱话费在万物互联的时代, 你的所有需求只需要一句话便能实现
AliOS Things 集成的 Link Voice SDK 即可实现智能语音交互
关于阿里智能语音服务
阿里智能语音服务为设备提供语音交互能力丰富的音乐内容智能家居控制等, 并可进行专有设备技能定制 (如: 语音操控跑步机按摩椅等设备) 包括:
通用服务: 搜歌搜栏目搜电台问天气百科四则运算等;
阿里服务: 控制智能家居充值手机费天猫超市购物查询电费等 (需接入账号体系, 可参考 SDS 接入);
私有服务: 操控设备售后电话查询等 (需要技能定制, 签约时请提供产品需求)
功能集成
设备接入阿里语音服务, 需要集成 Alink SDK 和 Link-Voice SDK, 其中 Alink SDK 为设备提供接入阿里 IoT 平台的连接账号体系配网 OTA 等能力, 而 Link-Voice SDK 为设备提供阿里智能语音服务设备首先要集成了 Alink SDK 成为 SDS 平台的一个设备, 才能通过集成 Link-Voice SDK 使用阿里智能语音服务
Link-Voice SDK 除了依赖 Alink 为设备完成平台接入设备管理外, 还需要表格所列模块完成相应工作其中 websockets 用来进行语音数据的交互; opus 完成语音录制的 PCM 格式到 opus 格式的转换(服务端只接收 opus 格式);cjson 用来做 json 解析; mbedtls 为 alink 和 websockets 的底层连接进行加密, 为其数据传输提供安全保障
而目前 AliOS Things 已完成以上表格所有模块的移植适配工作并将其集成进来, 所以我们直接使用 AliOS Things 便可完成愉快的智能语音开发主 mcu 性能建议:
- Flash>=512KB
- RAM>=200KB
- CPU>=180Mhz
单次语音识别流程图
简化缓冲处理等细节:
开发平台准备
按理满足功能集成章节性能要求, 并带音频录制及播放功能的开发板即可前提是需要完成 AliOS Tings 的移植适配工作本文以全志 xr871evb(已完成 OS 适配)为例进行介绍
本平台资源:
- cpu:200Mhz cortext-M4f
- RAM:448KB(部分硬件相关 code 需要加载到 ram 中运行, 实际可用约 280KB)
- FLASH:2MB SPI FLASH
环境搭建及代码编译
先搭建 AliOS 开发环境(以 linux 为例):
AliOS-Things-Linux-Environment-Setup
然后从 github 阿里官方开源库下载最新版本的 AliOS Things 源码(https://github.com/alibaba/AliOS-Things):
以 linux 下开发为例:
git clone git@github.com:alibaba/AliOS-Things.git
切换到主分支:
git checkout master
建议再在主分支上新建一个自己的开发分支:
git checkout b dev-xxx(yourname):
到目前为止环境也安装好了, 代码也准备完毕, 只待编译及烧录测试
编译 link-voice 测试例程:
aos make linkvoiceapp@xr871evb xr871=1
代码烧入:
cd platform/mcu/xr871/tools/
修改串口配置:
vim settings.ini
将串口改成你板子的串口号, 可 ls /dev/tty * 查看, 保存退出
代码烧写, 先将全志开发板启动选择拨码开关拨至 NO 位置, 如同所示:
然后执行
./phoenixMC_linux 开始进行代码烧写, 烧写完成后再将拨码开关拨回靠串口位置, 重启
打开 minicom 或其他串口工具监视设备输入信息, 波特率 115200
功能演示:
初次上电后先进行配网:
netmgr connect ssid psswd
其中 ssid 和 psswd 分别替换为你无线网络名及密码
由于没有加本地关键词识别功能, 所以现在没次对话需要按键触发
根据终端提示, 待网络连接后, 出现以下提示时:
按按键 2(AK2)触发语音识别功能
此时对着开发板说话, 语音数据被编码上传到云端识别成功后返回相应信息, 识别失败亦有相应提示
示例:
1: 明天上班需要带伞吗?
2. 给我讲个鬼故事
3. 推荐一部悬疑电影
4. 把空调打开
以下为一个小的演示视频:
http://v.youku.com/v_show/id_XMzQ1NjQ4MjIyOA==.html?spm=a2h3j.8428770.3416059.1
API 介绍
1)初始化
int pal_init(const struct pal_config *config);
说明: SDK 初始化, 只需调用一次
入参: config 结构体向 SDK 传递必须的参数
返回: 0 成功;-1 失败
2)销毁
void pal_destroy();
说明: SDK 销毁, 释放资源
入参: 无
返回: 无
3)获取 SDK 版本
int pal_version();
说明: 返回 SDK 的版本号
入参: 无
返回: SDK 版本号
4)设置日志级别
void pal_set_log_level(int level);
说明: 设置 SDK 的日志级别调试阶段可设置为 PAL_LOG_LEVEL_DEBUG 方便调试问题, 调试稳定之后上线前把日志级别设置为 PAL_LOG_LEVEL_ERROR
入参: level 为 SDK 的日志级别
返回: 无
5)设置环境
void pal_set_env(int env);
说明: 设置 SDK 的环境, 默认是 PAL_ENV_RELEASE, 在厂商外部环境下可以连接阿里线上环境厂商无需使用这个接口
入参: env 为 SDK 的环境
返回: 无
6)厂商播放器向 SDK 上报消息
int pal_notify_msg(const char *msg);
说明: 厂商的播放器的状态或者按键事件需要按照 Link_Voice_SDK_播控协议_v1.0.0.xlsx 定义的 json 格式上报给 SDK 与上层应用同步状态
入参: msg 为厂商播放器需要向 SDK 传递的事件消息
返回: 0 成功;-1 失败
7)厂商播放器通过 SDK 透传 ALink 消息
int pal_post_alink_msg(const char *msg);
说明: SDK 初始化过程会把 ALink 进行初始化, 与阿里平台保持物联长连接, 厂商设备需要上报给 ALink 的消息可通过该接口上报, SDK 对该消息进行透传上报给 ALink 服务端
入参: msg 为厂商需要通过 SDK 透传给 ALink 进行上报的消息, 格式按照 ALink 定义的消息格式
返回: 0 成功;-1 失败
8)开始一次语音识别
int pal_asr_start();
说明: 设备通过按键或者远场唤醒触发语音识别时调用
入参: 无
返回: 0 成功;-1 失败;
9)发送语音数据
int pal_asr_send_buffer(const char *buffer, int buffer_len);
说明: 该接口要在调用 pal_asr_start 成功了之后调用, 发送语音数据如果是 PCM 格式的数据, 则要求每次 640 字节如果返回 PAL_VAD_STATUS_STOP 则为云端检测到语音结束了, 厂商这时候可以调用 pal_asr_stop 或 pal_asr_stop_async 来获本次识别结果
入参: buffer 语音数据, buffer_len 语音数据长度, 字节
返回: 返回云端检测到的 VAD 状态
10)结束本次语音识别(同步接口)
struct pal_rec_result* pal_asr_stop();
说明: pal_rec_result 结构体返回本次语音识别的结果, 同步的接口结构体里的字段 status 表示本次语音识别的状态; should_restore_player_status 表示厂商播放器处理完本次语音识别事件之后是否恢复之前的状态, 0 是不恢复, 1 是恢复; asr_result 表示 ASR 识别的文本; task_status 表示语音识别任务状态, PAL_REC_TASK_STATUS_END 表示单次语音识别会话结束, PAL_REC_TASK_STATUS_WAITING 表示多轮对话, 应当播完 TTS 之后自动进入拾音状态, 开始一次新的语音识别
入参: 无
返回: 语音识别结果的结构体
11)结束本次语音识别(异步接口)
void pal_asr_stop_async(pal_asr_callback callback, void *user);
说明: 异步返回的接口, 功能与 pal_asr_stop 一样
入参: callback 注册的回调函数, 用于返回语音识别结果; user 用户自定义指针, 在 callback 中会回传给用户
返回: 无
12)取消本次语音识别
void pal_asr_cancel();
说明: 取消本次的语音识别
入参: 无
返回: 无
13)销毁语音识别结果
void pal_rec_result_destroy(struct pal_rec_result *result);
说明: pal_asr_stop 和 pal_asr_stop_async 返回的语音识别结果, 需要通过该接口来释放资源
入参: result 需要销毁的结果
返回: 无
14)文本转语音(同步接口)
struct pal_rec_result* pal_get_tts(const char *text);
说明: 提供文本转语音的功能返回的结果 pal_rec_result 需要通过 pal_rec_result_destroy 销毁
入参: text 需要转换的文本
返回: 返回的结构体, 文本转语音的结果在 tts 字段中, 是一个可播放的 url
更多
关于 AliOS Things 更多信息, 请参考 https://github.com/alibaba/AliOS-Things/wiki
关于 Link Voice 的更多信息, 请参考 https://iot.aliyun.com/product/voice?spm=a2c2j.8959409.5007732.14.666018deKqxNU7
来源: http://geek.csdn.net/news/detail/256174