本帖最后由 wenfengand 于 2024-10-9 22:37 编辑
本帖最后由 wenfengand 于 2024-10-9 22:37 编辑
本帖最后由 wenfengand 于 2024-10-9 22:35 编辑
本帖最后由 wenfengand 于 2024-10-3 09:06 编辑
本帖最后由 wenfengand 于 2024-10-3 00:39 编辑
本帖最后由 wenfengand 于 2024-10-3 00:38 编辑
本帖最后由 wenfengand 于 2024-10-3 00:34 编辑
本帖最后由 wenfengand 于 2024-10-3 00:32 编辑
一、背景
随着 AI 大模型技术的不断发展,诸如 GPT、混元、千问这样的大模型开始有能力帮助人们解决工作生活上的问题。但是小米智能家居的核心中枢 - 小爱同学,似乎并不具备这样的“智力”。在对一些开放问题的回答上总是回复“我还没学会”或者“我不知道”。
另外,大模型一般都是用文字交互,在便利性上欠佳。反观目前流行的智能家居,都是用语音实现交互。
如何将大模型技术与智能家居结合起来,通过语音对话的形式,准确、快速、高智商地识别命令、给出回应,是一个很有趣的课题。
二、目标
制作一个智能家居助手,使用语音交互,能够流畅问答。
三、实现效果
如下面的视频所示,目前实现了这些能力:
- 点击屏幕按钮,开始录制声音
- 大模型会用语音回应
https://www.bilibili.com/video/BV1rC43e4EH2/?share_source=copy_web&vd_source=f7c727e1fe4fb59560566a52efbc2db4
四、整体框架
由于与大模型的交互复杂,即便是仅调接口,语音和文字的互转也非常消耗 cpu 和内存,所以采用了上位机和下位机的方案,两者通过 tcp 接口通讯。
小安派主要负责语音采集、语音播放。通过 dma 将数据从 adc 中采集后放到队列中,然后从队列通过 tcp 发送到上位机。在接收线程中,从 tcp 读取数据并经队列缓冲后,从 dma 传输到 dac。
上位机主要负责与各种接口交互。接收到语音数据后,先转为 wav 格式,然后调用语音转文字接口。识别到命令中,送入腾讯混元大模型。最后把返回的文字转为语音后,再通过 tcp 接口发送给小安派。
使用到的接口:
- 腾讯语音转文字(一句话识别):https://cloud.tencent.com/document/api/1093/35646
- 腾讯混元 pro:https://cloud.tencent.com/document/api/1729/105701
- 腾讯文字转语音:https://cloud.tencent.com/document/api/1073/37995
这些接口都可以使用 python SDK 方便地接入。
五、实现细节
5.1 加固开发板,避免硬件故障
开发板主要由排线连接屏幕、喇叭、麦克风,而且没有板载 usb2ttl,这就会造成如下问题:
- 屏幕排线容易断
- 外置 usb2ttl 使用杜邦线,容易接触不良
- 不美观
![]()![]()
屏幕尺寸较大,可以考虑将开发板完全站在屏幕背后。当然,为了绝缘,先用双面胶粘一层硬纸板,然后再用双面胶粘开发板。总体较为牢固,插拔供电 usb 接口、按压 EN 按键均没有问题。
外置 usb2ttl 也需要固定在开发板上。如上图所示,引了三根飞线到开发板上,并焊接牢固后用热熔胶固定。usb2ttl 的 pcb 使用热熔胶固定在开发板的芯片和接线端子上。此处使用双面胶效果不好,故使用了热熔胶。
5.2 使用 NXP gui guider 加速图形界面开发
常规方式开发 lvgl 的效率比较低,需要用代码一行一行加控件,然后不断烧写进开发板中观察效果。
而 NXP 的 gui guider 使用图形化开发拖拽空间的方式,大大简化了这一流程。
如上图所示,设置背景、增加按钮控件、增加按钮事件后,就可以将代码导出,应用到小安派的工程中。
在小安派中,需要调用 setup_ui 和 events_init 函数,然后就可以下载固件观察效果。在 gui guider上的预览效果与小安派上的实际效果一致。
5.3 设置大模型流式响应减少等待时间
大模型的响应时间较长,所以 pc 端的常见方案是采用流式响应,即逐字输出的方式,来避免长时间等待。
但在语音交互助手这里需要一些改进,用于解决如下问题:
逐字输出后,文字转语音非常不自然,因为文字转语音至少需要一个完整的句子,来生成合适的语速、语调。
综合考虑,采用流式响应 + 拼接句子的方案。即不断缓存大模型的输出,碰到句号后,将缓存中的数据拼接为一个完整的句子,然后执行后续流程。
5.4 采用多重缓冲解决速率不匹配问题
在小安派的软件设计上,语音数据的播放比语音数据的获取要困难许多。
这是处理速率不同造成的。语音获取的时候,是小安派向上位机发数据,即低速设备发送到高速设备上,上位机只要等着就好了。但上位机向下位机发数据时,小安派还没响应,后续的数据就源源不断地进来了,造成缓存队列被塞满。
考虑设计多重缓冲来解决这个问题。
第一层缓冲在上位机。当发完一句话的语音数据后,上位机休眠这句话所需的时间。也即是等小安派播放完后,再发一下句。实践之后,休眠的时间可以缩短 1-2 秒,以减少语句之间的停顿。
第二层缓冲在小安派。每句话的时间在 2-10秒,采样率 16kHz,单声道,采样深度 16 位,小安派需要留足够的缓存。
总结
本项目尝试了大模型在语音交互助手中的应用,采用了 nxp lvgl guider 工具,应用了腾讯云的大模型接口、语音转文字接口、文字转语音接口,大大简化了开发流程。并解决了大模型流式响应的 tts 问题、小安派速率不匹配问题。最终效果良好。
源代码:https://sourl.cn/67AeMW