Loading AI tools
来自维基百科,自由的百科全书
語音處理(Speech processing),又稱語音訊號處理、人聲處理,其目的是希望做出想要的訊號,進一步做語音辨識,應用到手機介面甚至一般生活中,使人與電腦能進行溝通。
人耳可以辨識頻率:20Hz ~ 20000Hz
說話:150~2000Hz
電話系統頻域:小於3500Hz
電腦音效卡取樣頻率:44100Hz (最新技術可達192K)(一般用22050Hz、11025Hz 即可)
超聲波(ultrasound):> 20000Hz
次聲波(infrasound):< 20Hz
對人類而言,300Hz和400Hz之間的差別,與3000Hz和4000Hz之間的差別是相同的
其中P為音強(正比於振福的平方),C為0dB時的音強
低音Do: 131.32 Hz
中音Do: 261.63 Hz
高音Do: 523.26 Hz
更高音Do: 1046.52 Hz
音素→音節→詞→句→整段話
例如:經過判定,一個聲音可能是
ㄅㄧ ㄖㄢ ㄆㄧ ㄖㄢ
ㄅㄧ ㄌㄢ ㄆㄧ ㄌㄢ
這個聲音是「必然」的概率比較大。
ㄅㄛ ㄅㄛ ㄆㄛ ㄆㄛ
可能是「伯伯」,也可能是「婆婆」,看上下文
梅爾頻率倒頻譜(Mel-Frequency Cepstrum) + 語意分析 + 機器學習(Machine Learning)
可以將ringin.wav 以數字向量x來呈現。fs:取樣頻率(sampling frequency)
這個例子當中size(x) = 122868 2 (2指的是雙聲道(Stereo,俗稱立體聲)),fs = 22050
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));
註:x必須是1 個column (或2個columns),且x的值應該介於 -1 和 +1 之間
audiowrite(filename, x, fs)
將數據x變成一個*.wav 檔,取樣頻率為fsHz
註:x必須是1 個column (或2個columns),且x的值應該介於 -1 和 +1
以下這三個指令要並用才可以錄音
Fs: sampling frequency
nb: using nb bits to record each data
nch: number of channels (1 or 2)
recorder: the parameters obtained by the command audiorecorder
Sec: the time length for recording
(將錄音的結果,變成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 檔)
要先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
要先import 相關模組: import matplotlib.pyplot as plt
要先import 相關模組: from scipy.fftpack import fft
要先import 相關模組: import simpleaudio as sa
要先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
可採行兩種方式:
假設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 出碼錶按下後已經執行了多少時間)
註:通常程式執行第一次時,由於要做程式的編譯,所得出的執行時間會比較長。程式執行第二次以後所得出的執行時間,是較為正確的結果
假設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 |
要分析語音訊號前,必須先了解其架構,語音的要素從小到大分別是:音素→音節→詞彙→句子→整段話。
音素是聲音的最小單位,例如「呵」這個字的音素,就是「ㄏ」和「ㄜ」,但是音素和注音符號並不相等,例如「鷗」雖然只有「ㄡ」這個母音,但是由於是雙母音,所以會把他拆成兩個音素。音節在中文而言,就是只一個字,例如:「天天開心」就有四個音節。詞彙是文字組成的有意義片段,各種不同的詞彙集結成句子,最後變成整段話,這就是語音的架構。
用麥克風或其他裝置收到的類音聲音訊號,經由模擬數碼轉換裝置,將資料數據化進行處理,最後再經過數碼模擬轉換裝置輸出。因此,我們在處理時是針對數碼訊號,語音訊號是一種離散時間訊號。其訊號處理流程如下:
語音訊號是屬於離散時間系統,因此會用離散時間的傅利葉轉換去做處理,除此之外,摺積、窗函數都是一定會使用到的處理方法。
兩訊號做convolution等於,兩訊號先做傅利葉轉換,相乘後再做反傅利葉轉換,藉此可以更快速的處理訊號。
語音處理主要有兩個目的:
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.