語音處理，又稱語音訊號處理、人聲處理，是研究語音訊號及其處理方法的學科。通常，這些訊號是以數字形式進行處理的，因此語音處理可以被視為數字訊號處理的一個特殊案例，專門應用於語音訊號。語音處理涉及語音訊號的獲取、操控、儲存、傳輸和輸出等多個方面。不同的語音處理任務包括語音識別、語音合成、說話人分離、語音增強、說話人識別等。 語音的相關常識 一般聲音檔格式 取樣頻率：22050Hz 單聲道或雙聲道 每筆資料用 8 個 bit 來表示 電腦中沒有經過任何壓縮的聲音檔：wav 聲音的頻率 頻率範圍 人耳可以辨識頻率：20Hz 20000Hz 說話：1502000Hz 電話系統頻域：小於 3500Hz 電腦音效卡取樣頻率：44100Hz 最新技術可達 192K一般用 22050Hz、11025Hz 即可 超音波 ultrasound 與次聲波 infrasound 超音波 ultrasound： 20000Hz 次聲波 infrasound： 20Hz 人對於頻率的分辨能力，是由於頻率的 比 決定 對人類而言，300Hz 和 400Hz 之間的差別，與 3000Hz 和 4000Hz 之間的差別是相同的 聲音的波長 波長較長：傳播距離較遠，但容易散射 波長較短：衰減較快，但傳播方向較接近直線 聲音的速度 聲音在空氣中傳播速度： 每秒 340 公尺 15C 時 一般人，耳翼到鼓膜之間的距離： 27 公分。所以，人類對 3000Hz 左右頻率的聲音最敏感 每增加 1C，聲音的速度增加 06 msec 聲音在水中的傳播速度是 1500 msec，在鋁棒中的傳播速度是 5000 msec 分貝 分貝 dB： 10 log_text 10 PC 其中 P 為音強 正比於振福的平方，C 為 0dB 時的音強 每增加 10dB，音強增加 10 倍，振幅增加 1005 倍；每增加 3dB ，音強增加 2 倍，振幅增加 205 倍 音樂訊號 電子琴 Do 的頻率： 低音 Do 13132 Hz 中音 Do 26163 Hz 高音 Do 52326 Hz 更高音 Do 104652 Hz 音樂每增加八度音，頻率變為 2 倍 每一音階有 12 個半音。增加一個半音，頻率增加 2112 倍 10595 倍 音樂通常會出現「和絃」chord 的現象。除了基頻 f_text 0 Hz 之外，也會出現 2 f_text 0 Hz 3 f_text 0 Hz 4 f_text 0 Hz 的頻率 語音處理的工作 語音編碼 Speech Coding 語音合成 Speech Synthesis 語音增強 Speech Enhancement 語音辨認 Speech Recognition 音素音節詞句整段話 說話人辦認 Speaker Recognition 其他：語意、語言、情緒 子音和母音 母音： 依唇型而定。母音的能量大，頻率偏低，時間較長，出現在子音後或獨立出現 子音： 在口腔，鼻腔中某些部位將氣流暫時堵住後放開。子音的能量小，頻率偏高，時間較短，出現在母音前 語意學的角色 以「語意學」或「機率」來補足語音辨識的不足 例如：經過判定，一個聲音可能是 ㄅㄧ ㄖㄢ ㄆㄧ ㄖㄢ ㄅㄧ ㄌㄢ ㄆㄧ ㄌㄢ 這個聲音是「必然」的機率比較大。 ㄅㄛ ㄅㄛ ㄆㄛ ㄆㄛ 可能是「伯伯」，也可能是「婆婆」，看上下文 當前主流的語音辨識技術： 梅爾頻率倒頻譜 MelFrequency Cepstrum 語意分析 機器學習 Machine Learning 語音檔的處理 Matlab 讀取聲音檔 電腦中，沒有經過壓縮的聲音檔都是 wav 的型態，有經過壓縮的聲音檔是 mp3 的型態 讀取： audioread 2015 版本以後的 Matlab，wavread 將改為 audioread 例： x fs audioread CWINDOWSMediaringinwav 可以將 ringinwav 以數字向量 x 來呈現。fs 取樣頻率 sampling frequency 這個例子當中 size x 122868 2 2 指的是雙聲道 Stereo，俗稱立體聲，fs 22050 wav 檔中所讀取的資料，值都在 1 和 1 之間 畫出聲音的波型 time 0size x11fs x 是用 audioread 所讀出的向量 subplot 211 plot time x 1 xlim time 1time end subplot 212 plot time x 2 xlim time 1time end 繪出頻譜 X fft x 1 XX Nlength X N1round N2 dt1fs X1X N11NX 1N1dt shifting for spectrum fN1N1N0N11Nfs valid f plot f abs X1 聲音的播放 sound x 將 x 以 8192Hz 的頻率播放 sound x fs 將 x 以 fs Hz 的頻率播放 註：x 必須是 1 個 column 或 2 個 columns，且 x 的值應該介於 1 和 1 之間 soundsc x fs 自動把 x 的值調到 1 和 1 之間再播放 製作wav 檔：audiowrite audiowrite filename x fs 將資料 x 變成一個 wav 檔，取樣頻率為 fsHz 註：x 必須是 1 個 column 或 2 個 columns，且 x 的值應該介於 1 和 1 錄音的方式 基本指令說明 以下這三個指令要並用才可以錄音 recorder audiorecorder Fs nb nch 提供錄音相關的引數 Fs sampling frequency nb using nb bits to record each data nch number of channels 1 or 2 recordblocking recorder Sec 錄音的指令 recorder the parameters obtained by the command audiorecorder Sec the time length for recording audioarray getaudiodata recorder 將錄音的結果，變成 audioarray 這個 column vector，如果是雙聲道，則 audioarray 是兩個 column vectors 範例 Sec 3 錄音的時間為三秒 Fs 8000 sampling frequency 為 8000 Hz recorder audiorecorder Fs 16 1 recordblocking recorder Sec audioarray getaudiodata recorder 錄音結果為 audioarray，是一個 column vector 如果是雙聲道，則是兩個 column vectors sound audioarray Fs 播放錄音的結果 t 0length audioarray1Fs plot t audioarray 將錄音的結果用圖畫出來 xlabel secFontSize16 audiowrite testwav audioarray Fs 將錄音的結果存成 wav 檔 語音檔的處理 Python 安裝模組 pip install numpy pip install scipy pip install matplotlib plot pip install pipwin pipwin install simpleaudio vocal files pipwin install pyaudio 讀音訊檔 要先 import 相關模組 import wave 讀取音檔 wavefile waveopen CWINDOWSMediaAlarm01wav rb 獲得音檔取樣頻率和音訊長度 fs wavefilegetframerate sampling frequency num_frame wavefilegetnframes length of the vocal signal fs 22050 num_frame 122868 讀取波形與資料 要先 import 相關模組 import numpy as np str_data wavefilereadframes num_frame wave_data npfrombuffer str_data dtypenpint16 轉成整數型態 wave_data wave_data max abs wave_data normalization n_channel 2 wave_data npreshape wave_data num_frame n_channel 若為雙聲道音檔需要做 reshape 畫出音訊波形圖 要先 import 相關模組 import matplotlibpyplot as plt time nparange 0 num_frame1fs pltplot time wave_data pltshow 畫出頻譜 要先 import 相關模組 from scipyfftpack import fft fft_data abs fft wave_data 1fs only choose the 1st channel 注意要乘上 1fs n0int npceil num_frame2 fft_data1npconcatenate fft_data n0num_framefft_data 0n0 將頻譜後面一半移到前面 freqnpconcatenate range n0num_frame0range 0n0fsnum_frame 頻率軸跟著調整 pltplot freqfft_data1 pltxlim 10001000 限制頻率的顯示範圍 pltshow 播放聲音 要先 import 相關模組 import simpleaudio as sa n_bytes 2 using two bytes to record a data wave_data 2151 wave_data change the range to 215 215 wave_data wave_dataastype npint16 play_obj saplay_buffer wave_data n_channel n_bytes fs play_objwait_done 製作音檔 f waveopen testingwav wb fsetnchannels 2 設定聲道數 fsetsampwidth 2 每個 samples 有幾個位元組 fsetframerate fs 設定取樣頻率 fwriteframes wave_datatobytes fclose 錄音 要先 import 相關模組 import pyaudio import pyaudio papyaudioPyAudio fs 44100 chunk 1024 stream paopen formatpyaudiopaInt16 channels1ratefs inputTrue frames_per_bufferchunk vocal count0 時頻分析結果分析 Matlab 畫出時頻分析結果 可採行兩種方式： 使用 mesh 指令畫出立體圖 但結果不一定清楚，且執行時間較久 將 amplitude 變為 graylevel，用顯示灰階圖的方法將結果表現出來 假設 y 是時頻分析計算的結果 image abs ymax max abs yC C 是一個常數，可以選 C400 或 image t f abs ymax max abs yC colormap gray 256 變成 graylevel 的圖 set gcaYdirnormal 若沒這一行，yaxis 的方向是倒過來的 set gcaFontsize12 改變橫縱軸數值的 font sizes xlabel Time SecFontsize12 xaxis ylabel Frequency HzFontsize12 yaxis title STFT of x tFontsize12 title 計算程式執行時間的指令 tic 這指令如同按下碼錶 toc show 出碼錶按下後已經執行了多少時間 註：通常程式執行第一次時，由於要做程式的編譯，所得出的執行時間會比較長。程式執行第二次以後所得出的執行時間，是較為正確的結果 Python 事前安裝模組 pip install numpy pip install matplotlib 畫出時頻分析結果 假設 y 為時頻分析結果 應為二維的矩陣數列，將 y 以灰階方式畫出來 import numpy as np import matplotlibpyplot as plt C 400 y npabs y npmax npabs y C pltimshow y cmapgray originlower 加上 originlower 避免上下相反 pltxlabel Time Sec pltylabel Frequency Hz pltshow 若要加上座標軸數值 在 pltshow 之前加上以下程式碼 x_label 0 10 20 30 橫軸座標值 y_label 5 0 5 縱軸座標值 pltxticks nparange 0 x_max stepint x_maxlen x_label1 x_label pltyticks nparange 0 y_max stepint y_maxlen y_label1 y_label 語音訊號的來源 人聲是由於聲帶震動，而產生聲音。當運動肌肉擠壓，使肺臟中的空氣透過聲帶時，空氣流動使得聲帶做週期性的震動，又再一次震動了空氣，接著，帶著動能的空氣離開氣管到達口腔或鼻腔，在腔室中震動，最後離開在嘴唇傳到人耳變成聲音。 若調整口腔中舌頭的位置，會產生不同種類的聲音，如果舌頭沒有做太多的動作，空氣只有在口腔中共振，接著直接流出嘴唇，會產生母音，若提起舌頭，使口鼻腔相通，則會出現鼻音。 語音訊號分類 從中文發音的觀點來說，聲音仍可分為子音與母音，母音和子音可以用兩種方式區分： 發聲方式：一般而言，母音跟嘴唇形狀有關，而且不與鼻腔共振。相對而言，在發出子音時，就會運用到鼻腔配合發聲。 頻譜分析：從頻譜上觀察可以發現子音的訊號頻率較高，持續時間較短，且會在母音之前出現。而母音的頻率較低，持續時間較長，在子音後或獨立出現，另外，母音的能量也會比子音大。 下面列出中文注音符號中的母音、子音及其拼音。 母音：ㄚ ㄛ ㄜ ㄝ ㄞ ㄟ ㄠ ㄡ ㄢ ㄣ ㄤ ㄥ ㄦ 一 ㄨ ㄩ 母音 ㄚ ㄛ ㄜ ㄝ ㄞ ㄟ ㄠ ㄡ 漢語拼音 a o e e ai ei ao ou 通用拼音 a o e e ai ei ao ou 母音 ㄢ ㄣ ㄤ ㄥ ㄦ 一 ㄨ ㄩ 漢語拼音 an en ang eng er iy uw yuju 通用拼音 an en ang eng er iy uw yuju 子音：ㄅ ㄆ ㄇ ㄈ ㄉ ㄊ ㄋ ㄌ ㄍ ㄎ ㄏ ㄐ ㄑ ㄒ ㄓ ㄔ ㄕ ㄖ ㄗ ㄘ ㄙ 子音 ㄅ ㄆ ㄇ ㄈ ㄉ ㄊ ㄋ 漢語拼音 b p m f d t n 通用拼音 b p m f d t n 子音 ㄌ ㄍ ㄎ ㄏ ㄐ ㄑ ㄒ 漢語拼音 l g k h j q x 通用拼音 l g k h j q x 子音 ㄓ ㄔ ㄕ ㄖ ㄗ ㄘ ㄙ 漢語拼音 zh ch sh r z c s 通用拼音 zh ch sh r z c s 語音的架構 要分析語音訊號前，必須先了解其架構，語音的要素從小到大分別是：音素音節詞彙句子整段話。 音素是聲音的最小單位，例如「呵」這個字的音素，就是「ㄏ」和「ㄜ」，但是音素和注音符號並不相等，例如「鷗」雖然只有「ㄡ」這個母音，但是由於是雙母音，所以會把他拆成兩個音素。音節在中文而言，就是隻一個字，例如：「天天開心」就有四個音節。詞彙是文字組成的有意義片段，各種不同的詞彙集結成句子，最後變成整段話，這就是語音的架構。 語音處理方法 用麥克風或其他裝置收到的類音聲音訊號，經由類比數位轉換裝置，將資料資料化進行處理，最後再經過數位類比轉換裝置輸出。因此，我們在處理時是針對數位訊號，語音訊號是一種離散時間訊號。其訊號處理流程如下： 收取並取樣訊號：利用麥克風或各種收音裝置，收取類比語音訊號，再用 ADC 裝置 如類比數位轉換卡 把類比訊號變成數位訊號，接著根據奈奎斯特理論作取樣，若不符合理論則會造成訊號失真。 量化及編碼：由於電腦中的記憶都是 0 和 1，因此要將所收到的資料用一段適合的 0 跟 1 去儲存，這個動作就稱為量化，所使用的 0 與 1 越多，所需的記憶體越多。接著利用編碼器將數值以波形呈現，因此雖然是數位訊號，但是在電腦中所見到的是類比。 訊號標準化：將語音訊號標準化，使其數值都落在同一個範圍。 音框選擇：由於語音訊號是一段很長的訊號，因此會針對想要處理的部分取音框。 端點偵測：端點偵測的目的是使訊號處理的範圍更精確，只要設定一個音量閾值，若訊號小於閾值，則將其視為沒訊號，但是若雜訊過高，則會產生誤差。 去雜訊：由於雜訊多集中在高頻的部分，因此利用簡單的高頻濾波器，就可以去掉部分雜訊。 基本處理方法 語音訊號是屬於離散時間系統，因此會用離散時間的傅立葉轉換去做處理，除此之外，摺積、窗函式都是一定會使用到的處理方法。 離散時間傅立葉轉換： x n frac 12piintlimits_pipi X omega ejomega ndomega X omega sum_k0N1 x n ej omega n 摺積： 兩訊號做 convolution 等於，兩訊號先做傅立葉轉換，相乘後再做反傅立葉轉換，藉此可以更快速的處理訊號。 mathcal Fhx mathcal Fh cdot mathcal Fx 語音處理的應用 語音處理主要有兩個目的： 減少訊號雜訊，做出想要的訊號模組。 進行語音辨識，使人可以利用語言與電腦溝通。 參見 語音識別 參考文獻 J Benesty M M Sondhi Y Huang ed Springer Handbook of Speech Processing Springer 2007 ISBN 9783540491255 J Benesty S Makino J Chen ed Speech Enhancement Springer 2005 ISBN 9783540240396 JianJiun Ding Advanced Digital Signal Processing NTU 2021 JianJiun Ding Time Frequency Analysis and Wavelet Transforms NTU 2021 Category 說話 Category 訊號處理