Skip to content

如何构建 EarLLM:开发 Android 蓝牙耳机语音 LLM 助手

本文提供 EarLLM One 项目的完整开发指南,解决在 Android 端通过 Kotlin/Compose 实现蓝牙音频采集、语音转文字(STT)、LLM 交互及文字转语音(TTS)回传的复杂技术链路。

为什么需要这个技能

开发一个将蓝牙耳机与 AI 结合的语音助手面临诸多底层挑战:Android 版本的音频路由差异、蓝牙 SCO 协议的带宽限制、前台服务的权限管理以及语音管线(Voice Pipeline)的状态同步。

EarLLM 提供了一套经过验证的模块化架构,将蓝牙控制、音频采集、语音处理和 LLM 接口解耦,使开发者能够快速构建一个可实际运行的“耳机 AI 助手”,而无需从零开始处理繁琐的 Android 硬件兼容性问题。

适用场景

  • 构建一个可以通过蓝牙耳机快捷键触发、通过语音与 AI 对话的 Android 应用。
  • 研究 Android 14+ 版本的 FOREGROUND_SERVICE_MICROPHONE 权限及前台服务实现。
  • 需要实现蓝牙 SCO/BLE Audio 切换、回声消除(AEC)等底层音频路由控制。
  • 开发需要集成 OpenAI 兼容接口的移动端语音交互应用。

核心工作流

EarLLM 采用了多模块依赖架构:app voice audio core-logging。其核心交互链路如下:

  1. 触发采集:通过 HeadsetButtonController 监听耳机按键 触发 VoicePipeline 切换录音状态。
  2. 音频处理VoiceCaptureController 以 16kHz 单声道采集 PCM 数据 SpeechToTextController 将其转译为文本。
  3. AI 推理LlmClient 调用 OpenAI 兼容 API 获取文本响应。
  4. 语音回传TextToSpeechController 将响应转为语音,通过 A2DP 协议发送至耳机。

关键技术要点

  • 音频路由:在 Android 12+ 中,应弃用 startBluetoothSco(),改用 AudioManager.setCommunicationDevice()
  • 回声消除:必须使用 VOICE_COMMUNICATION 音频源以启用 AEC,防止 TTS 输出被 STT 重新录入。
  • 状态管理:严格遵循 StateFlow 模式,通过 MainViewModel 同步 UI 状态。

构建与测试

生成构建产物

在项目根目录下执行以下 PowerShell 命令以打包项目:

powershell
powershell -Command "Remove-Item 'EarLLM_One_v1.0.zip' -Force -ErrorAction SilentlyContinue; Compress-Archive -Path (Get-ChildItem -Exclude '*.zip','_zip_verify','.git') -DestinationPath 'EarLLM_One_v1.0.zip' -Force"

运行测试

bash
./gradlew test --stacktrace          # 运行单元测试
./gradlew connectedAndroidTest       # 运行设备端集成测试

下载和安装

下载 earllm-build 中文版 Skill ZIP

解压后将目录放入你的 AI 工具 skills 文件夹,重启工具后即可使用。具体路径参考内附的 USAGE.zh.md

你可能还需要

暂无推荐