听歌识曲功能大家肯定不陌生,它让我们知道了不少金曲的演唱者和歌曲名。不过时间不等人,有时候当我们听到心动旋律、慌忙掏出手机、打开 App、按下按钮之后,歌曲已经进入尾声。难道我们就只能惋惜着错过可能的「本命歌曲」吗?

此时一位 Pixel 用户表示:

错过金曲是不可能的,因为我们有闻曲知音(Now Playing)。

什么是「闻曲知音」?

闻曲知音 是 Pixel 手机搭载的一项听歌识曲功能,它能够让 Pixel 手机自动识别周围正在播放的歌曲而无需用户手动触发,并且更值得我们关注的是,这整个过程都是在本地离线完成,这是「闻曲知音」与一般听歌识曲类 App 最本质的两点区别。

Google Pixel 所搭载的闻曲知音功能

不过因为这项功能涉及到硬、软件配合,所以在此之前一直都是 Pixel 独占。好在最近,借助 Ambient Music Mod 这个开源项目(为了行文方便以下简称 AMM),我们也能把「闻曲知音」这样独特的功能带到其他 Android 设备上来。

运行环境

毕竟是属于一个移植项目,使用时 App 可能需要调用或配置某些系统接口,所以 AMM 需要一些特殊的运行环境:

  1. 对于搭载 Android 12 及更高版本设备,可以通过 Shizuku 为应用提供运行环境;
  2. 对于搭载 Android 9 及更高版本设备,需要授予 root 权限;
  3. 必要的畅通网络;
  4. 虽然开发者并没有特别要求,但建议使用 ARM v7 及更新架构的高通 SoC 设备。

本文以配置了 Shizuku(ADB 激活)的三星设备为例,系统版本为 One UI 4.1(Android 12)。

拓展阅读:《别被 root 挡在门外:Shizuku 让 Android 玩机更简单 - 少数派

安装过程莫要心急

AMM 并不是一个开箱即用的 App,其初始化过程相对繁琐一些。首先我们要知道,AMM 本身分为两个应用组件,其中 AMM 应用主体是为用户提供一个操作和配置的入口,另一个则是真正实现听歌识曲功能的「闻曲知音」应用。因此在第一次启动 AMM 并授权 Shizuku 权限后,应用就会提示下载安装「闻曲知音」和配套的离线曲库。

Shizuku 授权

这里的曲库并非是一系列完整歌曲,而是已经被 Google 处理过的歌曲特征指纹。为了平衡存储数量和识别效率,Google 将曲库分为了两类,其一是所有用户通用的核心区库,大约有 1.6 万首曲目,其二是为不同国家和地区提供了更符合当地场景的曲库(毕竟美洲大陆一般也不会播放东南亚歌曲吧),例如美国曲库大约就包含了 69k 首曲目的特征指纹。在设置过程中,你可以根据自己的听歌喜好自由选择地区,或者干脆选择自动。

接下来应用会申请一系列必要的权限,其中获取手机状态权限是为了监听用户是否在拨打电话或是设备自身正在播放声音(包括提醒声音和播放音频),关闭电池优化则是保证 App 即使在后台也可以自动识别歌曲。另外,因为曲库特征数据来自于 Google,所以记得配置好网络环境,最后等待曲库下载完成,就可以正式开始「邂逅金曲之旅」了。

使用、设置与故障排查

虽然 AMM 是一个偏「极客」向的开源项目,但它仍然有着较好的使用体验。值得称赞的是,它的 UI 设计已经尽可能还原 Pixel 原生「闻曲知音」功能,应用适配了 Material You 设计,并且全量支持动态取色和动态主题图标,能够跟随系统调色板变化 App 和图标的配色风格,所以在 Android 12 中运行会获得最好的视觉体验。另外 AMM 还提供了一个非常好看的桌面小组件。

邂逅金曲

主界面「Now Playing」则是我们使用和设置的功能入口,同时也集成了 Pixel 官方刚刚更新的手动触发识别按钮。

细心的你一定会发现,AMM 相比 Pixel 原生功能增加了一个「Updates」,在这里我们不仅可以查看已安装组件版本,还能切换、浏览和搜索离线曲库内容,甚至还根据歌手和专辑进行了分类。关于曲库操作的这些功能,可是连 Pixel 官方都没有提供(与此同时,Pixel 用户正在为切换曲库地区而愁容满面)。

在以上环境都配置完成的情况下,AMM 就已经可以进行听歌识曲功能:

后台自动识别:识别成功的结果会显示在主界面「Now Playing History」中,并且能够看到具体时间,方便我们确定具体是哪一首歌打动了我们;同时 AMM 也提供了将当前识别结果显示在锁屏界面的开关,用户还可以自定义样式、位置、点击操作等,不过该功能需要允许无障碍权限;

手动触发识别:点击按钮后 AMM 会弹出录制提示,等待进度环闭合后就会弹出识别结果;识别成功的话,用户可以通过询问 Google Assistant 搜索详细信息,或者调用手机内已安装的流媒体平台播放;无论是否识别成功,用户都可以点击「Playback」按钮回放刚才录制的音频,并能够保存为 PCM 格式文件。你也可以通过 AMM 提供的桌面小组件手动触发识别。

一些你可能会用到的优化选项

AMM 已经尽可能还原了 Pixel 原生的「闻曲知音」功能,不过这两者在原理上存在微小差异,暂时还不能做到像 Pixel 原生功能那样「傻瓜且智能」。关于 AMM 的实现原理我们放到文末来说,这里先来看有哪些选项可以进行优化。

为了平衡续航和识别功能,AMM 并不是一直在录制和识别周围的背景音频,而是每间隔一段时间就启动一次录制识别,用户可以在设置中通过「Period」「Buffer」选项来调整识别间隔以及缓冲时长。过短的时间间隔能够让识别更加灵敏,但也会带来更高的能耗,但时间过长也有可能错过广告插曲等背景音乐。如果你不希望 AMM 持续在后台监听音频,但又想尽快启动识别,可以使用「Trigger when Screen On」选项,这样只需要你在听到音频当下开启手机屏幕,AMM 将会被立即触发识别。

相对较新款的手机中,SoC 一般都会使用「大小核」设计,即使用性能更高的大核心去处理复杂任务,使用性能更低的小核心去处理简单任务。用户可以限制 AMM 仅使用小核心进行音频识别,这样能够降低 AMM 的耗电量,尤其是你设置了更短的时间间隔。我们可以在高级设置中找到这一开关,当然这也不一定适用于所有手机,我们可以观察开启前后的耗电量差异来判断该选项是否有效。

除此之外,AMM 还提供了夜间模式、备份和恢复、电源和流量使用限制等设置,大家可以根据需求自行调整。

如果 AMM 能够在手机上正常使用,我们建议其他设置保持默认即可。不过 AMM 虽然被设计为在尽可能多的 Android 设备上运行,但由于不同设备之间的硬件选型、系统魔改等存在差异,所以你的手机在默认设置下不一定能够正常使用 AMM。

如果不能正常使用…

当你测试很多遍之后仍然无法获得识别结果,就需要排查故障原因了:

回放音频异常:借助 AMM 提供的回放功能,我们可以确认「闻曲知音」能否正常录制音频。正常情况下,回放的音频至少是能够听出个大概;如果声音太小,那么就需要在高级设置中拉升「Gain」即音频增益;如果你听到的是一堆杂音,那么需要在高级设置中启用「Alternative Encoding」,根据开发者的描述,该选项会导致音频声音变小,所以还需要配合拉升增益。

On Demand 不支持:这一功能可以理解为「按需在线识别」,即当「闻曲知音」无法在离线曲库中匹配到任何歌曲时,允许音频上传至 Google 进行在线识别。显而易见,这项功能需要某些特殊的 Google 组件,然而遗憾的是,绝大多数国行手机都没有内置完整的 Google 套件,其中就包括这一功能所需的「Music Recognition Service」,并且该组件要求系统内建才能够正常运行。解决方法之一就是通过 Magisk 刷入对应模组,或是干脆给手机刷入一个国际版 ROM,具体操作方法可以查看应用内提示或 开发者的说明;另外,该功能仅支持 ARM v8 架构 SoC。

无法成功录制:我们在第一次使用 AMM 时一切正常,但过一段时间发现 AMM 不会在后台进行识别了,此时我们第一反应是通过手动识别进行测试;如果手动识别时应用多次提示录制失败,或者是卡在录制启动的 Loading 画面,我们就要去检查 App 的应用权限和后台电池优化选项是否正常,别忘了还有一个「闻曲知音」,因为它才是真正执行音频识别任务的那个主角。

殊途同归的实现方式

如果你读完以上部分,那么 AMM 应该可以正常使用了,如果出现了我们之前没有发现的问题,也可以前往项目 GitHub 主页提交 issues。如果你想了解关于「闻曲知音」和 AMM 的大致实现方式,可以继续往下翻。

正如开篇所说,Now Playing 其实是 Pixel 独占功能,因为 Google 基于 Pixel 手机特定的 DSP 硬件(音频信号处理器)开发出了一种音乐识别模型。而 DSP 原本可以用来实现「OK Google」这种低功耗、无接触的语音唤醒功能,即「热词监测」。

Google 对该功能进行了功能扩展,音乐识别模型就是通过热词方式来监听背景声音,如果判断背景声音是音乐,并且同时满足了多种条件(例如没有在拨打电话、设备自身没有在播放音乐等),则会录制 8s 音频转交给「Android System Intelligence」组件进行音乐识别,Now Playing 便是这个组件当中的一项功能。至于离线识别,其原理与在线识别相似,只是将筛选和压缩后的音频指纹库存储在本地。

Pixel 上的音频侦测和识别流程

由于识别模型是针对特定 DSP 硬件开发,它难以适配到其他手机上。根据 AMM 开发者的描述,这种音乐识别模型只是「判断音乐」而不是「检测音乐」,所以他另辟蹊径,绕过了 DSP 模型判断,直接让 AMM 定时触发并将结果注入到监测过程当中,再通过热词权限进行录音、递交至修改版的「Android System Intelligence」(即之后安装的「闻曲知音」应用),然后执行与 Pixel 相同的识别过程。这种方式存在一定劣势,那就是无法精确感知音乐的开始和结束,所以才有了刚才提到的识别间隔、缓冲时长以及亮屏触发等设置选项。

AMM 使用定时触发的工作流程

你可能会发现,在使用 AMM 录音时 Android 系统似乎并没有在状态栏弹出隐私指示标识,这正是由于使用了热词权限的原因。得益于 Android 12 更新,「热词监测」变成了一项系统权限,我们可以借助 Shizuku 这种「桥梁」赋予给应用,这也是为什么在 Android 12 上需要 Shizuku,而低版本则需要 Root 权限了。

借助 Shizuku 使用热词权限进行音频监测和识别的工作流程

虽然 AMM 只能通过定时触发这样的方式达成「被动音乐识别」的效果,在能效上肯定不及 Pixel 原生方案,并且现在主流设备也都使用了更先进的芯片(855 和 8 Gen1 除外)和更大的电池,能耗代价并没有那么显著,几天测试下来,AMM 和「闻曲知音」的耗电量远不及我们聊微信、刷抖音,甚至低于「连接至 Windows」这种常驻后台、频繁进行连接的服务,所以你可以放心地让它常驻后台。

以上就是关于 Ambient Music Mod 和「闻曲知音」相关介绍,如果你想要获得与 Pixel 近乎一致的「闻曲知音」体验,可以前往 Ambient Music Mod 的 GitHub 主页 查看和下载最新版。

参考资料

  1. AmbientMusicMod/faq.md at main · KieronQuinn/AmbientMusicMo
  2. AmbientMusicMod/Enabling-On-Demand
  3. Now Playing: Ambient Music Mod v2

> 下载 少数派 2.0 客户端、关注 少数派公众号,解锁全新阅读体验 📰

> 实用、好用的 正版软件,少数派为你呈现 🚀