语音处理

语音处理（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)
语音档的处理(Matlab).
读取声音档.
可以将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 之间
制作.wav档：audiowrite.
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
范例.
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).
读音讯档.
要先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
时频分析结果分析.
Matlab.
画出时频分析结果.
可采行两种方式：
假设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.
画出时频分析结果.
假设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)
语音讯号的来源.
人声是由于声带震动，而产生声音。当运动肌肉挤压，使肺脏中的空气通过声带时，空气流动使得声带做周期性的震动，又再一次震动了空气，接著，带著动能的空气离开气管到达口腔或鼻腔，在腔室中震动，最后离开在嘴唇传到人耳变成声音。
若调整口腔中舌头的位置，会产生不同种类的声音，如果舌头没有做太多的动作，空气只有在口腔中共振，接著直接流出嘴唇，会产生母音，若提起舌头，使口鼻腔相通，则会出现鼻音。
语音讯号分类.
从中文发音的观点来说，声音仍可分为子音与母音，母音和子音可以用两种方式区分：
下面列出中文注音符号中的母音、子音及其拼音。
语音的架构.
要分析语音讯号前，必须先了解其架构，语音的要素从小到大分别是：音素→音节→词汇→句子→整段话。
音素是声音的最小单位，例如「呵」这个字的音素，就是「ㄏ」和「ㄜ」，但是音素和注音符号并不相等，例如「鸥」虽然只有「ㄡ」这个母音，但是由于是双母音，所以会把他拆成两个音素。音节在中文而言，就是只一个字，例如：「天天开心」就有四个音节。词汇是文字组成的有意义片段，各种不同的词汇集结成句子，最后变成整段话，这就是语音的架构。
语音处理方法.
用麦克风或其他装置收到的类音声音讯号，经由类比数位转换装置，将资料数据化进行处理，最后再经过数位类比转换装置输出。因此，我们在处理时是针对数位讯号，语音讯号是一种离散时间讯号。其讯号处理流程如下：
基本处理方法.
语音讯号是属于离散时间系统，因此会用离散时间的傅立叶转换去做处理，除此之外，折积、窗函数都是一定会使用到的处理方法。
两讯号做convolution等于，两讯号先做傅立叶转换，相乘后再做反傅立叶转换，借此可以更快速的处理讯号。
语音处理的应用.
语音处理主要有两个目的：