# OpenMic **Repository Path**: logicliu/open-mic ## Basic Information - **Project Name**: OpenMic - **Description**: 一个将 Android 手机变成蓝牙麦克风的应用,实现超低延迟的实时音频采集与播放 - **Primary Language**: Kotlin - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-05-07 - **Last Updated**: 2026-09-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: Kotlin, Android ## README # 麦响 一个将 Android 手机变成蓝牙麦克风的应用,实现超低延迟的实时音频采集与播放。 --- ## 功能特性 - ✅ 实时麦克风音频采集 - ✅ 蓝牙音响播放 - ✅ 音量增益控制 (0-200%) - ✅ 啸叫抑制(硬限幅 + 噪声门) - ✅ 前台服务支持(后台运行) - ✅ 蓝牙设备连接检测 - ✅ 简洁的 Jetpack Compose UI ## 快速开始 ### 前置要求 - Android Studio Hedgehog 或更高版本 - JDK 11 - Android SDK API 24+ (Android 7.0) - 蓝牙音响设备(用于测试) ### 构建与安装 1. 克隆或下载项目 2. 使用 Android Studio 打开项目 3. 等待 Gradle 同步完成 4. 连接 Android 设备(API 24+) 5. 编译并运行应用 ## 使用说明 ### 基本使用 1. 打开应用 2. 授予麦克风和通知权限 3. 连接蓝牙音响 4. 点击开关开始使用 5. 调节音量增益到合适水平 ### 注意事项 - ⚠️ **防啸叫**:不要将手机麦克风正对音响,保持适当距离 - 📶 **蓝牙连接**:确保在开始前已连接蓝牙音响 - 🔋 **电量**:持续使用会消耗较多电量 ## 架构设计 ### 核心组件 ``` ┌─────────────────────────────────────────────────────────┐ │ MainActivity │ │ (UI 层 - Compose + 状态管理 + Service 绑定) │ └────────────────────────┬────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────┐ │ BluetoothMicService │ │ (前台服务 - 生命周期管理 + 通知栏) │ └────────────────────────┬────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────┐ │ AudioLoopEngine │ │ (音频处理 - AudioRecord + AudioTrack + DSP) │ └─────────────────────────────────────────────────────────┘ ``` ### 类职责说明 | 类 | 职责 | |---|---| | `AudioLoopEngine` | 核心音频引擎,处理音频采集、播放和 DSP | | `BluetoothMicService` | 前台服务,提供后台运行能力 | | `BluetoothMicScreen` | Compose UI 界面 | | `MainActivity` | 主入口,绑定服务并管理 UI 状态 | ### 项目结构 ``` AudioRecord/ ├── app/ │ ├── src/main/java/cn/logicliu/openmic/ │ │ ├── audio/ │ │ │ └── AudioLoopEngine.kt # 音频处理核心引擎 │ │ ├── service/ │ │ │ └── BluetoothMicService.kt # 前台服务 │ │ ├── ui/ │ │ │ ├── theme/ # Compose 主题 │ │ │ └── BluetoothMicScreen.kt # UI 界面 │ │ └── MainActivity.kt # 主 Activity │ └── build.gradle.kts └── gradle/ └── libs.versions.toml # 依赖版本管理 ``` ## API 参考 ### AudioLoopEngine ```kotlin class AudioLoopEngine(context: Context) { // 状态流 val state: StateFlow val gain: StateFlow // 控制方法 fun start() fun stop() fun setGain(value: Float) // 工具方法 fun hasRecordPermission(): Boolean fun isBluetoothA2dpConnected(): Boolean } ``` ### BluetoothMicService ```kotlin class BluetoothMicService : Service() { fun startAudioLoop(gain: Float) fun stopAudioLoop() fun setGain(gain: Float) fun isRunning(): Boolean fun isBluetoothConnected(): Boolean } ``` ## 音频处理流程 ``` 麦克风 (AudioRecord) ↓ PCM 原始数据 (16-bit, 单声道) ↓ 噪声门 (Noise Gate) - 抑制背景噪音 ↓ 音量增益 (Gain Control) - 0-200% 可调节 ↓ 硬限幅 (Hard Clipping) - 防止啸叫 ↓ 音频播放 (AudioTrack) - USAGE_MEDIA 确保蓝牙路由 ↓ 蓝牙音响 ``` ## 配置说明 ### 音频参数 在 `AudioLoopEngine.kt` 中修改: ```kotlin companion object { private val SAMPLE_RATES = intArrayOf(44100, 48000, 16000) private const val DEFAULT_GAIN = 1.0f // 100% private const val MAX_GAIN = 2.0f // 200% private const val MIN_GAIN = 0.0f private const val HARD_CLIP_THRESHOLD = 0.8f private const val NOISE_GATE_THRESHOLD = 0.02f } ``` ### 技术栈 - **语言**:Kotlin - **UI 框架**:Jetpack Compose + Material3 - **最低 SDK**:24 (Android 7.0) - **目标 SDK**:36 - **构建工具**:Gradle + AGP 9.2.0 ### 权限声明 在 `AndroidManifest.xml` 中已配置: ```xml ``` > 蓝牙设备检测通过 `AudioManager.getDevices()` 实现,无需 `BLUETOOTH_CONNECT` 权限,因此该权限未在清单中声明。 ## 开发指南 ### 添加新功能 1. **音频处理**:修改 `app/src/main/java/cn/logicliu/openmic/audio/AudioLoopEngine.kt` 2. **服务层**:修改 `app/src/main/java/cn/logicliu/openmic/service/BluetoothMicService.kt` 3. **UI 层**:修改 `app/src/main/java/cn/logicliu/openmic/ui/BluetoothMicScreen.kt` 4. **整合**:在 `MainActivity.kt` 中连接各层 ### 调试技巧 #### 查看日志 ```bash adb logcat -s AudioLoopEngine:V BluetoothMicService:V ``` #### 性能分析 使用 Android Studio Profiler 监控 CPU 和内存使用。 #### 音频调试 调整 `NOISE_GATE_THRESHOLD` 和 `HARD_CLIP_THRESHOLD` 优化音质。 ## 常见问题 ### 问题:无法录音 **解决方案**:检查是否授予 `RECORD_AUDIO` 权限。 ### 问题:声音不从蓝牙播放 **解决方案**: 1. 确认蓝牙音响已连接 2. 检查 `AudioAttributes` 配置(使用 `USAGE_MEDIA`) 3. 尝试重启应用 ### 问题:延迟过高 **解决方案**:减小 `AudioLoopEngine.kt` 中的 `bufferSize` 配置值。 ### 问题:啸叫 **解决方案**: 1. 降低音量增益 2. 手机远离音响 3. 调整 `HARD_CLIP_THRESHOLD` ## 贡献指南 欢迎提交 Issue 和 Pull Request! ### 开发环境设置 1. Fork 本项目 2. 创建特性分支 (`git checkout -b feature/AmazingFeature`) 3. 提交更改 (`git commit -m 'Add some AmazingFeature'`) 4. 推送到分支 (`git push origin feature/AmazingFeature`) 5. 开启 Pull Request ## 许可证 本项目采用 MIT 许可证 - 详见 [LICENSE](LICENSE) 文件。 ## 致谢 - Android 音频框架团队 - Jetpack Compose 社区 - 所有贡献者