时下智能语音交互市场火热,越来越多的设备都开始支持远场AI语音交互。
例如:智能音箱,智能电视等等。但这类产品的识别率和误唤醒率还需再不断的优化提升,以至于日常生活中人们还是离不开各式各样的遥控器。而蓝牙语音遥控器这一产品,作为远场语音交互的一个近场配件,也搭上了这趟语音交互的快速列车,成长速度令人惊讶。基于Actions炬芯的ATB1103芯片的语音遥控器,打造了一个AIoT时代的高性价比精品。
一、遥控器应用总体架构
遥控器总体架构分四层,从上到下依次为应用层、应用框架层、硬件抽象层、底层驱动层
1.1、应用层
• 应用状态机– 事件触发让遥控器应用处理不同的状态
• 应用定时器– 定时触发不同的事件,驱动遥控器正常运行
• 应用输入处理– 处理底层来的不同按键消息
• 应用音频输入处理– 将底层的音频处理消息,进行编码,然后通过蓝牙发送给对端设备
• BLE profile
– HID profile,提供按键输入输出接口服务
– BAS service,提供电池服务
– DIS service,提供读取设备基本信息的接口服务
– ota profile,提供OTA 升级服务
1.2、应用框架层
• 输入管理– 按键映射处理、按键过滤机制
• 消息管理– 消息分配和释放、 消息发送和接收
• 内存管理– 动态内存管理
• 闪灯管理– 灯资源分配和释放
• 电池管理– 电量读取、电量管理策略
1.3、硬件抽象层
将应用层和驱动层剥离开的中间件层
1.4、底层驱动层
底层硬件操作接口
二、遥控器模块流程概述
2.1、系统启动
系统相关初始化、板级相关外设初始化、蓝牙协议栈相关初始化、HidApp 应用初始化,并进入Main 主循环,等待消息处理
2.2、遥控器状态机
遥控器在运行过程中,主要靠如下3 种状态维持他的正常运行。
2.2.1. 触发遥控器进去空闲状态的事件:
> 广播状态,没有连接成功,出现超时事件,进入idle
> 连接状态,断开连接,如无操作主动断开连接,然后进入idle
2.2.2. 触发遥控器进入激活状态的事件:
> 空闲状态,有按键、首次上电,进入激活状态
> 连接状态,出现异常断开,需要回连,进入激活状态
2.2.3. 触发遥控器进入工作状态的事件:
> 激活状态下,配对成功或者回连成功,进入工作状态。
2.3、按键处理
由于遥控器的键值较多,通常用矩阵键盘方式以节省pin 的使用。当使能Key 模块后,Key 控制器就会处于矩阵扫描状态,当检测到外部按键有值时,就会产生中断,中断就将按键信息上报给应用。
2.4、红外处理
• 在非连接状态下,按下按键,就会发射红外码,进而通过红外操作对端设备,如使用红外进行配对.
• IRC 协议上,最短的红外码重发时间为108 ms,而按键的重复上报时间,可能小于108ms,也可能大于108ms,因此按键输入和红外发送模块时间上存在三种可能:
2.4.1. 慢速点按
慢速点按动作特征是在大于Trpc 时间后有多次的按键输入。在Ta 时刻,发出初次按键值,在Tb 时刻,不做任何响应,在Tc 时刻,继续发送检测到的按键值,不会发送重复码.
2.4.2. 快速点按
快速点按的动作特征是用户在Trpc 时间内有两次或者以上的按键按下弹起的动作. 在Ta 时刻,将发送出初次按键,而Tb 时刻并不发送按键值,在Tc 时刻,如果按键仍然是按下状态,将发出按键值,否则将丢掉按键值.
2.4.3. 长按
长按的动作特征是按键按下后,一直不放开。此时CPU 检测到按键的持续按下,则在Ta 时刻发送出初次按键,发送出此时按键对应的红外键码,而在Trpc 时间内没有检测到按键的松开,则在Tb 时间输出重复码,直至检测到按键弹起为止.
2.5、语音采集
• 当启动Voice Key 后,ADC 开始采集
• 采集的数据通过DMA 搬运到应用的循环buffer 中,同时发送消息给Main 线程,让其处理语音数据。
• 如果Main 线程处理速度不够快,audioin 驱动就会因为分不到buffer,而将采集的语音数据丢弃。
2.6、BLE数据传送
• 将audioin 驱动发送上来的数据进行编码压缩。
• 然后将编码后的压缩数据切成几个20byte 的数据包
• 最后通过hid profile notify 接口发送给BLE 协议栈
2.7、应用软件Timer管理模块
2.8、LED管理模块
遥控器定义了几种LED 指示灯,用于指示遥控器的一些状态,如下表所示
通常遥控器只有一个物理的LED 灯用于各种场景的指示,这就需要软件上让其分时复用,如果同时需要显示两种状态,状态需要定义优先级,优先级高的状态先指示。如在配对模式下,处于闪灯状态下,这时候按下按键,那么灯还是处于快闪状态。
2.9、OTA升级模块
当前OTA 设计在应用中,系统随时可以升级,升级过程中,系统的其他模块仍然可以正常使用,升级完后,由对端设备决定是否重启系统,如果对端设备没有重启系统,系统将在下一次上电的时候,使用新的固件。
2.10、电池管理模块
电量检测采用标准的BAS Service,实现电量的读取(Read)和上报(Notification)。目前定义的电池电压检测范围1.8 ~ 3.25V,线性等分对应0%-100%,由于没有关机操作,当前配置了一个超低电门槛1.8V,低于超低门槛后,系统不再允许Nor 操作,蓝牙连接也会自动断开。BAS 的notification configuration characteristic 使能后,定时器每N 分钟读取一次电量并通过Notification 上报。
三、语音传送的HID PROFILE 介绍
• GATT 服务需求
• Report Map 介绍
Report Map 属性主要用于定义在HID Service 和report Host 端传送的input report、output report、feature report 格式。每个HID service 只能包含一个report map 属性,属性值长度为小于等于512byte。
• HID Reports 介绍
当前定义3 种HID input report IDs:
– Remote report
用于传送遥控器按键信息
– Voice report
用于传送语音信息,每次report 的数据为20byte
– Mouse report
用于传送空鼠信息,暂未使用
• Hid Profile 语音传输基本过程
– Client 端进行BLE 连接、配对及服务发现,并使能所有input 属性通知属性。
– Server 端通过HID profile 的Remote report 发送一个开始按键到Client 端,Client 准备接收audio Data。
– Server 端通过HID profile 的Audio Out 属性发送voice Data 到Client 端。
– Server 端通过HID profile 的Remote report 发送一个结束按键,Client 停止接收audio Data.
四、按键编码设计
五、按键行为规范
5.1 普通按键的行为
5.1.1. 在非连接状态,唤醒系统,发送回连包或者配对广播包,并通过红外发送红外码
5.1.2. 在连接状态下,发送蓝牙码
发送给远端设备的按键行为大致为:
down–>down–>down->…–>up
设备端并不处理长按或者短按逻辑,交由远端设备处理。
5.2 语音按键的行为
5.2.1. 在非连接状态,唤醒系统,发送回连包或者配对广播包
5.2.2. 在连接状态下,Down 状态发送语音开始标识,up 状态发送语音结束标识。
发给远端设备的按键行为大致为:
Down—>up
设备端过滤掉中间的down。
5.3 配对组合键的行为
配对组合按键会强制进入配对模式,发送配对广播包触发配对流程。
持续按住配对组合按键N s 以上,进入配对模式,之后的流程如下:
5.3.1. 如果有link key,先删除link key
5.3.2. 如果是连接状态,断开连接, 如果是非连接状态,发送配对广播包
5.3.3. 组合键键值不会发送给远端设备
六、休眠与唤醒
6.1 休眠
6.1.1. 在广播状态下,Host CPU 会进入deepsleep 状态,BLE 控制器处于广播状态.
6.1.2. 在连接状态下,不发送按键/语音,Host CPU 进入deepsleep,BLE 控制器处于连接状态,如果connSlaveLatency = 44,连接间隔为10ms,那么BLE 控制器进入deepsleep,每隔450 ms 醒来一次发一次空包回应对端,然后进入deepsleep 状态.
6.1.3. 在连接状态下,发送按键,按键发送完,进入2 状态.
6.1.4. 在连接状态下,发送语音,Host CPU 不会进入deepsleep,BLE 控制器处于连接状态.
6.1.5. 在无连接和广播状态,Host CPU 和BLE 控制器都会进去deepsleep 状态,即最省电模式,所以应用层还设计了在N 分钟内没有按键和语音操作,遥控器会主动断开连接进入deepsleep 模式,达到最省电模式。
6.2 唤醒
6.2.1. 遥控器Host CPU 可以由蓝牙事件唤醒,也可以由按键事件唤醒,还可以由timer事件唤醒
6.2.2. 在连接状态下,按键操作唤醒Host CPU 然后将键码/语音发出
6.2.3. 在没有连接状态下,按键操作会触发进入回连模式,在回连成功后,将键码发出
七、语音框架
总体框架如下图所示,大致包括2 个过程:
• BLE Server 语音采集、编码及传输
• BLE Client 语音接收、解码及识别
7.1 BLE Server 语音采集、编码及传输
7.1.1 MIC 语音采集
音频驱动使用DMA 方式接收,配置一个N×SIZE 的BufferQueue,N 个buffer 循环配置给DMA 使用。当BufferQueue buffer 消耗完,最后一个buffer 被覆盖使用。
7.1.2 语音编码
• 语音编码通常采用经典的IMA adpcm 编码,压缩率为1/4.
– 该算法优点:消耗CPU 和RAM 相对比较少
– 该算法缺点:压缩率低,有损压缩,音质一般
• 当前也设计支持了高压缩高音质的1/8、1/16 音频编码算法
7.1.3 BLE 语音传送
BLE 通过HID profile,按照每包20 个byte 数据将编码后的数据传送给对端BLE Hid Profile。
7.2 BLE Client 端语音接收、解码及识别
7.2.1 BLE 语音接收
Android hid input 驱动收到BLE 数据,通过event 事件上报给input 子系统,input 子系统再将事件上报给适配的事件处理handler。
7.2.2 Audio 驱动解码
当BLE hid 驱动收到遥控器开始语音按键后,就会开启Audio 设备(虚拟mic 驱动),Audio 会开启一个缓冲buffer 用于接收BLE 语音数据,当buffer 快满的时候,Audio驱动启动一个N ms 的timer 从buffer 取M byte 进行解码,解码后得到K byte 数据,然后放到pcm buffer 中。
7.2.3 录音识别
如果Android 上层已经开启录音设备,录音APK 就能从audioTrack 读取audio HAL层语音数据,进而读取Audio 设备驱动的pcm buffer 音频数据,录音APK 得到录音数据,通过http 传送远程识别服务器,最终得到识别结果返回给本地。
此方案目前已经在市面上量产,针对BLE Server端语音采集、编码及传输到BLE Client端语音接收、解码及识别有着完整完善的解决方法。 1、支持双向语音传输(IIS OUT接口) 2、低功耗的voice adc,蓝牙语音传输整机功耗 < 6mA 3、IMA ADPCM以及更高压缩比的(16:1)语音编码 4、支持红外自学习(外围电路省) 5、多按键、7pin支持35个按键(QFN32) 6、支持Find me/VAD
1、按键输入:< 35 键 2、语音输入:8k/16bit、16/16bit 3、 语音编码:1/4 、1/8 、1/16 压缩算法 4、红外键码输出 5、BLE 键码输出、BLE 语音输出 6、蓝牙断线后回连,并发送回连前的键值 7、电量检测及电量管理
原文作者:Jon.Tan