谁能解释语音命令在 Android(Nexus 播放器)中如何通过蓝牙遥控器(Nexus 播放器遥控器)工作?

Can anyone explain how voice commands works via Bluetooth remote(Nexus player remote) in Android(Nexus player)?

谁能详细说明以下问题?

  1. 蓝牙堆栈如何处理音频数据?
  2. 如何处理音频命令?
  3. 我们是否需要任何服务来处理音频数据?

提前致谢。

基本上,通过 BLE 的语音命令需要:

  • 一些用于减少所需带宽的音频编解码器(ADPCM 和 SBC 很常见,OPUS 正在出现),
  • 一些通过 BLE 的音频流方法,
  • 解码音频流并将其从 BLE 守护程序获取到命令处理框架。

在 android 世界中,命令处理框架是 google 最容易从 ALSA 设备获取音频的酱汁(封闭)。剩下要做的是将音频从遥控器传输到 ALSA 设备。

对于音频流,您可以:

  • 使用自定义 L2CAP 通道或自定义 GATT 服务,这需要对 Bluedroid 进行自定义 android 服务应用 and/or 修改来处理这些,它需要一种将音频流作为 ALSA 注入的方法,很可能带有 "loop" 音频设备驱动程序,
  • 将音频声明为自定义 HID 报告,这样,Bluedroid 将它们注入回内核,然后添加处理这些报告并公开音频设备的自定义 HID 驱动程序。

BLE 上的音频不是标准的,所以所有的实现都不会做同样的事情。在 Nexus Player 案例中,实现使用 HID:它流式传输 ADPCM 音频流,在 HID 报告中分块。 Android linux 内核中有一个特殊的 HID 驱动程序 "hid-atv-remote.c" 除了输入设备外,它还公开了一个 ALSA 设备。 Bluedroid 没有关于音频的信息,它所做的只是将 HID 报告从 BLE 转发到 UHID。