语音特点

 
语音指人类发出的声音,其频率集中在1000Hz左右,范围为30-3000Hz 

语法有结构,语音也有一定的结构,包含有丰富的信息,
同时也有一定的随机性/边界,存在岐义/模糊的地方 
    
其中音频信号,能听到的声音频率范围为20Hz~20KHz

模拟信号与数字信号

模拟信号

 
模拟信号是指 连续时间和连续幅度 变化的信号,例如模拟语音信号。
模拟信号的特点是信号的幅度、频率或相位随着时间的变化而变化,
因此可以用来传输连续的信息。

但是,模拟信号容易受到 噪声和干扰 的影响,从而导致信号 失真和变形。
此外,模拟信号的 存储和传输 也比较困难,因为它们需要保持连续性。

 
在模拟信号的处理中,需要注意以下几点:

1. 噪声和干扰的抑制:
由于模拟信号容易受到 噪声和干扰 的影响,因此需要对这些干扰进行抑制。
常用的方法包括 滤波、放大和抽样 等。

2. 信号的放大:
由于模拟信号的幅度会随着时间的变化而变化,因
此需要对信号进行放大,以保证其在传输过程中不会 失真或变形。

3. 信号的调制和解调:
在模拟通信系统中,通常需要对信号进行调制和解调,
以便将其转换为适合传输的形式,并在接收端将其还原为原始信号    

数字信号

 
数字信号是指离散时间、离散幅度的信号,例如数字音频和视频信号。

数字信号的特点是信号的状态只有两种,即高电平和低电平,因此可以用来传输二进制数据。
数字信号具有抗干扰能力强、传输可靠、易于存储和处理等优点。
但是,数字信号需要经过采样、量化和平滑等处理过程,因此会导致一定的 失真和噪声。

 
在数字信号的处理中,需要注意以下几点:

1. 采样和量化:
在将模拟信号转换为数字信号时,需要进行采样和量化处理。
采样是指将连续时间信号转换为离散时间信号,
而量化是指将连续幅度信号转换为离散幅度信号。
采样和量化的精度决定了数字信号的质量。

2. 平滑处理:
由于数字信号在采样和量化过程中会产生一定的 失真和噪声,因此需要进行平滑处理。
平滑处理是指对数字信号进行加工处理,以减小失真和噪声的影响。
常用的平滑处理方法包括低通滤波、插值和预测等。

3. 编码和解码:
在数字通信系统中,通常需要对数字信号进行编码和解码处理。
编码是指将二进制数据转换为数字信号,而解码是指将数字信号还原为原始的二进制数据。
编码和解码的处理过程需要遵循一定的协议和标准。    

失真

 
采样率大概是音频的两倍的音频,不失真,

音频信号频率范围为 20-20KHz ,所以48KHz的频率不失真 

声波转数字信号

波形文件:数字信号

 
声波 --> 空气传播  --> 麦克风接收 : 
将空气的压力波动 由传感器转换为 电压信号 ,也就是模拟语音信号 
持续传递过来的电压信号,在时间轴上展开后是一段高低起伏的波状图形,

采样:
每秒采集一定的数据点来代表这个波形曲线,比如每秒采16000个点,
每个点的y值对应电压的大小,x值对应记录的时刻,
每秒采样点数为采样率,其单位为Hz

量化:
存储声音是为了播放,播放由外部设备的驱动实现,
外部设备处理的是二进制数据,所以需要将0.1,0.2,0.5 这样的电压数据转化为二进制,
将电压分段,比如,分四段的话,可以用11,10,01,00 表示 3,2,1,0,
因为使用了两位二进制来表示,所以此时量化位数为2,
量化位数通常为4,8,16,32,

每秒音频占用字节数=每秒的样本个数(采样率)×量化位数
比如量化位数为16,那么每个样本点都是以16位二进制表示,
一个二进制是0或1,在文件中占一个字节的长度,
2的16方=65536,即将电压分为65536个小格格,
采样率48KHz时,大约2个样本点分散到3个小格中,
换句话讲,大概率每个样本点对应着一个不同的数值

 
比如下面的这个音频:
ffmpeg -i  ./1281.wav
Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 48000 Hz, mono, s16, 768 kb/s
PCM编码,48kHz,量化位数16,48k*16=768kb/s 
mono:单声道
s16是ffmpeg中的一个单位,除了s16还有U8(无符号整型8bit)、S32(整型32bit)、FLT(单精度浮点类型)、DBL(双精度浮点类型)、S64(整型64bit)

二进制编码
把量化结果,即单个声道的样本,以二进制的码字进行存储
其中有两种存放方式:
整形:Two's complement code;
浮点类型:Floating point encoding code。
大多数格式的PCM样本数据使用整形来存放,而在对一些对精度要求高的应用方面,则使用浮点型来表示PCM 样本数据。

帧frame

 
将一定数量的样本点(比如128个)组成一个块,
将一定数量的块(比如960、1024、2048、4096等)组成一帧,代表一个声音单元
以双声道为例,分左声道右声道,用L/R表示,那么一帧的格式有下面两种:
交错(interleaved):LRLRLR,一个左声道的块后面跟一个右声道的块
平面(planar):LLLRRR,一个声道存放完毕后再放另外一个声道 

FFmpeg中 AVFrame 结构体中的 nb_samples: 一帧中单个声道的音频样本数量。
//number of audio samples (per channel) described by this frame
int nb_samples;

语音信号/音频文件

 
后续称这样的信号为 语音信号,对应的计算机上的文件后缀通常有:
.wav 
.mp4 
... 

语音信号,存储到计算机上的音频文件,实际上就是一串连续的数据,
文件格式不同,它的头格式不同,
数据部分就是一个列表,在时间与原声对应

语音的频率

频率即特征

 
振幅:声音大小,声波最高位置偏离中心的距离

频率:说话的内容
气流流过 气管,嗓子,口腔,口形(比如 啊 嘴巴张的较圆,艾 嘴巴扁平),

每流过一个地方,气流就会形成不同的振动,可简单理解为产生一个频率的声波,
声波从口形出来后,就是多个频率的复合音,只有一个频率叫纯音 

一个单词/字 对应的声波 有多个频率,这些频率就是音频的特征 

音频,由电子设置播放,如果感觉声音小,可以调节一下音量,
这音量对应振幅,所以振幅在AI学习时,远没有频率重要

波的合成

 
y = sin(x)
y = sin(2x)
这两种频率的波进行合成
y = sin(x) + sin(2x)
形成的新波形会多出2个弯折,这让波形显得不怎么规整

from matplotlib import pyplot as plt
import numpy as np 
x=np.arange(20,step=0.1)
y = np.sin(x)
plt.plot(x,y)

y = np.sin(2*x)
plt.plot(x,y)

y =np.sin(5*x)+ np.sin(2*x) + np.sin(x)
plt.plot(x,y)

波的分解

 
将合成的波(不规整的波)分解成一系列 y=asin(bx + c) 的和

合成是精准的,分解是模糊的/近似的 

语音时域信号

 
y = 语音信号(time)
x轴是时间
y轴是语音信号
这样的图为 语音的时域信号 

语音频谱

 
将声波分解成多个单频的信号
x轴是时间
y轴是频率 
这样的图为 频谱 

一个单词的发音为一个时间片 
该时间片内有多个不同频率的波形 
会看到一段段条纹,因此也叫 频谱

语音特征提取

语音数字信号特征

 
从原来的声波数字化存储之后,其信号也带有原语音的特征

提取特征的维度主要有两个:
1. 不同发音对应的数字信号的区别
2. 发音在序列中的含义

时域特征

 
不同发音对应的数字信号 形状高低起伏的相对比例,
峰值 

情况较复杂,基于此类的方法已不是主流

频谱特征

 
将一个复合声波分解成多个音频波 
MFCC,GMM构建的特征空间中,不同的发音处于不同的位置,
这相当于将不同内容的发音区分开了

机器学习处理序列的算法有HMM 

参考
    音频相关知识:声道、采样率、采样位数、样本格式、比特率
    ffmpeg 计算每帧有多少个样本