关于音高检测器
我们在阅读了数百条 Reddit 帖子后构建了这个工具,歌手们在其中抱怨八度识别错误、高音区读数不稳定以及实时检测与实际录音之间的差距。我们的目标是打造一个歌手真正有意义的音高检测器——而不仅仅是工程师眼中的那种。
我们要解决的问题
音高检测问题听起来很简单:听音频,报告音符。但歌手们几十年来都知道,现有工具会在一些具体而令人沮丧的方面让他们失望。我们遇到的最常见的三个抱怨是:
八度识别错误。
男高音唱 A4,调音器却显示 A3。这是因为未针对人声优化的音高检测算法常常锁定次谐波而非基频。对歌手来说,这使标准吉他调音器几乎毫无用处。高音区读数不稳定。
在高音区,置信度下降,显示的音符在相邻半音之间跳动。没有置信度指示器,歌手无法判断读数是准确的还是只是噪声。无法将现场演唱与录音对比。
歌手知道他们在录音中的声音与脑海中的不同。但大多数实时工具只显示当前时刻,从不与之前的录音对比。多次演唱之间的音准漂移无法测量。
我们的方法
我们围绕三个直接解决这些问题的原则构建了这个音高检测器:
声部频率先验。
在音高估计运行之前,算法将搜索空间约束到所选声部的频率范围内。男低音被限制在 E2-E4。女高音被限制在 F3-G5。范围之外的次谐波候选被丢弃。这消除了全部六种声部的八度错误。明确的置信度报告。
YIN 音高估计器在产生频率估计的同时已经产生一个置信度值。我们以彩色置信度条的形式直接将这个值展示给用户。歌手始终知道当前读数是否值得信任。双轨音高曲线显示。
我们将录制的音高曲线与实时曲线分开存储,并在同一画布上同时显示两者。歌手现在可以一眼看出多次演唱之间的音准一致性 — 这以前只在专业 DAW 插件中才有。
技术栈
音高检测基于 YIN 算法(de Cheveigné & Kawahara, 2002),使用 TypeScript 实现,并通过 Web Audio API 完全在浏览器中运行。任何音频数据都不会传输到服务器。该应用使用 Next.js 构建,部署在 Cloudflare Workers 上,实现快速全球响应,无冷启动延迟。
所有工具页面 — 音高检测器、人声音高分析器、歌唱音符检测器、音域测试、吉他调音器、电吉他调音器、贝斯调音器、尤克里里调音器、小提琴调音器、半音阶调音器、调性查找器、节拍器、音调发生器和声音测试 — 都在构建时静态生成,意味着它们从 Cloudflare 边缘缓存即时加载,每次访问无需服务器端处理。
隐私承诺
我们不收集任何个人数据。没有账号、没有追踪 cookie、没有音频上传。麦克风流在浏览器标签页内内存中处理,在你关闭或离开页面时即被丢弃。页面发出的唯一外部请求是加载帮助维持服务免费的 Google AdSense 广告。广告网络的行为受其各自隐私政策的约束。