采样率、位深、声道:喂给 ASR 的音频该长什么样
送进语音识别系统的音频不是随便什么格式都行:采样率要和模型训练时一致,声道要合并成单声道,音量要落在合理区间,编码最好一路无损到底。 任何一条不满足,识别质量都会掉,而且掉得毫无征兆——系统不报错,只会安静地给你一份更差的转写。
这属于语音识别四个环节里的第一环,音频前处理,是整条链路里最不起眼、也最容易白白丢分的地方。
采样率:模型在哪训练的,就得喂哪个
采样率决定音频每秒记录多少个采样点,也决定了它保留了多高的频率成分。物理约束很硬:一段音频能表示的最高频率是采样率的一半,更高的成分在采样那一刻就丢了。
现在的语音识别模型绝大多数在 16 kHz 上训练,这是宽带语音的事实标准。你喂一段 44.1 kHz 或 48 kHz 的录音(音乐和视频的常见采样率),或一段 8 kHz 的电话录音,特征分布都和训练分布对不上。
办法只有一个:送进模型前重采样到模型要求的采样率。多数推理框架会自动做,但也有不做的。识别质量莫名其妙差一截时,第一件事就是核对音频采样率和模型期望的是不是同一个数。
重采样有方向差别:降采样(48 kHz → 16 kHz)丢弃的高频对语音识别帮助本来就有限;升采样(8 kHz → 16 kHz)只是在已有采样点之间插值,填不进任何新信息。
电话 8 kHz:这是信道给的上限,不是格式问题
传统电话网按 8 kHz 采样,频率上限只有 16 kHz 采样的一半。那些高频细节——s、sh、f 这类清擦音赖以区分的成分——在采集和传输那一刻就没进来。
于是很多人会想:升采样到 16 kHz 再喂给 16 kHz 的模型,是不是就好了?
不是。 升采样改变的只是数据的排列密度,不是信息量。插值出的新采样点全部由既有采样点算出,没有引入任何原本不存在的高频内容。做完之后你得到的是一段”采样率标着 16 kHz、内容却仍是窄带”的音频。
升采样的价值是格式对齐,让音频符合模型的输入规格,这值得做;但它不提升音质,也不提升识别率。电话场景真要提效果,路径是换用在窄带数据上训练或微调过的模型。源头没有的东西,后期一律补不回来。
单声道化:混,但要看怎么混
多数识别模型只吃单声道,立体声或多声道音频必须先合并成一路。常见做法两种:
| 做法 | 适用情况 | 风险 |
|---|---|---|
| 取其中一路 | 两路内容不同(例如通话录音一路是主叫、一路是被叫) | 直接丢掉另一路的内容 |
| 多路取平均 | 两路是同一声源的不同拾音 | 若两路存在相位差,叠加会产生频率相消 |
判断依据很简单:先弄清楚这几路声道到底装的是什么。
- 分轨录音——比如客服系统把坐席和客户分别录在左右声道——平均下来就是把两个人混成一团,天然分好的说话人白白毁掉。正确做法是两路分别识别,再按时间合并。
- 同一声源被多个麦克风拾取,两路之间存在到达时间差,直接相加会在某些频率上互相抵消。这时要么只取拾音较好的一路,要么用专门的阵列处理方法。
- 同一路信号复制成两声道(不少转码工具的默认行为),怎么处理都无所谓。
位深与增益:别太小,更别削顶
位深决定每个采样点用多少位表示振幅。16 bit 是语音处理里最常见的选择,动态范围足够覆盖正常说话音量。常出问题的不是位深本身,而是录进来的音量:
- 音量过小:波形只占取值范围里很窄的一段,量化误差相对信号就变大了,等效于引入一层底噪。事后做增益归一能把音量拉上来,噪声却同比例被拉上来,损失已经发生。
- 削顶失真(clipping):音量超过能表示的上限,波峰被硬生生削平。这是不可逆的破坏——被削掉的部分不是变小了,而是变成了错误数值,还会生成大量原本不存在的谐波。
削顶远比音量小严重。录音端设增益时宁可留有余量,也不要贴着上限走。
容器与编码:无损优先,裸流要标清楚
音频文件由容器(wav、mp3、m4a、ogg 等外壳)和编码方式两层组成。对 ASR 要注意两件事。
第一,有损压缩会实实在在地损伤识别输入。 有损编码的设计目标是”人听不出差别”,它按心理声学模型丢掉人耳不敏感的成分。但模型的”耳朵”和人耳不是一回事,被丢掉的部分未必对模型无关紧要。更麻烦的是多次转码累积:录制压一次、上传又压一次、转格式再压一次。原则是尽量全程无损,实在要压只压一次。
第二,PCM 裸流没有文件头,参数必须靠外部约定。 很多实时链路传的是不带头信息的原始采样数据,接收方只能靠事先约定来解释这串字节。常见标注写法是 s16le:s 指有符号整数,16 指每个采样点 16 位,le 指小端字节序。再加采样率和声道数,才是完整的参数说明。字节序搞反是这里最典型的事故——高低字节颠倒后波形变成一段无意义的强噪声,识别结果自然是彻底的乱码。
做重采样和格式转换,用通用的音频处理命令行工具就够了,把目标采样率、声道数、编码格式显式写清楚即可。但命令跑通不代表结果正确,转完之后实际听一段,并确认输出参数确实是你要的那几个值。
排查表:从症状反推音频参数问题
| 症状 | 可能的音频参数问题 | 怎么改 |
|---|---|---|
| 识别质量整体差一截,但句子结构还算通顺 | 采样率与模型期望不一致 | 核对音频实际采样率,显式重采样到模型要求的值 |
| 清擦音(s、sh、f)系统性识别错 | 音频源本身是窄带,高频没采进来 | 换窄带训练的模型,别指望升采样 |
| 转写内容像两个人的话混在一起 | 分轨录音被平均成了单声道 | 改为两路分别识别再按时间合并 |
| 音量看着正常但识别忽好忽坏 | 存在削顶失真 | 检查波形是否有削平段,从录音端降增益重录 |
| 整体像蒙了一层,安静段也不干净 | 录音增益过低,量化噪声占比高 | 提高录音端增益,而非事后拉音量 |
| 转写完全是乱码,毫无语义 | PCM 裸流的字节序或位深解释错了 | 核对 s16le 这类参数是否与发送端一致 |
| 同一段内容,源文件识别正常、转码后变差 | 中间经过了有损压缩,或压了多次 | 回到无损源头,减少转码环节 |
用法和四环节那张表一样:先定位到具体参数,再决定要不要动模型。音频参数的修复成本远低于换模型。
常见问题
问:所有 ASR 模型都要求 16 kHz 吗?
不是必须,但这是目前最普遍的建模采样率。正确做法是查所用模型的文档确认它期望什么,别照抄别的模型的配置。
问:手头只有 48 kHz 的会议录像,降到 16 kHz 会不会损失效果?
降采样丢掉的是语音识别本来就用不上的高频,正常情况下不会带来可感知的损失。更该担心的是这段录像的音轨有没有被有损压缩过多次。
问:既然升采样没用,电话音频还要不要转成 16 kHz?
要转,目的是格式对齐。模型期望 16 kHz 输入就得给它 16 kHz 的数据,只是别把这一步理解成”音质提升”。
问:降噪要不要在这一步做?
要单独判断——过度降噪会损伤语音本身的结构,未必是净收益。取舍见降噪和回声消除该放在哪。
相关阅读
本文讲的是通用的音频工程原理,不绑定某一个具体实现。 各家系统对输入音频的要求、是否自动重采样,差异很大,请以官方文档为准。 我们没有对文中提到的任何方案做过实测,因此不给准确率、速度一类的数字。