)
1. 先說清楚濁音、清音、爆破音到底在講什么做語音信號處理的人包里都應該有一份“聲音三兄弟”的檔案。不管是做語音識別、說話人識別、語音合成的音素切分還是對音頻做端點檢測第一個繞不開的就是把這段音頻里到底哪些片段是濁音、哪些是清音、哪些是爆破音這件事整明白。這個項目標題雖然看著像教科書目錄但它其實是我日常調試算法時最常翻的案頭手冊。簡單給大家建立個共識濁音是聲帶振動、帶有準周期激勵的聲音比如漢語普通話里的元音[a][o][i]以及[b][d][g]這類濁輔音清音是聲帶不振動、靠氣流穿過聲道狹窄處產(chǎn)生湍流噪聲的聲音典型如[s][f][h]爆破音指發(fā)聲時先形成完全閉塞然后突然釋放的那類輔音像是[p][t][k]這種“憋一口氣再炸出去”的聲音。這個內容適合誰看我覺得主要是三類人一是剛入手語音識別、關鍵詞喚醒項目卻總在切音素、標數(shù)據(jù)上栽跟頭的工程師二是做音頻內容分析、需要從波形圖判斷發(fā)音類型的從業(yè)者三是對語音學好奇、想靠代碼把“聲音長得什么樣”這個問題徹底弄明白的學習者。只要你想通過時域波形和頻域頻譜來理解一段語音這篇文章就能直接拿來當“看圖指南”。接下來我按我自己分析語音的習慣把三類音從時域到頻域逐一拆開講每一步都會把你需要關注的參數(shù)、判斷標準、可能踩的坑寫清楚。2. 時域上的“長相”波形、能量和過零率怎么說活時域分析是打開音頻文件的第一個視角。所謂時域就是看聲音的振幅隨時間怎么變化。樸素地說這段波形像什么是正弦波一樣的起伏、還是密密麻麻的毛刺直接決定了我們對聲音類型的初步判斷。在語音端點檢測和音素切分的實戰(zhàn)當中這個視角不需要太復雜的東西三個參數(shù)就夠用了短時能量、短時過零率、以及波形是否表現(xiàn)出周期性。2.1 濁音波形里藏著“穩(wěn)定的心跳”濁音最直觀的時域特征是周期性。隨便抓一段元音波形放大看你能看到一個個重復出現(xiàn)的“鼓包”每一個鼓包對應一次聲帶開閉。這個鼓包的重復速率就是基頻F0成年男性一般落在80到200赫茲區(qū)間女性大概是180到400赫茲。在實際波形上這個周期表現(xiàn)為每隔固定的時間間隔波形就會以相似的形狀重復出現(xiàn)。我在做音素切分時最常用的一個判斷方法就是看這一段波形有沒有“穩(wěn)定的心跳”。如果有規(guī)律的峰谷起伏且振幅明顯高于靜音段那幾乎可以斷定是濁音段。這里要特別注意一個細節(jié)濁音的振幅并不是恒定的開元音比如[a]的振幅通常會比閉元音[i]大輔音前的濁音段往往幅度會先衰減。所以不要只盯著絕對振幅判斷要關注波形形態(tài)的相似性說得直白點就是“像不像同一個模子刻出來的”。短時過零率在濁音段的表現(xiàn)也很有特點。過零率簡單理解就是單位時間內波形穿越零軸振幅為0的水平線的次數(shù)。因為濁音能量集中在低頻低頻成分意味著波形在一個周期里穿越零軸的次數(shù)不多所以濁音的過零率通常比較低一般在幾十次每秒到兩三百次每秒的區(qū)間。這個指標在靜音和清音的對比下特別有區(qū)分度后面做自動分類的時候短時過零率是第一個進特征列表的。另外做濁音端點檢測時短時能量是最經(jīng)典的工具。一般會先對信號取一幀比如25毫秒一幀、10毫秒幀移然后計算這一幀的幅值平方和或者對數(shù)能量。濁音段的短時能量顯著高于靜音段也明顯高于大部分摩擦音這是它作為“有聲音”的天然優(yōu)勢。但切記在靠近清音邊界的濁音段能量會有一個漸變過程閾值設置不合理的話很容易把清音起始處的低能量段誤判成靜音。2.2 清音滿屏毛刺毫無規(guī)律清音的時域波形和濁音完全不是一個畫風。因為沒有聲帶振動作為激勵源波形表現(xiàn)為高頻的、隨機震蕩的噪聲樣信號像是一把細砂撒在屏幕上沒有任何可重復的規(guī)律。拿[s]這個典型的清擦音來說波形看上去就是密密麻麻的毛刺振幅相對濁音往往偏小但毛刺的密度極高。過零率在這個場景下是最好用的判別指標。清音因為高頻成分占主導波形穿越零軸的頻率非常高往往能做到每秒幾萬次。當然這個數(shù)值和采樣率有關如果音頻是16kHz采樣清音段的短時過零率通常會大幅跑贏濁音段。我曾經(jīng)做一個簡單的清濁判別器就靠“短時能量短時過零率”兩個特征在干凈錄音上準確率已經(jīng)能到九成以上可見這兩個時域特征對清濁區(qū)分是真的硬核。不過有兩點要提醒。第一清音的振幅分布并不均勻同一個[s]在詞首、詞中、詞尾能量差異會很大尤其是處在弱讀音節(jié)里的清音能量只比靜音高出一點點第二有些摩擦音比如[z][v]其實是濁擦音它既有摩擦噪聲成分底下又疊著聲帶振動的周期性這類音在時域波形上會表現(xiàn)出“毛刺里裹著周期突起”的混合形態(tài)切分時別被它迷惑。2.3 爆破音靜默、尖刺和過渡的“三段式”爆破音在時域上是三兄弟里最有辨識度的因為它們自帶劇情先安靜再炸開然后收尾。以普通話/p/為例。你先看到一段接近靜音的閉塞段——這是雙唇閉合、氣流積聚的時間窗口波形幾乎是一條平線緊接著是一個極短的、振幅劇烈跳變的脈沖尖峰這是爆破瞬間的burst尖峰之后會接上一段過渡可能是濁音的開始也可能是一個弱噪聲尾巴取決于這個爆破音后面跟的是什么音。我看到很多新手第一次看爆破音波形時最大的困擾是“找不到閉塞段在哪兒”。這其實是個經(jīng)驗問題你要先找到burst那個突刺然后從突刺往前找一段時間窗窗內能量極低且波形幅度沒有明顯起伏那段就是閉塞段。閉塞段的長短因人而異可能只有30毫秒也可能長達150毫秒發(fā)音越用力、閉塞越完整這段“靜音”就越明顯。爆破音的另一個時域關鍵時刻是VOT即嗓音起始時間指的是從爆破釋放到聲帶開始振動之間的時間間隔。普通話不送氣清塞音比如[b]的VOT接近零甚至為負送氣清塞音比如[p]的VOT則較長往往在60到100毫秒以上。這個參數(shù)在時域波形上很好量看上burst后到波形出現(xiàn)周期性鼓包之間隔了多久。這個值不光是語音學研究的指標在語音合成里控制送氣感時我調的就是它。如果再往細節(jié)里摳爆破音的脈沖尖峰往往不是單一的正弦峰而是一個帶有高頻衰減振鈴的窄脈沖。這個振鈴在時域看上去像尖峰之后緊接著幾個快速衰減的小振蕩它對應的是聲道在爆破瞬間被寬帶激勵后的快速響應。分析爆破音時這段“炸開后緊接著的小尾巴”非常重要它承載了發(fā)音部位的關鍵線索比如雙唇音的burst能量集中在低頻而齒齦音[t]的burst高頻成分更突出。3. 頻域上的“指紋”頻譜、共振峰與語譜圖時域只是第一眼印象真正把三類音徹底分開的還得靠頻域分析。時域告訴你“這段波形長什么樣”頻域告訴你“這段聲音里哪些頻率成分占主導、能量如何按頻率分布”。對語音來說頻域就像是聲音的指紋。分析頻域最常用的可視化工具是語譜圖橫軸是時間縱軸是頻率顏色深淺代表該時刻該頻率上的能量大小。一張語譜圖就能把濁音的諧波線、清音的寬帶噪聲云、爆破音的豎條紋同時展示出來這是語音分析里性價比最高的看圖方式。3.1 濁音的頻譜諧波梳子和共振峰的絕配濁音的頻域特征由兩個核心要素組成一個是基頻及其諧波另一個是共振峰。因為聲門激勵信號是準周期的脈沖串它的頻譜天然是一根根離散的譜線間隔等于基頻F0。比如基頻100赫茲那么頻譜上就會在100Hz、200Hz、300Hz、400Hz……這些位置出現(xiàn)一排排等間距的峰值像一把梳子這就是諧波結構。這些諧波經(jīng)過口腔、鼻腔構成的聲道濾波之后某些頻率區(qū)域會被放大某些會被衰減于是頻譜的包絡上會出現(xiàn)幾個鼓包這些鼓包就是共振峰。第一共振峰F1和第二共振峰F2決定了我們能區(qū)分出[a][i][u]這些不同的元音。舉一個我經(jīng)常拿來跟同事開玩笑的例子/i/的F1低F2高頻譜上就是“前低后高兩個峰”/a/恰好相反F1高F2也相對高頻譜包絡就像一座平緩的山。你只要看頻譜包絡形狀就能大致猜出發(fā)的是什么元音。這里要提醒一個實操問題如果基頻太高諧波間距就會變大用頻譜包絡去估計共振峰時會受到諧波“顆粒感”的嚴重干擾。處理女性或兒童語音時尤其明顯這時候我一般會先對頻譜做平滑或者用線性預測系數(shù)LPC來提取共振峰包絡比直接找峰值穩(wěn)得多。在語譜圖上濁音段呈現(xiàn)為一系列水平的亮條紋每一條代表一個諧波?;l的軌跡就是最底下那條亮線音調升高時整組條紋會一起向上彎??凑Z譜圖時只要看到成串的平行橫條紋不用回頭查波形就知道這段是濁音。3.2 清音的頻譜一望無際的噪聲“垛子”清音的頻譜沒有諧波結構它是一段連續(xù)分布在整個頻帶上的寬帶噪聲像是一垛均勻堆放的干草。拿/s/來說它的能量主要集中在4kHz以上甚至到8kHz以上的高頻區(qū)域在語譜圖上表現(xiàn)為一大片分布在高頻位置、紋理顆粒細密的暗色云團。再拿/f/來說它的頻率峰值會比/s/略低一些但也明顯是中高頻主導。清音頻譜的包絡雖然也有起伏但它沒有穩(wěn)定的共振峰結構更不會出現(xiàn)等間距的譜線。在自動識別場景里判斷一段頻是否是清音一個簡單有效的方法是計算頻譜的平坦程度濁音的頻譜表現(xiàn)出明顯的離散峰值清音的頻譜則相對平坦、能量分散。功率譜的譜平坦度spectral flatness數(shù)值上濁音遠遠低于清音這個指標做清濁判別比時域過零率還穩(wěn)定。有一點別忽略清音雖然在整體上被認為是噪聲樣的但在不同發(fā)音部位上它的頻譜能量峰值位置是不同的這正是區(qū)分s、f、sh的線索。我們在做語音增強時如果誤把清音段當成背景噪聲去減掉會把語音的可懂度毀掉因為清音在頻帶上和噪聲高度重疊。學會在語譜圖里認出清音的“噪聲垛子”是避免這種誤殺的第一步。3.3 爆破音的頻域瞬時寬帶脈沖與發(fā)音部位線索爆破音在頻域上的樣子是最有戲劇性的。因為爆破瞬間是一段極短的寬帶脈沖持續(xù)時間往往只有5到20毫秒在語譜圖上表現(xiàn)為一條幾乎覆蓋全頻帶的豎直亮條紋就像一堵豎起來的墻。這條豎條之后的瞬態(tài)會暴露出一個關鍵信息不同的發(fā)音部位對應不同的頻譜能量集中區(qū)域。雙唇音如/p/、/b/因為口腔前腔大、質量大諧振頻率低burst的頻譜能量集中在較低頻率通常在500Hz到1.5kHz附近齒齦音/t/、/d/前腔小頻率高burst能量明顯上移到3kHz到5kHz軟腭音/k/、/g/能量則集中在2kHz到4kHz之間但往往還伴隨一個低頻的“鼓包”。也就是說只要看burst豎條在哪個頻段顏色最深就能大致判斷是哪個部位的爆破音這就是所謂爆破音的“音征”locus效應。爆破音不只是看burst那一瞬間。爆破后的輔音到元音過渡段在語譜圖上會呈現(xiàn)共振峰的“轉向”比如/t/后接元音時第二共振峰通常從高頻向下彎進元音的穩(wěn)態(tài)值/b/后接元音時F2則往往從低頻向上彎。這種共振峰的轉移軌跡是自動識別爆破音和后續(xù)元音邊界的重要依據(jù)看語譜圖時千萬別只盯著那條豎線要看豎線之后共振峰的走向。另外爆破音的無聲閉塞段在語譜圖上幾乎是一片空白偶爾有一些極其微弱的低頻殘余這是前一個音在聲道里留下的慣性振動。這一段“空白”反而是識別爆破音的強信號一個很窄的全頻帶豎條前面跟著一段空白后面接著共振峰轉向三者連起來讀就是爆破音的完整故事。3.4 一張表把三類音的頻域特征收攏起來為了方便大家在工作里快速對照我把三類音在時域和頻域的核心特征整理成一張速查表。這張表我貼在自己工位上很久了調試算法拿不準的時候掃一眼基本心里就有數(shù)。特征維度濁音清音爆破音激勵源聲帶振動準周期脈沖氣流湍流隨機噪聲閉塞后瞬間壓力釋放沖擊脈沖時域波形周期性鼓包明顯節(jié)律隨機毛刺無規(guī)律靜默-尖刺-過渡三段式短時能量高中低閉塞段極低burst瞬間極高短時過零率低高閉塞段極低burst后瞬間飆升頻譜形態(tài)離散諧波譜線寬帶連續(xù)噪聲寬帶瞬態(tài)脈沖語譜圖特征平行橫條紋高頻分布的不規(guī)則云團全頻帶豎直亮條后接共振峰轉向4. 實操用Python把三類音扒開看理論講了一堆不如實際跑一遍代碼來得直觀。下面我分享一套我自己常用的分析流程用Python對一段中文語音做清音、濁音、爆破音的三分類可視化。整個過程基于librosa和matplotlib環(huán)境準備不算復雜核心是讓你能親手看到三類音在波形、頻譜、語譜圖上的差異同時也能讓你直接把這段代碼改造成自己的調試工具。4.1 準備工作裝庫、讀音頻、定參數(shù)先說一下依賴。我推薦的組合是librosa、numpy、matplotlib和scipy。librosa是音頻分析的老牌庫讀寫音頻、算短時特征、畫語譜圖都很方便。安裝一行搞定pip install librosa numpy matplotlib scipy讀音頻我用librosa.load這里有個坑要特別提醒librosa.load默認會把采樣率轉成22050Hz如果你要分析的是原本48kHz的錄音這個隱式重采樣會改變高頻細節(jié)尤其是清音和爆破音的高頻能量分布。所以我一般會指定sr參數(shù)保持原采樣率或者用16000Hz統(tǒng)一重采樣因為語音處理項目里16kHz是兼顧信息量和計算量的常見選擇而且從16kHz降下來的普適性也最強。import librosa import numpy as np import matplotlib.pyplot as plt audio_path your_speech.wav sr 16000 y, sr librosa.load(audio_path, srsr)讀進來之后先聽一遍、看一眼流程上不要省這一步。很多時候我踩的雷都是錄音出問題而不是分析算法出錯比如直流偏移、削波、背景底噪太大這些問題不看波形根本發(fā)現(xiàn)不了。用plt.plot畫一下原始波形前5秒鐘如果能有一條明顯的周期段和毛刺段交織那段素材基本就合格了。4.2 計算短時能量與過零率并疊加顯示接下來做經(jīng)典操作分幀、加窗、算短時能量和過零率。librosa已經(jīng)封裝好了這兩個函數(shù)但細節(jié)還是值得說一下。分幀的幀長我設置為25毫秒也就是在16kHz采樣下每幀400個采樣點幀移10毫秒即160個采樣點。frame_length int(0.025 * sr) # 25ms hop_length int(0.010 * sr) # 10ms energy librosa.feature.rms(yy, frame_lengthframe_length, hop_lengthhop_length)[0] zcr librosa.feature.zero_crossing_rate(y, frame_lengthframe_length, hop_lengthhop_length)[0]把能量和過零率畫在一個雙y軸圖里再把原始波形一起畫出來我能直接看到三類音的區(qū)分度濁音段能量抬起、過零率壓低清音段能量中低、過零率沖高爆破音的閉塞段能量幾乎歸零burst處能量瞬時爆表。這三段在圖上往往清晰得可以用肉眼直接框出邊界。這里有一個實戰(zhàn)經(jīng)驗能量用RMS均方根值而不直接用幅值平方和為了讓你在畫圖時有個更直觀的“響度”概念。RMS的單位和原始波形保持一致數(shù)值解讀不抽象。如果原始錄音有直流偏移過零率會被干擾得很嚴重波形整體偏離零軸上下不對稱這時最好先做一個高通濾波把它濾掉。4.3 畫頻譜和語譜圖看完時域指標下一步畫頻譜。為了對比濁音段和清音段的頻譜形態(tài)我一般會手動切出兩個片段來做比較。比如用librosa的幀時間戳找到一處明顯的濁音區(qū)間和一處清音區(qū)間分別取中間的一幀算它的幅值譜。n_fft 1024 D librosa.stft(y, n_fftn_fft, hop_lengthhop_length) magnitude np.abs(D) # 在某個時間幀處取頻譜 frame_index 80 # 換成你感興趣的幀 spectrum magnitude[:, frame_index] freqs librosa.fft_frequencies(srsr, n_fftn_fft) plt.figure(figsize(12, 4)) plt.plot(freqs, spectrum) plt.xlabel(Frequency (Hz)) plt.ylabel(Magnitude) plt.xlim(0, sr // 2)跑完之后濁音幀的頻譜上會出現(xiàn)等間距的梳狀峰譜線間隔就是基頻而清音幀的頻譜則表現(xiàn)為不規(guī)則的連續(xù)起伏沒有明顯的諧波峰串。這個對照實驗強烈建議做一次一幀圖的沖擊力超過看書十頁。語譜圖直接用librosa的specshow畫S_db librosa.amplitude_to_db(magnitude, refnp.max) plt.figure(figsize(14, 6)) librosa.display.specshow(S_db, srsr, hop_lengthhop_length, x_axistime, y_axishz) plt.colorbar(format%2.0f dB)語譜圖畫出來后去找我前面說的三類標志平行橫條紋是濁音不規(guī)則云團是清音全頻帶豎直亮條是爆破音。這一眼看圖的能力比任何指標都能幫助你快速定位問題音頻中的事件。4.4 用Praat做二次驗證Python分析跑完我習慣再用Praat把關鍵片段驗證一下尤其是爆破音的VOT測量。Praat是語音學領域的免費神器直接打開音頻選中波形上想要測量的區(qū)域用“View spectral slice”看某個時刻的頻譜再點“Show formants”看共振峰軌跡。它的優(yōu)勢在于交互式操作很順手鼠標一拖就能測量時長尤其適合核對自動算法結果的邊界。我自己的習慣是自動切分先跑粗結果然后抽樣把邊界和Praat手動標注的結果做對比。如果一段語音里爆破音的burst自動檢測誤差超過10毫秒就得回頭調參數(shù)。這種“算法-工具”雙確認的工作流看起來多了一步實際上能省掉后面一大堆標注返工的時間。5. 常見問題與排查技巧實錄做了這么久語音分析我在這幾個坑上反復栽過跟頭也總結了不少排查經(jīng)驗。整理成速查表分享給大家希望對你有幫助。異?,F(xiàn)象可能原因排查與解決思路濁音段波形看不出周期錄音通道混入嚴重背景噪聲或基頻過高先看頻譜是否仍有等間距諧波必要時做帶通濾波或重新錄音清音過零率不高采樣率過低高頻成分被截掉確認音頻采樣率若原始采樣率低于8kHz清音分析基本不可靠爆破音的burst找不到爆破音處在詞尾或輕聲位置burst能量太弱把語譜圖動態(tài)范圍調大vmin/vmax或對高頻段做預加重閉塞段和靜音段分不清閉塞段前的音帶有尾音混響通過閉塞段后是否跟有burst來判斷位置信息結合上下文處理共振峰提取值振蕩劇烈基頻過高導致諧波顆粒感干擾改用LPC頻譜包絡提取或先對語譜圖做平滑處理自動清濁判別把爆破音誤判為靜音爆破音的閉塞段能量過低被端點檢測當成無聲不要只看短時能量要結合burst檢測和VOT做聯(lián)合判定這些問題是初聽起來很基礎但每一個在真實語音數(shù)據(jù)上都足以讓算法跑偏。我自己在調語音端點檢測時就曾經(jīng)因為把爆破音閉塞段全部判成靜音導致一句話被硬生生切成了兩段后來才發(fā)現(xiàn)是閾值設得太粗暴缺少對burst釋放事件的感知。后來把“短時能量過零率burst檢測”三者合到一起做狀態(tài)機問題才徹底解決。還有一個經(jīng)驗值得單獨說分析語音前一定要看頻譜范圍。如果你的錄音設備高頻衰減嚴重清音的頻譜能量會被吃得所剩無幾表現(xiàn)在語譜圖上就是糊成一片、邊界模糊。這種情況只能從源頭解決要么換錄音設備要么在做分析前用高頻補償濾波器做修正。永遠別指望算法能從已經(jīng)被抹掉的信息里變出結果。6. 這些分析在真實項目里能干什么聊完方法最后講講這些分析能力在真實項目里的落地場景。很多人覺得清濁音是書本概念離工程很遠其實恰恰相反幾乎每一個語音類項目的前處理環(huán)節(jié)都在和這三類音打交道。最典型的是語音識別系統(tǒng)中的音素切分。中文語音識別里聲母韻母的邊界本質就是清音、爆破音與濁音之間的切換。比如“他”這個字聲母/t/是爆破音韻母/a/是濁音/t/的burst之后到/a/的共振峰穩(wěn)態(tài)之間正好對應VOT這個物理量。把這個邊界切準了后面的聲學模型訓練數(shù)據(jù)質量才有保障。語音合成里同樣離不開的。合成器要生成真實自然的語音必須控制濁音段的基頻曲線和振幅包絡清音段的噪聲能量爆破音的burst強度和VOT。如果VOT設得太短合成的/p/聽起來就像/b/“怕”和“爸”瞬間不分家。這個就是調參的核心依據(jù)。說話人識別中也常用到這些特征。濁音段的基頻和共振峰體現(xiàn)說話人的音色和韻律清音段和爆破音則更多體現(xiàn)發(fā)音習慣和聲道形狀綜合起來才能刻畫一個說話人的聲紋。之前我做過一個簡單實驗只取清音段特征做說話人匹配效果竟然比濁音段更好因為清音的個體差異其實非常大。再往小處說做錄音質檢、音頻自動標注、口語評測、發(fā)音糾錯這類應用清濁音分析都是底層基礎設施。一套好用的清濁爆破檢測模塊就像一把鋼尺不管上層做什么功能都繞不開它來量一量聲音的結構。我個人這些年在實際調試里最深的體會是分析語音千萬不要只看波形或者只看頻譜把時域、頻域、語譜圖三個視角疊起來讀得到的信息永遠是任何單一維度給不了你的。學會聽聲音、看波形、讀語譜圖三者聯(lián)動這套功夫一旦練起來以后處理任何音頻數(shù)據(jù)你都會有一種“心里有底”的感覺。