fbpx
维基百科

语音处理

語音處理(Speech processing),又稱語音訊號處理人聲處理,其目的是希望做出想要的訊號,進一步做語音辨識,應用到手機介面甚至一般生活中,使人與電腦能進行溝通

为单片机实验服务的语音模块

語音的相關常識

一般聲音檔格式

  • 取樣頻率:22050Hz
  • 單聲道或雙聲道
  • 每筆資料用8個bit來表示
  • 電腦中沒有經過任何壓縮的聲音檔:*.wav

聲音的頻率

  • 頻率範圍

人耳可以辨識頻率:20Hz ~ 20000Hz

說話:150~2000Hz

電話系統頻域:小於3500Hz

電腦音效卡取樣頻率:44100Hz (最新技術可達192K)(一般用22050Hz、11025Hz 即可)

  • 超音波(ultrasound)與次聲波(infrasound)

超音波(ultrasound):> 20000Hz

次聲波(infrasound):< 20Hz

  • 人對於頻率的分辨能力,是由於頻率的"比"決定

對人類而言,300Hz和400Hz之間的差別,與3000Hz和4000Hz之間的差別是相同的

聲音的波長

  • 波長較長:傳播距離較遠,但容易散射
  • 波長較短:衰減較快,但傳播方向較接近直線

聲音的速度

  • 聲音在空氣中傳播速度: 每秒340 公尺(15°C 時)
  • 一般人,耳翼到鼓膜之間的距離: 2.7公分。所以,人類對3000Hz 左右頻率的聲音最敏感
  • 每增加1°C,聲音的速度增加0.6 m/sec
  • 聲音在水中的傳播速度是1500 m/sec,在鋁棒中的傳播速度是5000 m/sec

分貝

  • 分貝(dB): 

其中P為音強(正比於振福的平方),C為0dB時的音強

  • 每增加10dB,音強增加10倍,振幅增加   倍;每增加3dB ,音強增加2倍,振幅增加  

音樂訊號

  • 電子琴Do 的頻率:

低音Do: 131.32 Hz

中音Do: 261.63 Hz

高音Do: 523.26 Hz

更高音Do: 1046.52 Hz

  • 音樂每增加八度音,頻率變為2 倍
  • 每一音階有12個半音。增加一個半音,頻率增加  倍(1.0595 倍)
  • 音樂通常會出現「和弦」(chord) 的現象。除了基頻  Hz 之外,也會出現2 Hz, 3 Hz, 4 Hz , …… 的頻率

語音處理的工作

  • 語音編碼(Speech Coding)
  • 語音合成(Speech Synthesis)
  • 語音增強(Speech Enhancement)
  • 語音辨認(Speech Recognition)

音素→音節→詞→句→整段話

  • 說話人辦認(Speaker Recognition)
  • 其他:語意、語言、情緒

子音和母音

  • 母音: 依唇型而定。母音的能量大,頻率偏低,時間較長,出現在子音後或獨立出現
  • 子音: 在口腔,鼻腔中某些部位將氣流暫時堵住後放開。子音的能量小,頻率偏高,時間較短,出現在母音前

語意學的角色

  • 以「語意學」或「機率」來補足語音辨識的不足

例如:經過判定,一個聲音可能是

ㄅㄧ ㄖㄢ ㄆㄧ ㄖㄢ

ㄅㄧ ㄌㄢ ㄆㄧ ㄌㄢ

這個聲音是「必然」的機率比較大。

ㄅㄛ ㄅㄛ ㄆㄛ ㄆㄛ

可能是「伯伯」,也可能是「婆婆」,看上下文

  • 當前主流的語音辨識技術:

梅爾頻率倒頻譜(Mel-Frequency Cepstrum) + 語意分析 + 機器學習(Machine Learning)

語音檔的處理(Matlab)

讀取聲音檔

  • 電腦中,沒有經過壓縮的聲音檔都是*.wav 的型態,有經過壓縮的聲音檔是*.mp3的型態
  • 讀取: audioread (2015版本以後的Matlab,wavread 將改為audioread)
  • 例: [x, fs] = audioread('C:\WINDOWS\Media\ringin.wav');

可以將ringin.wav 以數字向量x來呈現。fs:取樣頻率(sampling frequency)

這個例子當中size(x) = 122868 2 (2指的是雙聲道(Stereo,俗稱立體聲)),fs = 22050

  • .wav 檔中所讀取的資料,值都在 -1 和 +1 之間
  • 畫出聲音的波型

time = [0:size(x,1)-1]/fs; (x 是用audioread 所讀出的向量)

subplot(2,1,1); plot(time, x(:,1)); xlim([time(1),time(end)])

subplot(2,1,2); plot(time, x(:,2)); xlim([time(1),time(end)])

繪出頻譜

X = fft(x(:,1));

X=X.';

N=length(X); N1=round(N/2);

dt=1/fs;

X1=[X(N1+1:N),X(1:N1)]*dt; (shifting for spectrum)

f=[[N1:N-1]-N,0:N1-1]/N*fs; (valid f)

plot(f, abs(X1));

聲音的播放

  • sound(x): 將x以8192Hz 的頻率播放
  • sound(x, fs): 將xfs 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 = [0:length(audioarray)-1]./Fs;

plot (t, audioarray); (將錄音的結果用圖畫出來)

xlabel('sec','FontSize',16);

audiowrite('test.wav', 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 = wave.open('C:/WINDOWS/Media/Alarm01.wav', 'rb')

獲得音檔取樣頻率和音訊長度:

fs =wavefile.getframerate() # sampling frequency

num_frame = wavefile.getnframes() # length of the vocal signal

>>> fs

22050

>>> num_frame

122868

讀取波形與數據

要先import 相關模組: import numpy as np

  • str_data = wavefile.readframes(num_frame)
  • wave_data = np.frombuffer(str_data, dtype=np.int16) # 轉成整數型態
  • wave_data = wave_data / max(abs(wave_data)) # normalization
  • n_channel = 2
  • wave_data = np.reshape(wave_data, (num_frame, n_channel)) # 若為雙聲道音檔需要做reshape

畫出音訊波形圖

要先import 相關模組: import matplotlib.pyplot as plt

  • time = np.arange(0, num_frame)*1/fs
  • plt.plot(time, wave_data)
  • plt.show()

畫出頻譜

要先import 相關模組: from scipy.fftpack import fft

  • fft_data = abs(fft(wave_data[:,1]))/fs # only choose the 1st channel # 注意要乘上1/fs
  • n0=int(np.ceil(num_frame/2))
  • fft_data1=np.concatenate([fft_data[n0:num_frame],fft_data[0:n0]]) # 將頻譜後面一半移到前面
  • freq=np.concatenate([range(n0-num_frame,0),range(0,n0)])*fs/num_frame # 頻率軸跟著調整
  • plt.plot(freq,fft_data1)
  • plt.xlim(-1000,1000) # 限制頻率的顯示範圍
  • plt.show()

播放聲音

要先import 相關模組: import simpleaudio as sa

  • n_bytes =2 # using two bytes to record a data
  • wave_data = (2**15-1)* wave_data # change the range to -215 ~ 215
  • wave_data = wave_data.astype(np.int16)
  • play_obj = sa.play_buffer(wave_data, n_channel, n_bytes, fs)
  • play_obj.wait_done()

製作音檔

  • f = wave.open('testing.wav', 'wb')
  • f.setnchannels(2) # 設定聲道數
  • f.setsampwidth(2) # 每個samples 有幾個位元組
  • f.setframerate(fs) # 設定取樣頻率
  • f.writeframes(wave_data.tobytes())
  • f.close()

錄音

要先import 相關模組: import pyaudio

import pyaudio

pa=pyaudio.PyAudio()

fs = 44100

chunk = 1024

stream = pa.open(format=pyaudio.paInt16, channels=1,rate=fs, input=True, frames_per_buffer=chunk)

vocal=[]

count=0

時頻分析結果分析

Matlab

畫出時頻分析結果

可採行兩種方式:

  • 使用mesh 指令畫出立體圖(但結果不一定清楚,且執行時間較久)
  • 將amplitude 變為gray-level,用顯示灰階圖的方法將結果表現出來

假設y 是時頻分析計算的結果

image(abs(y)/max(max(abs(y)))*C) % C 是一個常數,可以選C=400

或image(t, f, abs(y)/max(max(abs(y)))*C)

colormap(gray(256)) % 變成gray-level 的圖

set(gca,'Ydir','normal') % 若沒這一行, y-axis 的方向是倒過來的

set(gca,'Fontsize',12) % 改變橫縱軸數值的font sizes

xlabel('Time (Sec)','Fontsize',12) % x-axis

ylabel('Frequency (Hz)','Fontsize',12) % y-axis

title('STFT of x(t)','Fontsize',12) % title

計算程式執行時間的指令

tic (這指令如同按下碼錶)

toc (show 出碼錶按下後已經執行了多少時間)

註:通常程式執行第一次時,由於要做程式的編譯,所得出的執行時間會比較長。程式執行第二次以後所得出的執行時間,是較為正確的結果

Python

事前安裝模組

  • pip install numpy
  • pip install matplotlib

畫出時頻分析結果

假設y為時頻分析結果(應為二維的矩陣數列),將y 以灰階方式畫出來

import numpy as np

import matplotlib.pyplot as plt

C = 400

y = np.abs(y) / np.max(np.abs(y)) * C

plt.imshow(y, cmap='gray', origin='lower') # 加上origin='lower' 避免上下相反

plt.xlabel('Time (Sec)')

plt.ylabel('Frequency (Hz)')

plt.show()

若要加上座標軸數值(在plt.show()之前加上以下程式碼)

x_label = ['0', '10', '20', '30'] # 橫軸座標值

y_label = ['-5', '0', '5'] # 縱軸座標值

plt.xticks(np.arange(0, x_max, step=int(x_max/(len(x_label)-1)), x_label)

plt.yticks(np.arange(0, y_max, step=int(y_max/(len(y_label)-1)), y_label)


語音訊號的來源

人聲是由於聲帶震動,而產生聲音。當運動肌肉擠壓,使臟中的空氣通過聲帶時,空氣流動使得聲帶做周期性的震動,又再一次震動了空氣,接著,帶著動能空氣離開氣管到達口腔或鼻腔,在腔室中震動,最後離開在嘴唇傳到人耳變成聲音。

若調整口腔中舌頭的位置,會產生不同種類的聲音,如果舌頭沒有做太多的動作,空氣只有在口腔中共振,接著直接流出嘴唇,會產生母音,若提起舌頭,使口鼻腔相通,則會出現鼻音。

語音訊號分類

從中文發音的觀點來說,聲音仍可分為子音與母音,母音和子音可以用兩種方式區分:

  • 發聲方式:一般而言,母音跟嘴唇形狀有關,而且不與鼻腔共振。相對而言,在發出子音時,就會運用到鼻腔配合發聲。
  • 頻譜分析:從頻譜上觀察可以發現子音的訊號頻率較高,持續時間較短,且會在母音之前出現。而母音的頻率較低,持續時間較長,在子音後或獨立出現,另外,母音的能量也會比子音大。

下面列出中文注音符號中的母音、子音及其拼音。

  • 母音:ㄚ ㄛ ㄜ ㄝ ㄞ ㄟ ㄠ ㄡ ㄢ ㄣ ㄤ ㄥ ㄦ 一 ㄨ ㄩ
母音
漢語拼音 a o e e ai ei ao ou
通用拼音 a o e e ai ei ao ou
母音
漢語拼音 an en ang eng er i,y u,w yu,ju
通用拼音 an en ang eng er i,y u,w yu,ju
  • 子音:ㄅ ㄆ ㄇ ㄈ ㄉ ㄊ ㄋ ㄌ ㄍ ㄎ ㄏ ㄐ ㄑ ㄒ ㄓ ㄔ ㄕ ㄖ ㄗ ㄘ ㄙ
子音
漢語拼音 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

語音的架構

要分析語音訊號前,必須先了解其架構,語音的要素從小到大分別是:音素→音節詞彙→句子→整段話。

音素是聲音的最小單位,例如「呵」這個字的音素,就是「ㄏ」和「ㄜ」,但是音素和注音符號並不相等,例如「鷗」雖然只有「ㄡ」這個母音,但是由於是雙母音,所以會把他拆成兩個音素。音節在中文而言,就是只一個字,例如:「天天開心」就有四個音節。詞彙是文字組成的有意義片段,各種不同的詞彙集結成句子,最後變成整段話,這就是語音的架構。

語音處理方法

用麥克風或其他裝置收到的類音聲音訊號,經由類比數位轉換裝置,將資料數據化進行處理,最後再經過數位類比轉換裝置輸出。因此,我們在處理時是針對數位訊號,語音訊號是一種離散時間訊號。其訊號處理流程如下:

  1. 收取並取樣訊號:利用麥克風或各種收音裝置,收取類比語音訊號,再用ADC裝置(如類比數位轉換卡)把類比訊號變成數位訊號,接著根據奈奎斯特理論作取樣,若不符合理論則會造成訊號失真。
  2. 量化及編碼:由於電腦中的記憶都是0和1,因此要將所收到的數據用一段適合的0跟1去儲存,這個動作就稱為量化,所使用的0與1越多,所需的記憶體越多。接著利用編碼器將數值以波形呈現,因此雖然是數位訊號,但是在電腦中所見到的是類比。
  3. 訊號標準化:將語音訊號標準化,使其數值都落在同一個範圍。
  4. 音框選擇:由於語音訊號是一段很長的訊號,因此會針對想要處理的部分取音框。
  5. 端點偵測:端點偵測的目的是使訊號處理的範圍更精確,只要設定一個音量閾值,若訊號小於閾值,則將其視為沒訊號,但是若雜訊過高,則會產生誤差。
  6. 去雜訊:由於雜訊多集中在高頻的部分,因此利用簡單的高頻濾波器,就可以去掉部分雜訊。

基本處理方法

語音訊號是屬於離散時間系統,因此會用離散時間的傅立葉轉換去做處理,除此之外,摺積窗函數都是一定會使用到的處理方法。

  • 離散時間傅立葉轉換:
 
 
  • 摺積:

兩訊號做convolution等於,兩訊號先做傅立葉轉換,相乘後再做反傅立葉轉換,藉此可以更快速的處理訊號。

 

語音處理的應用

語音處理主要有兩個目的:

  • 減少訊號雜訊,做出想要的訊號模組。
  • 進行語音辨識,使人可以利用語言與電腦溝通。


參見

參考文獻

  • J. Benesty, M. M. Sondhi, Y. Huang (ed). Springer Handbook of Speech Processing. Springer, 2007. ISBN 978-3-540-49125-5.
  • J. Benesty, S. Makino, J. Chen (ed). Speech Enhancement. Springer, 2005. ISBN 978-3-540-24039-6.
  • Jian-Jiun Ding, “Advanced Digital Signal Processing”, NTU, 2021.
  • Jian-Jiun Ding, “Time Frequency Analysis and Wavelet Transforms ”, NTU, 2021.

语音处理, 語音處理, speech, processing, 又稱語音訊號處理, 人聲處理, 其目的是希望做出想要的訊號, 進一步做語音辨識, 應用到手機介面甚至一般生活中, 使人與電腦能進行溝通, 为单片机实验服务的语音模块, 目录, 語音的相關常識, 一般聲音檔格式, 聲音的頻率, 聲音的波長, 聲音的速度, 分貝, 音樂訊號, 語音處理的工作, 子音和母音, 語意學的角色, 語音檔的處理, matlab, 讀取聲音檔, 繪出頻譜, 聲音的播放, 製作, wav檔, audiowrite, 錄音的方式, 基本. 語音處理 Speech processing 又稱語音訊號處理 人聲處理 其目的是希望做出想要的訊號 進一步做語音辨識 應用到手機介面甚至一般生活中 使人與電腦能進行溝通 为单片机实验服务的语音模块 目录 1 語音的相關常識 1 1 一般聲音檔格式 1 2 聲音的頻率 1 3 聲音的波長 1 4 聲音的速度 1 5 分貝 1 6 音樂訊號 1 7 語音處理的工作 1 8 子音和母音 1 9 語意學的角色 2 語音檔的處理 Matlab 2 1 讀取聲音檔 2 2 繪出頻譜 2 3 聲音的播放 2 4 製作 wav檔 audiowrite 2 5 錄音的方式 2 5 1 基本指令說明 2 5 2 範例 3 語音檔的處理 Python 3 1 安裝模組 3 2 讀音訊檔 3 2 1 讀取音檔 3 2 2 讀取波形與數據 3 2 3 畫出音訊波形圖 3 3 畫出頻譜 3 4 播放聲音 3 5 製作音檔 3 6 錄音 4 時頻分析結果分析 4 1 Matlab 4 1 1 畫出時頻分析結果 4 1 2 計算程式執行時間的指令 4 2 Python 4 2 1 事前安裝模組 4 2 2 畫出時頻分析結果 5 語音訊號的來源 6 語音訊號分類 7 語音的架構 8 語音處理方法 9 基本處理方法 10 語音處理的應用 11 參見 12 參考文獻語音的相關常識 编辑一般聲音檔格式 编辑 取樣頻率 22050Hz 單聲道或雙聲道 每筆資料用8個bit來表示 電腦中沒有經過任何壓縮的聲音檔 wav聲音的頻率 编辑 頻率範圍人耳可以辨識頻率 20Hz 20000Hz說話 150 2000Hz電話系統頻域 小於3500Hz電腦音效卡取樣頻率 44100Hz 最新技術可達192K 一般用22050Hz 11025Hz 即可 超音波 ultrasound 與次聲波 infrasound 超音波 ultrasound gt 20000Hz次聲波 infrasound lt 20Hz 人對於頻率的分辨能力 是由於頻率的 比 決定對人類而言 300Hz和400Hz之間的差別 與3000Hz和4000Hz之間的差別是相同的 聲音的波長 编辑 波長較長 傳播距離較遠 但容易散射 波長較短 衰減較快 但傳播方向較接近直線聲音的速度 编辑 聲音在空氣中傳播速度 每秒340 公尺 15 C 時 一般人 耳翼到鼓膜之間的距離 2 7公分 所以 人類對3000Hz 左右頻率的聲音最敏感 每增加1 C 聲音的速度增加0 6 m sec 聲音在水中的傳播速度是1500 m sec 在鋁棒中的傳播速度是5000 m sec分貝 编辑 分貝 dB 10 l o g 10 P C displaystyle 10log text 10 P C 其中P為音強 正比於振福的平方 C為0dB時的音強 每增加10dB 音強增加10倍 振幅增加 10 0 5 displaystyle 10 0 5 倍 每增加3dB 音強增加2倍 振幅增加 2 0 5 displaystyle 2 0 5 倍音樂訊號 编辑 電子琴Do 的頻率 低音Do 131 32 Hz中音Do 261 63 Hz高音Do 523 26 Hz更高音Do 1046 52 Hz 音樂每增加八度音 頻率變為2 倍 每一音階有12個半音 增加一個半音 頻率增加2 1 12 displaystyle 2 1 12 倍 1 0595 倍 音樂通常會出現 和弦 chord 的現象 除了基頻f 0 displaystyle f text 0 Hz 之外 也會出現2f 0 displaystyle f text 0 Hz 3f 0 displaystyle f text 0 Hz 4f 0 displaystyle f text 0 Hz 的頻率語音處理的工作 编辑 語音編碼 Speech Coding 語音合成 Speech Synthesis 語音增強 Speech Enhancement 語音辨認 Speech Recognition 音素 音節 詞 句 整段話 說話人辦認 Speaker Recognition 其他 語意 語言 情緒子音和母音 编辑 母音 依唇型而定 母音的能量大 頻率偏低 時間較長 出現在子音後或獨立出現 子音 在口腔 鼻腔中某些部位將氣流暫時堵住後放開 子音的能量小 頻率偏高 時間較短 出現在母音前語意學的角色 编辑 以 語意學 或 機率 來補足語音辨識的不足例如 經過判定 一個聲音可能是ㄅㄧ ㄖㄢ ㄆㄧ ㄖㄢㄅㄧ ㄌㄢ ㄆㄧ ㄌㄢ這個聲音是 必然 的機率比較大 ㄅㄛ ㄅㄛ ㄆㄛ ㄆㄛ可能是 伯伯 也可能是 婆婆 看上下文 當前主流的語音辨識技術 梅爾頻率倒頻譜 Mel Frequency Cepstrum 語意分析 機器學習 Machine Learning 語音檔的處理 Matlab 编辑讀取聲音檔 编辑 電腦中 沒有經過壓縮的聲音檔都是 wav 的型態 有經過壓縮的聲音檔是 mp3的型態 讀取 audioread 2015版本以後的Matlab wavread 將改為audioread 例 x fs audioread C WINDOWS Media ringin wav 可以將ringin wav 以數字向量x來呈現 fs 取樣頻率 sampling frequency 這個例子當中size x 122868 2 2指的是雙聲道 Stereo 俗稱立體聲 fs 22050 wav 檔中所讀取的資料 值都在 1 和 1 之間 畫出聲音的波型time 0 size x 1 1 fs x 是用audioread 所讀出的向量 subplot 2 1 1 plot time x 1 xlim time 1 time end subplot 2 1 2 plot time x 2 xlim time 1 time end 繪出頻譜 编辑 X fft x 1 X X N length X N1 round N 2 dt 1 fs X1 X N1 1 N X 1 N1 dt shifting for spectrum f N1 N 1 N 0 N1 1 N fs 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 frequencynb using nb bits to record each datanch number of channels 1 or 2 recordblocking recorder Sec 錄音的指令 recorder the parameters obtained by the command audiorecorderSec 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 0 length audioarray 1 Fs plot t audioarray 將錄音的結果用圖畫出來 xlabel sec FontSize 16 audiowrite test wav 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 wave open C WINDOWS Media Alarm01 wav rb 獲得音檔取樣頻率和音訊長度 fs wavefile getframerate sampling frequencynum frame wavefile getnframes length of the vocal signal gt gt gt fs22050 gt gt gt num frame122868 讀取波形與數據 编辑 要先import 相關模組 import numpy as np str data wavefile readframes num frame wave data np frombuffer str data dtype np int16 轉成整數型態 wave data wave data max abs wave data normalization n channel 2 wave data np reshape wave data num frame n channel 若為雙聲道音檔需要做reshape畫出音訊波形圖 编辑 要先import 相關模組 import matplotlib pyplot as plt time np arange 0 num frame 1 fs plt plot time wave data plt show 畫出頻譜 编辑 要先import 相關模組 from scipy fftpack import fft fft data abs fft wave data 1 fs only choose the 1st channel 注意要乘上1 fs n0 int np ceil num frame 2 fft data1 np concatenate fft data n0 num frame fft data 0 n0 將頻譜後面一半移到前面 freq np concatenate range n0 num frame 0 range 0 n0 fs num frame 頻率軸跟著調整 plt plot freq fft data1 plt xlim 1000 1000 限制頻率的顯示範圍 plt show 播放聲音 编辑 要先import 相關模組 import simpleaudio as sa n bytes 2 using two bytes to record a data wave data 2 15 1 wave data change the range to 215 215 wave data wave data astype np int16 play obj sa play buffer wave data n channel n bytes fs play obj wait done 製作音檔 编辑 f wave open testing wav wb f setnchannels 2 設定聲道數 f setsampwidth 2 每個samples 有幾個位元組 f setframerate fs 設定取樣頻率 f writeframes wave data tobytes f close 錄音 编辑 要先import 相關模組 import pyaudioimport pyaudiopa pyaudio PyAudio fs 44100chunk 1024stream pa open format pyaudio paInt16 channels 1 rate fs input True frames per buffer chunk vocal count 0時頻分析結果分析 编辑Matlab 编辑 畫出時頻分析結果 编辑 可採行兩種方式 使用mesh 指令畫出立體圖 但結果不一定清楚 且執行時間較久 將amplitude 變為gray level 用顯示灰階圖的方法將結果表現出來假設y 是時頻分析計算的結果image abs y max max abs y C C 是一個常數 可以選C 400或image t f abs y max max abs y C colormap gray 256 變成gray level 的圖set gca Ydir normal 若沒這一行 y axis 的方向是倒過來的set gca Fontsize 12 改變橫縱軸數值的font sizesxlabel Time Sec Fontsize 12 x axisylabel Frequency Hz Fontsize 12 y axistitle STFT of x t Fontsize 12 title 計算程式執行時間的指令 编辑 tic 這指令如同按下碼錶 toc show 出碼錶按下後已經執行了多少時間 註 通常程式執行第一次時 由於要做程式的編譯 所得出的執行時間會比較長 程式執行第二次以後所得出的執行時間 是較為正確的結果 Python 编辑 事前安裝模組 编辑 pip install numpy pip install matplotlib畫出時頻分析結果 编辑 假設y為時頻分析結果 應為二維的矩陣數列 將y 以灰階方式畫出來import numpy as npimport matplotlib pyplot as pltC 400y np abs y np max np abs y Cplt imshow y cmap gray origin lower 加上origin lower 避免上下相反plt xlabel Time Sec plt ylabel Frequency Hz plt show 若要加上座標軸數值 在plt show 之前加上以下程式碼 x label 0 10 20 30 橫軸座標值y label 5 0 5 縱軸座標值plt xticks np arange 0 x max step int x max len x label 1 x label plt yticks np arange 0 y max step int y max len y label 1 y label 語音訊號的來源 编辑人聲是由於聲帶震動 而產生聲音 當運動肌肉擠壓 使肺臟中的空氣通過聲帶時 空氣流動使得聲帶做周期性的震動 又再一次震動了空氣 接著 帶著動能的空氣離開氣管到達口腔或鼻腔 在腔室中震動 最後離開在嘴唇傳到人耳變成聲音 若調整口腔中舌頭的位置 會產生不同種類的聲音 如果舌頭沒有做太多的動作 空氣只有在口腔中共振 接著直接流出嘴唇 會產生母音 若提起舌頭 使口鼻腔相通 則會出現鼻音 語音訊號分類 编辑從中文發音的觀點來說 聲音仍可分為子音與母音 母音和子音可以用兩種方式區分 發聲方式 一般而言 母音跟嘴唇形狀有關 而且不與鼻腔共振 相對而言 在發出子音時 就會運用到鼻腔配合發聲 頻譜分析 從頻譜上觀察可以發現子音的訊號頻率較高 持續時間較短 且會在母音之前出現 而母音的頻率較低 持續時間較長 在子音後或獨立出現 另外 母音的能量也會比子音大 下面列出中文注音符號中的母音 子音及其拼音 母音 ㄚ ㄛ ㄜ ㄝ ㄞ ㄟ ㄠ ㄡ ㄢ ㄣ ㄤ ㄥ ㄦ 一 ㄨ ㄩ母音 ㄚ ㄛ ㄜ ㄝ ㄞ ㄟ ㄠ ㄡ漢語拼音 a o e e ai ei ao ou通用拼音 a o e e ai ei ao ou母音 ㄢ ㄣ ㄤ ㄥ ㄦ 一 ㄨ ㄩ漢語拼音 an en ang eng er i y u w yu ju通用拼音 an en ang eng er i y u w yu ju子音 ㄅ ㄆ ㄇ ㄈ ㄉ ㄊ ㄋ ㄌ ㄍ ㄎ ㄏ ㄐ ㄑ ㄒ ㄓ ㄔ ㄕ ㄖ ㄗ ㄘ ㄙ子音 ㄅ ㄆ ㄇ ㄈ ㄉ ㄊ ㄋ漢語拼音 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 1 2 p p p X w e j w n d w displaystyle x n frac 1 2 pi int limits pi pi X omega e j omega n d omega X w k 0 N 1 x n e j w n displaystyle X omega sum k 0 N 1 x n e j omega n 摺積 兩訊號做convolution等於 兩訊號先做傅立葉轉換 相乘後再做反傅立葉轉換 藉此可以更快速的處理訊號 F h x F h F x displaystyle mathcal F h x mathcal F h cdot mathcal F x 語音處理的應用 编辑語音處理主要有兩個目的 減少訊號雜訊 做出想要的訊號模組 進行語音辨識 使人可以利用語言與電腦溝通 參見 编辑語音識別參考文獻 编辑J Benesty M M Sondhi Y Huang ed Springer Handbook of Speech Processing Springer 2007 ISBN 978 3 540 49125 5 J Benesty S Makino J Chen ed Speech Enhancement Springer 2005 ISBN 978 3 540 24039 6 Jian Jiun Ding Advanced Digital Signal Processing NTU 2021 Jian Jiun Ding Time Frequency Analysis and Wavelet Transforms NTU 2021 取自 https zh wikipedia org w index php title 语音处理 amp oldid 74921532, 维基百科,wiki,书籍,书籍,图书馆,

文章

,阅读,下载,免费,免费下载,mp3,视频,mp4,3gp, jpg,jpeg,gif,png,图片,音乐,歌曲,电影,书籍,游戏,游戏。