本文使用「署名 4.0 国际 (CC BY 4.0)」 许可协议,欢迎转载、或重新修改使用,但需要注明来源。
作者: 百应前端团队-金木
前言
语音识别 技术简史
-
1952 年,贝尔实验室发明了自动数字识别机,是世界上第一个能识别 10 个数字发音的实验系统,从此正式开启了语音识别的进程。
-
1964 年,IBM 在世界博览会上推出了数字语音识别系统。
-
1970 年,Baum 建立 HMM 理论。出现 GMM 模型。孤立词模型。
- 每个词由几个音素组成,一个音素含有 3 到 5 个状态,同一状态的发音相对稳定,每个音素用一个 HMM 模型来描述,使用三状态结构,每个状态用一个 GMM 模型来描述。
-
1980 年,声龙推出了第一款语音识别产品 Dragon Dictate,这是第一款面向消费者的语音识别产品。
-
2009 年之前,语音识别一直处于 GMM-HMM 时代。
-
2009 年,深度技术兴起,语音识别进入了 DNN 时代,语音识别精准率得到了显著提升。
-
2011 年,苹果首次在 iphone4s 上加入智能语音助手 Siri。至此,智能语音与手机深度绑定,进入广大消费者的日常生活。
-
2017 年,微软在 Swichboard 上达到词错误率 5.1%,从而让语音识别的准确性首次超越了人类。
-
2018 年,科大讯飞提出深度全序列卷积神经网络(DFCNN)。
-
2018 年,阿里提出深层前馈序列记忆神经网络 LFR-DFSMN。
-
2019 年,百度提出了流式多级的截断注意力模型 SMLTA。
本文查阅了很多资料文章,并且加入了自己的理解,为了通俗易懂牺牲了一部分严谨性,有些内容可能不会十分准确。
一、既熟悉又陌生的声音与音频
1.1 声音与听觉
声音: 是物体震动产生的声波。声音与波有着相同的关键特征,也可以称为声波或者机械波。声音的本质是波的传递,不是物质的传递。
听觉: 是各种波源的振动通过各种弹性介质(气体、固体、液体)传播到耳膜引起耳膜的震动。耳蜗中有液体,液体中有纤毛(显微镜才能看到),纤毛运动产生神经信号通过神经传递给大脑,人们就可以听见声音了。
1.2 音频数字信号
思考: 电子设备与互联网如何将声音录制、分析、传递、转换?
录制
声音是听觉对声波产生的感知,而声波的本质是介质的振动,比如空气的振动。那么我们只需要把这个振动信号记录下来,并用一串数字来表达振动信号振动的快慢和振动的幅度,就可以实现声音的记录。
- 首先,声波通过空气传播到麦克风的振膜。
- 然后,振膜随空气抖动的振幅大小产生相应的电学信号。我们把这种带有声学表征的电学信号叫做模拟信号(Analog Signal)。
- 最后,通过 A/DC(模数转换器)将模拟信号转换成数字信号(Digital Signal)。即通过 PCM(Pulse Code Modulation)脉冲编码调制对连续变化的模拟信号进行抽样、量化和编码转换成离散的数字信号。
PCM 文件就是未经封装的音频原始文件或者叫做音频“裸数据”。是无法直接播放的数据。
音频数字信号的构成需要以下三个关键要素:
- 采样位深
- 采样率
- 通道数
采样位深
采样位深也就是每个采样点用多少 bit 来表示。比如位深是 16 就代表每个采样点需要 16bit 来进行存储。从物理意义上来说,位深代表的是振动幅度的表达精确程度或者说粒度。
一般在网络电话中用的就是 16bit 的位深,这样不太会影响听感,并且存储和传输的耗费也不是很大。而在做音乐或者更高保真度要求的场景中则可以使用 32bit 甚至 64bit 的位深来减少失真。
8bit 时失真就比较严重了。早期受到音频技术条件限制,很多音频都是 8bit 的,声音会显得比较模糊,如今也只有一些电话和对讲机等设备还有使用。但有趣的是,有的音乐就追求这种模糊感,所以“8bit”有的时候也代表一种听感朦胧的音乐艺术类型。
采样率
采样率就是 1 秒内采集到的采样点的个数,一般用赫兹 Hz 来表示。比如 1 秒有 48000 个采样点那么采样率就是 48000Hz(48kHz)。
当采样位深越高与采样率越高时,录制下来的声音的连续性、质量、清晰度、听感就会越好,对应的音频数据就会越大,所以采样位深和采样率的大小是根据具体用途来决定的。例如音乐播放器办理了 VIP 选择高保真音乐,这是传输过来的音频的采样位深和采样率会比较大,同时文件大小也会比较大。
通道数
双声道、立体声、2.1 声道,5.1 声道等名词相信大家都不陌生,童年使用 VCD、DVD 播放影片的开头,会让我们设置对应的声道,设置不对有时会没有声音。2.1 声道中的 2 指的是左右两个音箱,1 指的是中间一个低音音箱。
通道数的物理含义其实就是同一时间采集或播放的音频信号的总数。
二、音频的编码封装
2.1 为什么要进行封装
一个 PCM 音频文件的存储大小是采样位深、采样率、通道数和持续时间的累乘。
假设我们有一个一分钟时长的立体声 PCM 音频文件,它的采样率是 48kHz,采样位深是 16bit。
存储空间 = 采样位深 × 采样率 × 通道数 × 时长 = 16 × 48000 × 2 × 60 = 92160000bit = 10.98MB
实时音视频传输每秒宽带 = 采样位深 × 采样率 × 通道数 = 16 × 48000 × 2 = 1536kbps
演示使用 ffmpeg 查看一个音频文件中的封装信息。
2.2 有损封装和无损封装
- 有损封装:顾名思义,有损的音频封装格式主要是通过压缩算法把文件大小尽量减少,但是在解压缩的时候却无法完美还原音频原来的数据(即有损)。虽然叫做有损音频格式,但其实发展到现在,有损音频格式比如 MP3 一般可以达到 1:10 的压缩比,即存储体积为未压缩音频的十分之一。但在听感上和无损格式比起来,如果不是专业人士很难听出区别。
- 无损封装:使用可完美还原的压缩算法把文件大小尽量减少,解压时能够完美还原音频原来的数据。比如 FLAC 和 APE 等编码封装格式。FLAC 与 APE 的压缩比基本相同,其中 FLAC 的压缩比为 58.70%,而 APE 的压缩能力则要更高一些,压缩比为 55.50%。它们都能压缩到接近源文件一半大小。
| 无损编码封装 | 有损编码封装 |
|---|---|
| APE、WAV、FLAC、AIFF、WMA、ALAC | MP3、ACC、AMR、RA、OGG |
2.3 编 / 解码器发展简史
一段音频包含的信息其实可以有很多。比如,里面可能有语音、乐器、噪声等多种信号,而其中的语音部分,是我们平时实时音频互动中最重要的部分。
- 语音编解码器:基于 ITU 标准的 G.71 等就是针对如何保持语音部分而设计的。
- 音乐编解码器:为了传输更多的信息,比如包括音乐甚至“噪声”等全部音频信号的编 / 解码器,例如基于 MPEG 标准的 MP3 和 AAC 也陆续出现。
- 时域线性预测编解码器:这种编 / 解码器参考了声道的发音特性,将语音信号分解为主要的线性预测系数和次要的残差信号。而线性预测系数编码所需的比特率非常少,却能高效地构建出语音信号的“骨骼”;残差信号则像是“血肉”,能够补充出语音信号的细节。这种设计大幅提升了语音信号的压缩效率。但是这种基于时域的线性预测框架在有限的复杂度下无法很好地编码音乐信号。
- 基于频域编解码:频域可以更好的对音乐进行编解码。
- 语音音乐混合编码器:融合了时域和频域两种编码框架的优缺点, webrtc 中默认使用的 OPUS 就是这类编解码器。
三、ASR 自动语音识别的基本原理
3.1 分析音频的基本要素
清音和浊音
声道就是声音传播所通过的地方,发音的声道主要是指我们的三个腔体,即咽腔、口腔和鼻腔。而语音是由声源和声道共同作用产生的。按照声源的不同我们把语音分成以下两类:
- 第一类是声带振动作为声源产生的声音,叫做浊音。比如拼音中的 “a,o,e” ,英文中的“a,e,i,o,u”等。
- 第二类是由气体在经过唇齿等狭小区域由于空气与腔体摩擦而产生的声音,叫做清音。比如拼音中的 “zhi、chi、xi” 等。
西瓜、膝盖、走路、前端、外呼、百应
响度
人主观的感觉到声音的大小,俗称音量,单位是分贝。
基频
在发浊音的时候,声带会振动从而产生一个声波,我们把这个声波叫做基波,并且把基波的频率叫做基频,用人话来解释基频其实就是音调。唱歌的音调越高,声带的振动频率越高。一般男生的基频会比女生低。男生的说话基频在 150Hz 以内,女生的说话基频一般在 150Hz ~ 240Hz 之间。
谐波
声带振动产生的基波,在传输过程中会在声道表面反复碰撞反射,从而产生许多频率倍数于基频的声波,我们通常把这些声波叫做谐波。
共振峰
共振是如何产生的,荡秋千时,当秋千处于最高点时,给一个反向的推力,会让秋千下一次上升的高度变高,声音的共振是类似的。
产生谐波的原因是声音在声道中的反复碰撞与反射,同时,声道本身也会发生共振,一个音会存在多个共振峰,但会存在一个能量最强的峰值。
人声的共振峰有一个有意思的特性,每一个音都有对应的一个共振峰,而且这个共振峰不随音高的改变而改变。和音色无关。
3.2 声波如何利用数学展示
简谐振动
物体在与位移成正比的恢复力作用下,在其平衡位置附近按正弦规律作往复的运动。
正弦波
正弦波就是一个圆周运动在一条直线上的投影。
时域和频域
- 时域:自变量是时间,即横轴是时间,纵轴是信号的变化,描述了声音在时间轴上的变化。
- 频域:自变量是频率,即横轴是频率,纵轴是该频率信号的幅度。
3.3 语音识别 ASR(Automatic speech recognition)
语音识别的技术原理是将声音信号转换为数字信号,并使用机器学习算法和统计模型对数字信号进行分析和处理,最终将其转换为文本或命令。
特征提取 MFCC
在任意一个 ASR 系统中,第一步就是提取特征,我们需要把音频信号中具有辨识性的成分提取出来,然后把其他的乱七八糟的信息扔掉,例如背景噪声、静音片段等等。也就是说将语音物理信息(频谱包络和细节)进行编码运算得到的一组特征向量。
例如一个汽车轮胎上会有一些字符,225/45R17 91W 2317。2319 表示轮胎的日期为 2019 年第 23 周。
静音切除
一段音频中,可能在首尾或者中间会存在多个静音片段,通常使用 VAD 技术做静音切除,这样更有利于后续的语音识别。
音频降噪
噪声的分类:
- 加性噪声:和信号无关的噪声,例如自然噪声、人造的噪声如电子元器件发出的热噪声、风声、汽笛声、键盘敲击声等。
- 乘性噪声:和信号相关的造成,比如信号的衰减、房间的混响、多普勒效应等。
降噪方法:
- 线性滤波器:对算力要求比较低,必须事先知道噪声会在哪个频段出现,比如一些硬件厂商知道自己的硬件噪声特性就可以使用线性滤波器来降噪。
- 谱减法:核心思想是先取一段非人声段音频,记录下噪声的频谱能量,然后从所有的音频频谱中减去这个噪声频谱能量。这种方法对稳态噪声比较有效果。
- 基于统计模型的实时降噪算法。
- 基于机器学习的降噪。
窗函数
简介:按照时间把音频截断成一个个小片段,每个小片段也就是一个音频帧。比如 10ms 的切片为 1 帧。
为什么要使用窗函数:一段完整的语音信号通常是非稳态的,即其特征基本上是不随时间变化的,然而由于人的口腔与喉部发声的固有特性,在一个短时间范围内 ,一般为 10∼30ms 之间,其特征基本保持不变,即语音信号是短时平稳的。所以在对语音信号进行频域分析时需要一帧一帧的处理,帧长一般取 10∼30 ms 。
短时傅里叶变换 STFT
STFT 中有许多窗函数:矩形窗、升余弦窗、改进升余弦窗、二阶升余弦窗等,可以将一段非稳态的语音信号转换成频谱图。
经过各种窗函数、傅里叶变换以及降噪处理后,可以得到了一段比较干净的频谱图。
梅尔滤波器组
听觉: 是各种波源的振动通过各种弹性介质(气体、固体、液体)传播到耳膜引起耳膜的震动 。耳蜗中有液体,液体中有纤毛(显微镜才能看到) ,纤毛运动产生神经信号通过神经传递给大脑,人们就可以听见声音了。
研究表明人耳对以 Hz 为单位的频率并不是很敏感,并且人耳对低频信号的感知要比高频信号敏感。例如,我们可以比较容易地发现 500 和 1000Hz 的区别,但很难发现 7500 和 8000Hz 的区别。
耳蜗实质上的作用是一个滤波器,梅尔滤波器组的作用是主要是模拟人耳的听觉机制,使用三角滤波器。
离散余弦变换 DCT
可以将上面计算获取的频谱数据进一步降低维度、能量集中、压缩,计算出声学特征向量。
模型
声学模型与语言模型,声学模型负责将音频序列转化为音素序列,常见的音素比如汉语拼音、英文音标等,语言模型则负责将这些音素序列转化成文字序列。
3.4 Js 实现语音转文字
原生 js 语音转文字,参考链接:www.jianshu.com/p/e42638839…