浊音、清音、爆破音的时域与频域特征详解
先说一个我自己踩过的坑。早些年做语音识别前端特征总觉得中文的“爸”和“怕”、“八”和“爬”应该挺好分结果真拿录音去跑端点检测和音素切分分类器一片混乱。后来把波形拉进语音分析软件一看才明白问题出在哪浊音是准周期的小脉冲串清音像一段乱码噪声爆破音干脆先给你来一段静默再“砰”地炸开。三种东西的时域形态完全不是一回事频谱上更是截然不同。打那以后我养成一个习惯不管模型多复杂先看波形和语图再谈特征。这篇文章就围绕“浊音、清音、爆破音”这三类最常见的语音单元把它们的时域特性和频域特性拆开讲清楚。适合刚接触语音信号处理的学生、做语音算法和音频开发的工程师也适合对语音学和言语感知感兴趣的读者。看完你会明白为什么清浊音在波形上一眼就能分开、为什么爆破音的频谱能暴露发音部位、VOT 这个参数到底在量什么以及这些理论怎么变成实际可操作的测量方法。标题里的“时域”和“频域”不是两个孤立概念它们是同一个信号的两副面孔得放在一起看。1. 三类音的源头差异声带振动、气流湍流和腔内增压要理解时域和频域里那些形态差异先得回到发声源头。语音信号几乎都可以用“声源—滤波”模型来解释声源在声门处产生经过口腔、鼻腔这个可变形状的声道滤波器最后从嘴唇辐射出来。浊音、清音、爆破音之所以在波形和频谱上长得不一样根本原因是它们的声源类型完全不同。1.1 浊音的声源是周期性声门脉冲浊音voiced sound发声时声带靠拢并周期性开闭。气流冲击声门下压会让声带产生一种类似“拍打”的振动释放出一串脉冲。这个脉冲串是有规律的所以时域上看起来像一小段一小段重复的波形。每个脉冲对应一个基音周期基频 F0 就是每秒声带开合的次数。成年男性的 F0 大约在 100150 Hz周期大约 710 ms女性和儿童高一些F0 常在 200300 Hz周期 35 ms。元音、鼻音、边音以及英语里真正的浊塞音 /b/ /d/ /g/都属于这一类。声门脉冲不是理想尖峰它有“缓开快闭”的特点声带打开的过程相对缓和关闭的一瞬间却很干脆因此每个脉冲的频谱自带一个高频衰减趋势。这也是浊音频谱普遍向低频倾斜的原因之一。后续声道再把特定频段放大成共振峰才形成我们听感上的音色。1.2 清音的声源是湍流噪声清音voiceless sound发声时声带不振动两声带之间留出一条较宽的通道气流过去不会产生周期脉冲而是在某个狭窄位置形成湍流。湍流产生的声学信号本质上是随机噪声没有稳定周期。比如发 /s/ 时气流冲到齿背上噪声主要集中在很高频发 /sh/ 时舌面后缩噪声峰就移到中高频段发普通话的 /h/ 时噪源在声门附近频谱相对靠下且较平。因为声源是噪声清音波形看起来没有规律正负幅值来回跳像一个“毛刺状”信号。你很难从波形里找到重复单元这和浊音的准周期形态差别非常明显。1.3 爆破音的声源是一次瞬态冲击爆破音plosive也叫塞音的发声机制更特殊。它不靠单一类型的声源而是在三个阶段里出现不同声源。先是成阻发音器官完全闭合在口腔内憋住一口气继续积压气压然后是除阻闭合点突然打开腔内高压气体瞬间释放产生一个急促的瞬态冲击之后如果声门还开着呼出气流持续通过狭窄声门或口腔还会伴随一段送气噪声。所以爆破音在声学上从来不是一个稳定的“段”而是一个“事件序列”。这个特点决定了它在时域波形和频域语图上都特别醒目。1.4 普通话里“浊音”这个标签要谨慎这里必须提醒一下普通话拼音里的 b、d、g 经常被误当成浊音实际它们是“清不送气塞音”声带在除阻前后很短时间才开始振动和英语词首的 /b/ /d/ /g/ 性质不同。英语里成词的 boy 中 /b/ 在爆破之前声带就已经振了所以在语图上能看到一段低频浊音杠。普通话里真正的浊音是 m、n、l、r 以及所有元音而 b、d、g 属于爆破音中的清音。这个区分在语音学里很关键否则后面看 VOT 时容易对不上号。明白声源差异后面的时域和频域特征才有落点周期源产生准周期波形和线状谱噪声源产生随机波形和宽带谱瞬态源则产生孤立尖峰和宽频冲击谱。2. 时域波形准周期、随机噪声和“静默—炸开”的三幕剧打开录音软件看波形是理解三类音最快的方式。一条竖轴是振幅、横轴是时间的曲线能直观透露出信号的周期性和能量变化。只要不是信号特别糟糕的录音三类音的时域形态几乎一眼可辨。2.1 浊音的准周期脉冲串把“啊”这个音的一段波形放大你会看到波形按基音周期成块重复。每个周期内部有“突然起振—快速衰减—短暂平静”的节奏周期之间又不完全一样因为声带张力和声道形状时刻在微调所以叫“准周期”。这种周期性带来两个可量化特征短时能量比较高、过零率低。过零率就是每秒钟波形跨过零轴的次数周期信号低频成分占主导正负交替不那么频繁过零率自然低。我实际分析时最喜欢用“短时能量 自相关”的组合来找浊音段。把信号切成长度约 2030 ms 的窗窗内做自相关如果在某个延迟处出现明显的相关峰而且这个延迟正好落在常见基音周期范围内那这一段基本可以判定为浊音。这个方法比单纯看能量靠谱尤其背景底噪较大的时候能量可能骗人但周期性不会。2.2 清音是典型的随机噪声清音波形给人的第一印象是“毛”。它没有重复单元幅值高低起伏随机像白噪声被声道调制过的样子。零交叉频繁短时能量通常比浊音低但又不是完全安静。普通话里的 s、sh、f、h、x 都是典型代表。把 /s/ 和 /a/ 的波形放在同一屏上几乎不用做任何统计凭肉眼看重复性和毛刺感就能把两者分开。不过清音内部也有差异。像 /s/ 这种高频强噪声波形里的快速振荡更细密像 /h/ 这种频谱偏低的清音波形看起来稍“钝”一些。差异来自不同发音位置形成不同的滤波特性这部分在频域里会看得更清楚。2.3 爆破音的三段式时域结构爆破音最好玩它的波形常常像“静默—炸开—尾巴”的三幕剧。以普通话的“八”为例先是 b 的成阻段波形几乎是一条贴近零轴的细线甚至可以观察到一段压得很低的能量凹槽接着除阻瞬间波形出现一个明显的尖脉冲幅度可能瞬间冲得很高然后很快进入元音段波形重新恢复准周期形态。如果发的是“怕”p 除阻之后会多出一段送气噪声尾巴过几十毫秒后才接上元音。这段从除阻到声带开始振动的间隔就是后面要重点聊的 VOT。这里容易踩坑不要因为爆破音里有一段安静就把整段语音切掉。真正的爆破信息恰恰藏在“安静之后的那个爆发点”里。我在做音素边界标注时通常会把爆破起点尽量对准尖脉冲的起始沿而不是对准脉冲峰值因为峰值有一定滞后标在峰值会让后续对齐偏掉半个周期。2.4 从时域快速判断短时能量加过零率经典语音端点检测里短时能量和过零率是拍档。用 1025 ms 的短时窗滑过全段语音计算每个窗的能量和过零率基本能做个三分类类别短时能量过零率波形表现浊音较高且稳定低准周期脉冲重复感强清音中等偏低明显高乱噪声毛刺感强爆破音低后突高爆发处骤升静默凹槽后出现单次或短串尖峰实际操作时过零率要先做高通滤波去掉直流偏置和低频隆隆声否则一段 50 Hz 工频干扰就会让过零率整体失真。另外阈值不要取固定值最好根据整段信号的能量统计来动态设定环境变化时才有鲁棒性。3. 频域图谱谐波线谱、连续宽带谱和突发冲击谱时域里的周期性和噪声转到频域后就变成两种截然不同的形态浊音的能量集中在离散频率点清音的能量铺在连续频带上。爆破音则会以短时冲击的形式在语图上留下“竖条”般的痕迹。用傅里叶变换把信号从时间轴搬去频率轴是理解音色和发音部位的关键一步。3.1 浊音的频谱等间隔谐波加共振峰包络任取一段浊音做 FFT会得到一串离散的谱峰称为谐波。谐波之间的间隔正好等于基频 F0。一个 F0125 Hz 的男声元音频谱上会在 125、250、375 Hz……依次出现峰值间距均匀。整体包络并不是平的声道滤波作用会在某些频段形成明显凸起这就是共振峰 F1、F2、F3。元音音色主要由前两三个共振峰决定比如 /a/ 的 F1 高、/i/ 的 F2 高。谐波是时域准周期的傅里叶投影时域里每个脉冲周期对应频域的基频间隔。所以如果你分析窗口太短比如只用 3 ms不足一个基音周期频谱里就看不到清晰的谐波结构只会看到一坨模模糊糊的包络。想同时看到谐波和共振峰分析窗至少得覆盖两三个基音周期工程上一般取 20 ms 起步再长一些会更稳。3.2 清音的频谱连续宽带加分区集中清音没有周期源频谱不会出现等间隔谐波而是连续铺开的宽带噪声。虽然没有离散谱线但声道滤波依然起作用噪声会集中在某个频带。清擦音的“发音部位”直接反映在噪声峰的位置上这是听辨和机器识别的关键线索。常见普通话清擦音的频谱能量分布大概是音发音部位频谱能量集中区参考值f唇齿分布较宽整体强度偏弱s齿龈高频明显常集中在 47 kHz 以上sh龈后/卷舌中高频区大致 24 kHz 聚集x硬腭中高频约 35 kHz 集中h声门/软腭可从中低频一直延伸到中高频能量偏下这些数值会随发音人和语速变化不要当死标准但“s 比 sh 更高频、f 整体更弱更薄”这个相对规律非常稳定。做语音识别时若发现 /s/ 和 /sh/ 混先检查前端是不是做了过高频截至或者采样率不足频谱峰都被干掉了模型自然学不到区分信息。3.3 爆破音的频谱冲击被声道滤成“峰”爆破除阻瞬间产生的是一段极短促的宽频冲击理论上频率成分非常丰富。但这个冲击要经过声道这个滤波器所以呈现在频谱上不是平的而是在某些频段集中形成与发音部位相关的“爆破极点”。大致规律是双唇音 b/p闭合点靠前后方口腔腔体大爆破能量集中在低频齿龈音 d/t闭合点靠后前方小腔体产生的共鸣频率高爆破能量跑到高频软腭音 g/k闭合点更靠后能量集中在与后接元音紧密相关的中频段而且随语境变化很大。所以爆破音识别不能只看频谱峰值还要配合爆破后共振峰过渡才能定位发音部位。在声学语图上爆破音除阻瞬间表现为一条纵向的细竖线语音学里常叫“冲直条”送气段表现为接着的一小片乱纹再接元音时共振峰从爆破目标位置滑向稳态元音形成“共振峰过渡”的拱形轨迹。这一段图式几乎是辨认爆破音的金标准。3.4 宽带语图和窄带语图该看哪一张语图有宽带和窄带之分参数不同看的内容也不同。宽带语图频率分辨率低、时间分辨率高能清晰看到一次爆破的时间起点和共振峰的移动适合测 VOT、看过渡窄带语图时间分辨率低、频率分辨率高能把谐波一条条分开适合估 F0 和看浊音段谐波结构。我第一次独立做爆破音分析时用窄带语图找爆破起点怎么都对不准后来才意识到看错图了。记住这个分工切分事件用宽带测量谐波用窄带。4. 爆破音拆解VOT、送气和共振峰过渡是三位一体爆破音在所有音素里最难自动处理因为它不是一段静态声音而是“闭合—释放—过渡”的连续事件。要理解它绕不开 VOT、送气和共振峰过渡这三样东西。4.1 VOT 把清浊与送气一网打尽VOTVoice Onset Time嗓音起始时间定义为从爆破除阻瞬间到声带开始振动之间的时间差。它能把不同语言里的塞音对立量化类型VOT 大致范围例子浊塞音负值声带在除阻前已振动英语词首的 b、d、g清不送气塞音约 030 ms普通话 b、d、g清送气塞音约 60120 ms 或更长普通话 p、t、kVOT 负值时爆破前语图上会先出现一段属于浊音的低频横杠这叫“浊音杠”VOT 接近零时爆破瞬间和元音起点几乎重合VOT 较长时爆破之后会有一截只有噪声没有周期的送气段。测量时在宽带语图里找两个点除阻“冲直条”的起始位置以及周期性竖条纹开始出现的位置两者之间的时间间隔就是 VOT。4.2 送气段在时域和频域都有自己的影子送气是清塞音除阻后声门仍敞开时气流高速通过声门产生的噪声。它本质上接近清音但强度通常比真正的擦音弱频谱也更平。时域里送气段表现为爆破尖峰之后、元音开始之前的一段中等幅度毛刺频域里语图上是一片乱纹而不是某一处的强峰。普通话“怕”和“把”的听感差别主要就是这段送气噪声的有无和长短。做切分时这段噪声音素边界常被标进元音里导致后续共振峰分析多出一截“假元音”要特别注意。4.3 爆破后的共振峰过渡是第二张身份证除阻之后发音器官要从闭合位置迅速移动到后接元音的目标位置这个过程中共振峰频率是连续滑动的尤其是 F2 的走向非常有规律。双唇音后接某个元音时F2 过渡往往自下往上接近目标齿龈音常在较高位置起步软腭音则容易表现出“从中间频段向目标靠拢”的形态不同后接元音下差异很大。人耳其实对共振峰过渡很敏感。实验里哪怕把爆破尖峰等时域冲击剪掉只留下共振峰过渡听者依然能在相当程度上辨认出是哪个爆破音。这说明爆破音的识别线索是时间和频率耦合的不是单个“冲直条”就足够。做声学特征时只用某一帧静止特征往往不够得靠差分特征把共振峰的变化趋势也送进分类器。4.4 清/浊爆破音在语图上的差别有清浊对立的语言里爆破音的时域事件结构会多出“浊音杠”。闭锁期间声带如果继续振动低频就有一条明显横杠这就是浊塞音和清不送气塞音的最大区别。普通话 b 在语图上闭锁段几乎干净英语 /b/ 在词首常带一段低频浊音杠。看波形时浊音杠会让“静默段”并不完全静默而是有一串很低幅的周期振动。这种细微差别正好解释了为什么直接用静音检测来判断爆破音闭合段时会漏掉浊塞音需要先把周期检测做在前面。5. 把这些特性变成可复现的操作测量、编程与常见坑理论知识说完了上点能直接落地的内容。不管是做实验记录、音素标注还是给模型提取特征下面这套操作流程基本够用。5.1 用 Praat 读波形和语图Praat 是语音学分析里最常用的免费软件。打开音频后建议先切出要分析的单音节再生成宽带语图语图窗长设为 5 ms 左右的典型宽带参数。看准“冲直条”的位置再用光标差测量爆破起点到周期性竖条纹起点的时间就是 VOT。要检查谐波结构时再生成窄带语图窗长 30 ms 上下即可。如果录音底噪过大先做一次轻度带通滤波比如 808000 Hz再去测 VOT否则底噪产生的伪周期竖条容易让人误判元音起点。5.2 用 Python 快速提特征想让流程自动化可以用 Python 做一套简短的时域 频域特征提取。以下代码涵盖了短时能量、过零率和指定片段频谱三个最常用的工具import numpy as np from scipy.io import wavfile sr, x wavfile.read(ba.wav) if x.dtype np.int16: x x / 32768.0 # 归一化到 [-1, 1] def short_time_features(x, sr, win_len0.025, hop0.010): win int(win_len * sr) hop int(hop * sr) energies, zcrs [], [] for i in range(0, len(x) - win, hop): seg x[i:iwin] energies.append(np.sum(seg ** 2)) # 过零率符号变化次数占比 zcrs.append(0.5 * np.mean(np.abs(np.diff(np.sign(seg))))) return np.array(energies), np.array(zcrs) def segment_spectrum(x, start, dur, sr, nfft1024): seg x[start:int(start dur * sr)] seg seg * np.hanning(len(seg)) # 加窗避免频谱泄漏 spec np.abs(np.fft.rfft(seg, nfft)) freqs np.fft.rfftfreq(nfft, 1 / sr) return freqs, spec energies, zcrs short_time_features(x, sr) freqs, spec segment_spectrum(x, 0.3, 0.05, sr) # 以实际时间点为准那段频谱代码里nfft 等于 1024 时在 16 kHz 采样率下频率分辨率约为 15.6 Hz看谐波没问题如果只关心共振峰包络窗长加长、nfft 加大能平滑细节。要注意的是从 wavfile 读回来的 int16 数据如果不除以 32768短时能量计算会得到很大的数值后面比较阈值时容易莫名其妙失效。5.3 容易翻车的几个细节我在实际分析中反复踩过这些坑列出来给大家避一避采样率低于 8 kHz 时/s/ 的高频能量直接被截掉硬用频谱峰值判断舌尖音几乎必错。不加窗直接做 FFT频谱泄漏会让谐波之间互相污染低频段尤其明显。矩形窗在测谐波问题上是最差的选择之一。分析窗长小于一个基音周期看不到谐波结构。低频男声基频可低到 100 Hz一个周期就有 10 ms窗长至少给 20 ms。过零率对环境低频特别敏感先做 80100 Hz 的高通滤波再算过零率。测 VOT 时底噪不能太大否则爆破起始前沿会被噪声挡掉把 VOT 量长。女声和童声基频高谐波间距大低频谱峰稀疏容易把某一根高次谐波误当成 F1。看共振峰时最好叠加 LPC 包络而不是直接看原始谱尖峰。5.4 这些特征怎么落到识别系统里传统前端特征里MFCC 自带共振峰包络信息差分 MFCC 又能把共振峰过渡的动态趋势带进去所以声学模型要分爆破音光靠静态特征是吃亏的得给足上下文。在端到端系统里模型虽然会自动学习但输入音频仍受采样率和频率响应的限制前端切掉的频段是永远补不回来的。而浊音/清音判断在唤醒词检测和 VAD 里依然依赖“周期性 过零率”这类底层特征理解它们的物理意义排查问题时才不会被一堆抽象参数绕进去。最后再分享一个我这些年养成的习惯无论模型多复杂拿到一段语音先画一条波形和一个宽带语图看五秒再送进后续流程。浊音、清音、爆破音在时域和频域上的差异不只是教科书概念它最能帮助排查数据标注错误、判断切分边界也能让你在模型报错时大概猜出是哪个声母出了问题。真正动手测过几十段录音之后你会对哪类特征稳定、哪类特征受环境影响大形成一套自己的手感这个手感比任何现成参数都金贵。