一款基于 Android 的实时人声音域测试应用,帮助你快速、准确地检测个人声音的音高范围
NoiseSuppressor(如设备支持)
| 功能 | 说明 |
|---|---|
| 中央圆形区域 | 实时显示当前检测到的音名 |
| 频率显示 | 当前音高对应的频率值(Hz) |
| 最低音 / 最高音 | 本次测试中检测到的音域极值 |
| 钢琴键盘 | 蓝色区域为个人音域跨度,黄色圆点为实时音高位置 |
com.ltx.vocalscope
├── MainActivity # 主活动,权限管理与内容视图
├── VocalScopeScreen() # 核心 UI 组件(Compose)
├── PianoRangeChart() # 钢琴键盘可视化组件(Canvas 绘制)
├── startAudioCapture() # 音频采集与 YIN 音高检测
├── getMidiNoteNumber() # 频率 → MIDI 编号转换
├── getNoteNameFromMidi() # MIDI 编号 → 音名转换
├── medianInt/Float() # 中值滤波工具函数
└── ui/theme/ # Material 3 主题配置
| 技术 | 用途 | 版本 |
|---|---|---|
| Kotlin | 开发语言 | 2.3.10 |
| Jetpack Compose | 声明式 UI 框架 | BOM 2026.02 |
| Material 3 | 设计系统 | 最新 |
| TarsosDSP | YIN 音高检测算法 | 2.5 |
| Android AudioRecord | 原始 PCM 音频采集 | - |
| Kotlin Coroutines | 异步音频处理 | - |
| Compose Canvas | 钢琴键盘自定义绘制 | - |
麦克风原始 PCM 数据
↓
AudioRecord (44100Hz, Mono, 16-bit)
↓
Short → Float 转换 + RMS 计算
↓
TarsosDSP YIN PitchProcessor
↓
置信度 > 0.85 && RMS > 0.015 && 65~1100Hz
↓
MIDI 编号计算 (A4=440Hz 标准)
↓
跳变检测 + 中值滤波平滑
↓
UI 更新 (音名、频率、音域范围、钢琴键盘)
# 克隆项目
git clone https://github.com/tianxing-ovo/VocalScope.git
cd VocalScope
# 构建调试版本
./gradlew assembleDebug
# 安装到已连接的设备
./gradlew installDebug
应用需要以下权限:
| 权限 | 用途 |
|---|---|
RECORD_AUDIO |
通过麦克风采集人声进行音高分析 |
首次启动时会弹出权限请求对话框,授予后即可正常使用。
VocalScope/
├── app/
│ ├── build.gradle.kts # 应用级构建配置
│ └── src/main/
│ ├── AndroidManifest.xml # 应用清单(权限声明)
│ ├── java/com/ltx/vocalscope/
│ │ ├── MainActivity.kt # 核心逻辑(音频采集 + UI)
│ │ └── ui/theme/ # Material 3 主题
│ └── res/
│ ├── mipmap-*/ # 应用图标(多分辨率)
│ ├── values/ # 字符串、颜色、主题资源
│ └── xml/ # 备份规则
├── gradle/
│ └── libs.versions.toml # 统一依赖版本管理
├── build.gradle.kts # 项目级构建配置
├── settings.gradle.kts # 项目设置
├── LICENSE # MIT 开源协议
└── README.md # 本文件
你可以在 MainActivity.kt 中调整以下参数:
| 参数 | 默认值 | 说明 |
|---|---|---|
sampleRate |
44100 |
采样率(Hz) |
bufferSize |
2048 |
TarsosDSP 缓冲区大小 |
probability |
> 0.85f |
YIN 置信度阈值 |
currentRms |
> 0.015f |
最低音量阈值(过滤背景噪音) |
| 频率范围 | 65f..1100f |
人声检测频率限制 |
| 大跳变阈值 | >= 7 半音 |
触发跳变检测的音程差 |
| 中值滤波窗口 | 3 帧 |
平滑窗口大小 |
| 钢琴键盘范围 | F2 ~ D5 (MIDI 41~74) | 键盘显示的音域范围 |
本项目基于 MIT License 开源