语音技术随笔-初识语音识别-时域角度
人类在发音时,通过肺部气流经过气管,然后引起声带震动,形成声源,声源带动空气震动向前传播,形成波形(Waveform)(可以联想出波形图的特点:频率、相位、幅度)。由于我们计算机只能处理可计算问题,可计算问题一个基本前提是数据是有限长度的,计算机通过传感器得到的波形图,我们需要进行采样(Sampling),形成电压随着时间变化的波形,计算机中,时间是离散的,在某个时刻的电压也是离散的,这就形成了语音的数字信号。随后还需要进行量化,量化的过程是将每个采样值在幅度上再进行离散化处理,变成整数型数值,一般采用16位的数值进行量化。具体我们可以用python工具对wav文件进行采样,具体绘制的方法和效果如下所示。
具体代码为:
import scipy.io
import scipy.io.wavfile
import numpy as np
import matplotlib.pyplot as plt
wavedata = "wav文件.wav"
sampleRate, audioBuffer = scipy.io.wavfile.read(wavedata)
duration = len(audioBuffer)/sampleRate
time = np.arange(0,duration,1/sampleRate)
plt.plot(time,audioBuffer)
plt.xlabel('Time [s]')
plt.ylabel('Amplitude')
plt.title(wavedata)
plt.show()
我们再看看语音文件的格式,我用mac电脑随便打开一个wav文件,显示如下:
我们可以看到持续时间、音频声道、采样速率和每个样本的位数,这些与语音文件息息相关,持续时间就是音频的总时间,这个不多说了,音频声道是1,代表单声道语音,这个是为了区别后续的多声道,比如现在麦克风阵列录音设备可以形成多个声道,我是使用iphone录制的,很显然我这个文件只能是单通道。采样速率(Sample Rate)这里是16kHz,代表这个文件每秒钟形成了多达16000个电压值。秒是人最常能感受的的时间单位,滴答一秒就过去了,非常快,而这个文件一秒钟形成了16000采样点,可以说通过这么密集的采样,基本上能完美还原原有的波形图了。每个样本的位数(Precision)就是上述提到的采样位数,量化的过程是将每个采样值在幅度上再进行离散化处理,这里幅度指的就是波形图的纵坐标,位数决定了纵坐标有多少个“刻度”,这里是16位,2个16次方=65535,也就是我们可以用65535个刻度来对波形图的纵坐标进行量化。
说到这里,我们发现,其实采样速率是横坐标上的“刻度”,量化是纵坐标上的“刻度”,两者相乘就是比特率,即一秒钟内音频的数据大小,这里的比特率就是16*16=256 kb/s,文件大小粗略通过公示计算:比特率*时长。
这一章节,我们通过一个简单的python读取wav音频的例子理解了声音的时序变化特征,即电压随着时间变化的离散数值。这是观察语音的第一个角度,通过观察这些特征,其实我们已经可以做出一个分析,比如可以进行语音端点检测(VAD)任务了。下面,我们从另外一个角度——频域角度来认识语音。