阈值是怎么在真实录音上测出来的
什么算作一次“呼气”,不是靠猜,而是从用户发来的真实声音样本里定出来的。这项工作是怎么做的。
阅读约 5 分钟
要让应用把一个声音算作呼气,那个声音必须比房间的安静高出一定的量。那么这个“一定的量”是从哪来的?
一开始靠猜。之后靠测。
为什么从猜开始
加一种新呼吸法时,我们手上一份它的录音都没有。阈值是从相似的呼吸法那里搬来的:从嘴呼气的,用同一类里另一种嘴呼吸法的值;鼻腔的,用鼻腔那一类的。
那个猜测通常大致是对的,但不精确。应用的文字不掩饰这一点——某个值没有来源时,它会写“初始值,等数据到了再测”。
测量怎么做
从打开了匿名分享和声音样本分享的用户那里,偶尔会有一次练习的声音到达。随它一起到的还有那次练习的报告和原始时间线:目标呼气原本预期在第几秒、应用在哪些时刻检测到了呼气,以及底噪是多少。
有了这两样,测量才成为可能。音频文件会被送进应用自己的检测代码——同样的代码、同样的算法——只是把阈值换掉。然后问:在哪个阈值下,捕捉到了多少次目标呼气,又出现了多少次误判?
结果是一张表:
| 阈值 | 捕捉到的呼气 | 多出来的事件 |
|---|---|---|
| 当前 | 32/61 | 74 |
| 略低 | 35/61 | 74 |
| 更低 | 35/61 | 74 |
如果捕捉数上升、误判没上升,就把阈值调低。如果两者都上升,就保持不动。
一个真实的例子
应用给底噪能低到多少设了一个下限:它防止阈值在非常安静的房间里变得过于灵敏。
在一份平板录音里,真实的底噪测出来远低于那个下限。因为下限假定底噪比实际更高,呼气的余量被吃光了,什么都听不到——一个在离平板一掌远的地方呼气的人,被告知“把设备拿近些”。
我们在二十一份真实录音上扫了一遍,把下限调低:捕捉到的呼气次数上升,误判的次数没有变化。单是那一次练习,就从四分之零变成了四分之二。
这样的修正靠猜是找不到的。没有那份录音,我们甚至不会知道问题存在。
这是声音样本分享唯一的用途
发送过来的声音只为这一件事被听:测量呼吸检测的准确度。它不用于任何其他目的,不交给第三方,发送后会从你的设备上删除。
如果它是关着的,任何一次练习都不会录音。没有这项权限,应用照样完整地工作——只是新呼吸法的阈值会多当一阵子的猜测。
还没测的
写下这段时,仍有一些呼吸法的阈值跑在初始值上:录音还没积累够。随着积累,同样的扫描会再跑一遍,值也会更新。
所以应用的测量准确度,是跟着用它的人一起长起来的。