状态:草稿(2026-10-13),已反映实测(包含否定结果)。 分类实验与劣化实验是 2026-10-11–12 在 CPU 临时 Pod 和笔记本电脑上测得的数值。末端(得分)效果并非实际声音,而是由标准答案时间点制作的 模拟 onset 测得的。手机录音条件未实测。论文中的数值标记为「论文」。编写规则:以实测数据为基础,未能测得的数据标记为「未实测」。
目录
1. 为什么是声音
在乒乓球馆里,即使闭上眼睛也能跟随多拍对拉。沉闷的「咚」球台声和清脆的「啪」球拍声交替传来。声音之所以迷人,原因有三。
- 在视频薄弱的环节表现坚挺。 即使画面昏暗、球发生拖影或被运动员身体遮挡,声音依然听得见。第二篇中球寻迹严重崩塌的条件(昏暗 0.685,遮挡 0.842)对声音没有影响。
- 时间更密集。 60fps 视频每 16.7ms 一帧,而 44.1kHz 的声音在 1ms 内有 44 个采样。能够比视频帧更准确地抓出弹跳瞬间。
- 直接区分击球与弹跳。 对于第五篇中最常见的失误“将击球误读为弹跳”,声音可以直接回答“那一瞬间听到的是球拍的声音”。
2. 原理一:onset 检测
onset 是声音突然开始的瞬间。球触台的声音是在几毫秒内急剧上升随后消失的短促冲击音,找到 onset 就能获得弹跳时间点。
直观理解就是“声音强度比刚才突然变大的地方”。计算通常分三个步骤。
- 制作 onset 强度曲线。 在每个短窗口(数毫秒)内测量能量,或者按频率分量仅累加比前一个窗口增加的量(spectral flux)。只看增加量的原因是,为了捕捉的不是声音持续的期间,而是 开始的瞬间。
- 跟随基准线。 由于周围噪声水平每时每刻都在变化,因此不使用固定的阈值,而是将近期平均值(移动平均或指数移动平均)的若干倍用作阈值。
- 挑选峰值。 将超过阈值的局部最大值作为 onset,并将过于接近的峰值合并为一个。
该领域的经典综述是 Bello 等人的 onset 检测解析(IEEE Trans. Speech and Audio Processing, 2005),而 Python 的 librosa 提供 onset.onset_detect 来实现“从 onset 强度曲线中挑选峰值”。
乒乓球声音论文(Gossard et al., arXiv 2409.11760, IEEE STAR 2025)选择了更简单的道路。通过 10kHz 高通滤波器(5阶巴特沃斯)切除低频噪声,并将 1ms 窗口的能量与指数移动平均进行比较。由于击球声音的高频成分很强,绝大多数人声或脚步声都会被滤波器过滤掉。在干净的录音中,准确率为 0.98、召回率为 1.00,即使混入人声也是 0.98 和 0.95(论文,录音时将定向麦克风放置在距离运动员 50cm–2m 处)。
3. 原理二:表面分类
找到 onset 后,需要区分“这是撞击了什么东西的声音”。截取 onset 后的短片段(TT Sounds 为 15ms)提取特征并进行分类。
特征是将声音的“音色”用数字进行总结。我们的实验使用了 77 维。包括符合人耳频率感知的 20 个 MFCC 的均值与标准差、频谱重心和频宽等形状指标、各个频段的对数能量等。球台是宽大的面板,会产生低沉而持久的回响;球拍由橡胶和木头制成,声音短促而沉闷。这种差异体现在特征中。
简单的分类器就足够了。我们对比了逻辑回归、随机森林和基于直方图的梯度提升(HistGradientBoosting)。论文报告称,使用小型 CNN 进行表面分类的 F1 值为 0.97,笔记本电脑 CPU 耗时 4.2ms(论文)。
4. 实测:在干净的录音中近乎完美
使用了 TT Sounds(蒂宾根大学,CC BY-NC 4.0)的 5,702 个 15ms 样本。其中球拍 3,396 个、球台 777 个、地面 290 个、其他 1,239 个,是从原本 115 个录音中裁剪出来的。
有一个重要的决定。数据集给出的 80/20 划分是 从同一录音中裁剪出的邻近样本同时进入了训练集和测试集。 邻近样本的声音几乎一样,测试实际上变成了询问背过的题目。因此, 以原始录音为单位进行五折交叉验证,确保测试集中只包含从未听过的录音。如果按数据集的划分来测,数值会高出 0.1–0.8%p。
| 任务 | 逻辑回归 | 随机森林 | HistGB | 球台召回率 / 准确率(逻辑回归) |
|---|---|---|---|---|
| 球台对球拍 | 99.3% | 98.9% | 99.1% | 98.3% / 98.1% |
| 球台对其他三者 | 98.8% | 98.8% | 98.9% | 97.0% / 94.5% |
| 四种 | 97.4% | 97.5% | 97.6% | 97.3% / 96.3% |
提取特征单个样本耗时 4.7ms,预测耗时 0.001–0.04ms(CPU)。实时性完全足够。
5. 实测: 条件变差时
仅对相同样本的测试折施加劣化。人声混入了实际教练的语音,音乐和混响则是合成的。这是“是否为球台声音”的召回率 / 准确率。
| 条件 | 仅用干净声音训练 | 混入劣化训练 |
|---|---|---|
| 干净 | 0.946 / 0.972 | 0.891 / 0.991 |
| 白噪声 SNR 20dB | 0.623 / 0.992 | 0.960 / 0.979 |
| 白噪声 SNR 10dB | 0.009 / 1.0 | 0.945 / 0.960 |
| 人声 SNR 0dB | 0.738 / 0.740 | 0.860 / 0.923 |
| 隔壁球台弹跳 0dB | 0.983 / 0.407 | 0.940 / 0.605 |
| 麦克风 8m(合成混响) | 0.421 / 0.968 | 0.852 / 0.911 |
两点非常明确。
- 仅学习干净声音的分类器会在噪声面前崩溃。 在白噪声 SNR 10dB 下,只能找到 0.9% 的球台声音。如果在训练时混入噪声、人声和距离因素,大部分都能找回(0.85–0.96)。
- 即使混入训练也无法区分隔壁球台的声音。 准确率停留在 0.61–0.77。因为隔壁球台的弹跳也是相同的球台声音。仅凭 15ms 的片段无法判断是不是“我们这里的球台”。这就是为什么在有多张球桌的球馆里 不能仅凭声音来判定弹跳 的原因。
6. 否定结果:在实际录音中未确认到效果
以上都是干净的分离录音。真正的问题是:“在与比赛视频一同拍摄的声音中是否也行得通?”
首先碰壁的是数据问题。 OpenTTGames 视频没有音轨(经 ffprobe 确认 12 个视频都只有一个视频流)。没有找到视频、声音和弹跳标准答案同时存在的公开数据集。
因此,我们使用了视频中包含声音的 T3Set(业余多球训练,CC BY-NC-SA 4.0)。视频文件(mkv)中通过相同的容器附带了声音(AAC 44.1kHz),因此可以保证视觉对齐。我们在 8 个回合(8 名运动员)中接入了上述分类器。
| 观察 | 值 | 期望 |
|---|---|---|
| 几乎无声的回合 | 8 个中有 2 个(onset 0 个,1 个) | 0 |
| 球拍传感器(IMU)测得的击球时间点 ±30ms 内的球拍声音 | 8–16 次击球中有 1–5 个 | 几乎全部 |
| 击球之间的球台声音数量 | 分散在 0–15 之间 | 多球训练的话应接近 2 |
没有得出能够在实际训练场录音中区分弹跳的依据。 衡量标准本身也很薄弱。球拍传感器的时钟与视频文件名(以秒为单位)的偏差在各个回合中从 -1.5 秒到 +3 秒不等,连击球时间的对齐都发生了摇晃。因此声音没有被纳入引擎。
模拟实验:如果有声音,得分为多少?
既然没有视频、声音和标准答案同时存在的数据,我们就从 12 场实际比赛的标准答案弹跳与击球时间点中制作了 假 onset 来测量“如果存在这种质量的声音会怎样”。再次强调,这并非实际声音。由于设计上声音不会改变判定结果,而只会改变“需要确认”,因此所有行中的胜者准确率仍保持在 93.1% 不变。
| 声音质量(模拟) | 未经确认即错误 | 需要确认 |
|---|---|---|
| 无声音(基准) | 10 | 41.1% |
| 干净的近距离麦克风(召回 0.95,时间抖动 5ms,已同步) | 8 | 41.8% |
| 盲目相信 T3Set 水平(召回 0.2,标签 30% 颠倒) | 7 | 54.2% |
| 相同的声音,判定为“声音健康度低”并忽略 | 10 | 41.1% |
| 声音与视频相差 100ms,未同步 | 3 | 77.8% |
| 相差 100ms,通过同步排除 | 8 | 41.8% |
解读方法如下。干净且同步的声音将 2 起未经确认的错误判定拉到了人工面前。未同步的声音会导致球拍声音与弹跳位置重合,使需要确认的数量翻倍。由于人工必须重新观看几乎所有多球对拉,因此毫无用处。 要想使用声音,必须首先进行声音-视频偏差估计和“这个声音是否可信”的判定。
7. 如果要接入的话
接入引擎时的设计已经确定。
- 如果在弹跳候选 ±20ms(60fps 单帧)内存在“球台”onset,则提高该弹跳的可信度。
- 如果在球台区域内发生 V 判定,但那一瞬间的声音是“球拍”,则将其视作击球(针对第五篇的“将击球误读为弹跳”)。
- 在球看不见期间听到的球台声音,仅作为“纯声音弹跳”上传至确认画面,不传递给裁判(因为不知晓具体落点)。
- 如果没有视频候选,绝不单独仅凭声音计算弹跳(针对隔壁球台)。
- 为每段声音计算健康得分(0–1),若得分低则不使用该声音。 切勿将缺失的证据当作反向证据。
在此之前,有一项必不可少的事情。 按照拍摄指南拍摄的手机视频,以及人工标注了弹跳时间的测试集。 手机麦克风、乒乓球馆的回响、隔壁球台的声音会使上述数值产生怎样的变化,必须拥有该测试集才能测出(未实测)。我们也调查过利用预训练的通用音频嵌入来构建抗噪声能力强分类器的方法,但目前尚未开始实验(进行中)。
TT 寄语。 在安静房间里录制的“咚”声识别率达到了99%,但在真正的乒乓球馆噪音下还无法识别。把做不到的地方也记录下来,是下次少走弯路的秘诀。
参考
- Gossard et al., Sound-Based Spin Estimation in Table Tennis: https://arxiv.org/abs/2409.11760
- TT Sounds 数据集: https://github.com/cogsys-tuebingen/tt_sounds (README 中为 CC BY-NC 4.0)
- Bello et al., A Tutorial on Onset Detection in Music Signals, IEEE Trans. Speech and Audio Processing 13(5), 2005
- librosa
onset.onset_detect: https://librosa.org/doc/0.10.2/generated/librosa.onset.onset_detect.html - T3Set: https://zenodo.org/records/15516144 (CC BY-NC-SA 4.0)
- 我们的测量:仓库
docs/tt/PERFORMANCE.md2.7(声音实验)、2.9.6、代码experiments/sound/·experiments/fusion/sound_robust.py