当前位置:   article > 正文

ASR相关基础1-特征提取_对波形进行特征提取

对波形进行特征提取

在进行ASR项目时,启动和训练项目后,在进行源码阅读和后期优化来说,深入理解概念,并进行实践是最为重要的。 在此强化一下概念理解,记录一下学习过程。

我们要解决的首先问题是 声音转化波-数字信息问题。

我们获取的wav格式的音频文件,我们得把音频信息转化成向量信息,就像NLP一样,文本转化为向量是极其重要的第一步。

 

一、声谱图

先来看看wav格式文件绘制出的声谱图是什么样的?

  1. # -*- coding: utf-8 -*-
  2. import wave
  3. import matplotlib.pyplot as pl
  4. import numpy as np
  5. # 打开WAV文档
  6. #首先载入Python的标准处理WAV文件的模块,然后调用wave.open打开wav文件,注意需要使用"rb"(二进制模式)打开文件:
  7. # f = wave.open(r"freeswitch录音文件.wav", "rb")
  8. f = wave.open(r'C:\Users\Administrator\Downloads\xingpan.wav', 'rb')
  9. #open返回一个的是一个Wave_read类的实例,通过调用它的方法读取WAV文件的格式和数据:
  10. # 读取格式信息
  11. # (nchannels, sampwidth, framerate, nframes, comptype, compname)
  12. params = f.getparams()
  13. nchannels, sampwidth, framerate, nframes = params[:4]
  14. #getparams:一次性返回所有的WAV文件的格式信息,它返回的是一个组元(tuple):声道数, 量化位数(byte单位), 采样频率,
  15. #采样点数, 压缩类型, 压缩类型的描述。wave模块只支持非压缩的数据,因此可以忽略最后两个信息:
  16. #getnchannels, getsampwidth, getframerate, getnframes等方法可以单独返回WAV文件的特定的信息。
  17. # 读取波形数据
  18. str_data = f.readframes(nframes)
  19. #readframes:读取声音数据,传递一个参数指定需要读取的长度(以取样点为单位),readframes返回的是二进制数据(一大堆
  20. #bytes),在Python中用字符串表示二进制数据:
  21. f.close()
  22. #将波形数据转换为数组
  23. #接下来需要根据声道数和量化单位,将读取的二进制数据转换为一个可以计算的数组:
  24. wave_data = np.fromstring(str_data, dtype=np.short)
  25. #通过fromstring函数将字符串转换为数组,通过其参数dtype指定转换后的数据格式,由于我们的声音格式是以两个字节表示一个取
  26. #样值,因此采用short数据类型转换。现在我们得到的wave_data是一个一维的short类型的数组,但是因为我们的声音文件是双声
  27. #道的,因此它由左右两个声道的取样交替构成:LRLRLRLR....LR(L表示左声道的取样值,R表示右声道取样值)。修改wave_data
  28. #的sharp之后:
  29. wave_data.shape = -1, 2
  30. #将其转置得到:
  31. wave_data = wave_data.T
  32. #最后通过取样点数和取样频率计算出每个取样的时间:
  33. time = np.arange(0, nframes) * (1.0 / framerate)
  34. # 绘制波形
  35. pl.subplot(211)
  36. pl.plot(time, wave_data[0])
  37. pl.subplot(212)
  38. pl.plot(time, wave_data[1], c="g")
  39. pl.xlabel("time (seconds)")
  40. pl.show()

 

绘制图形如下:

 

通过代码实现,我们可以清晰了解到 wav文件 波形数据图。 那么这个波形如何来的,如何处理他,如何进行向量化转换呢?还是先科普一下基础概念

基础概念介绍:

音频基础知识(搬运而来) - 吴国庆的文章 - 知乎 https://zhuanlan.zhihu.com/p/30401086

大佬们写的非常好,就引用一下。

“自然界中的声音非常复杂,波形极其复杂,通常我们采用脉冲编码码调制编码,即PCM编码。PCM编码通过抽样、量化、编码三个步骤将连续变化的模拟信号转换为数字信号


采样(sample
  数码音频系统是通过将声波波形转换成一连串的二进制数据来再现原始声音的(原始声音是模拟信号),实现这个步骤使用的设备是模/数转换器(A/D转换器,或者ADC,或者analog to digital convert)。它以每秒上万次的速率对声波进行采样,每一次采样都记录下了原始模拟声波在某一时刻的状态,称之为样本。将一串的样本连接起来,就可以描述一段声波了,把每一秒钟所采样的数目称为采样频率或采率,单位为HZ(赫兹)。采样频率越高所能描述的声波频率就越高。采样率决定声音频率的范围(相当于音调),可以用数字波形表示。以波形表示的频率范围通常被称为带宽。要正确理解音频采样可以分为采样的位数和采样的频率。


采样位数(采样精度)
电脑中的声音文件是用数字0和1来表示的。所以在电脑上录音的本质就是把模拟声音信号转换成数字信号。反之,在播放时则是把数字信号还原成模拟声音信号输出。采样位数可以理解为采集卡处理声音的解析度。这个数值越大,解析度就越高,录制和回放的声音就越真实。采集卡的位是指采集卡在采集和播放声音文件时所使用数字声音信号的二进制位数。采集卡的位客观地反映了数字声音信号对输入声音信号描述的准确程度。8位代表2的8次方--256,16 位则代表2的16次方--64K。


采样率(sample rate
  单位时间内对媒体对象的采样次数,单位Hz。采样频率是指录音设备在一秒钟内对声音信号的采样次数,采样频率越高声音的还原就越真实越自然。在当今的主流采集卡上,采样频率一般共分为 22.05KHz、44.1KHz(44100Hz)、48KHz三个等级,22.05 KHz只能达到FM广播的声音品质,44.1KHz则是理论上的CD音质界限,48KHz则更加精确一些。对于高于48KHz的采样频率人耳已无法辨别出来了,所以在电脑上没有多少使用价值。
  5kHz的采样率仅能达到人们讲话的声音质量。
  11kHz的采样率是播放小段声音的最低标准,是CD音质的四分之一。
  22kHz采样率的声音可以达到CD音质的一半,目前大多数网站都选用这样的采样率。
  44kHz的采样率是标准的CD音质,可以达到很好的听觉效果。


通道数(channel)
  分为单声道mono;立体声stereo。当然还存在更多的通道数。举个列子,声道多,效果好,两个声道,说明只有左右两边有声音传过来, 四声道,说明前后左右都有声音传过来


比特率(bitrate)
  也叫码率。针对编码格式,表示压缩编码后每秒的音频数据量大小。计算公式:比特率 = 采样率 x 采样精度 x 声道数。单位kbps,这里的k为1000


VBR、ABR、CBR
  VBR(Variable Bitrate)动态比特率。也就是没有固定的比特率,压缩软件在压缩时根据音频数据即时确定使用什么比特率。这是Xing发展的算法,他们将一首歌的复杂部分用高Bitrate编码,简单部分用低Bitrate编码。主意虽然不错,可惜Xing编码器的VBR算法很差,音质与CBR相去甚远。幸运的是, Lame完美地优化了VBR算法,使之成为MP3的最佳编码模式。这是以质量为前提兼顾文件大小的方式时推荐的编码模式。
  ABR(Average Bitrate)平均比特率,是VBR的一种插值参数。Lame针对CBR不佳的文件体积比和VBR生成文件大小不定的特点独创了这种编码模式。ABR也被称为“Safe VBR”,它是在指定的平均Bitrate内,以每50帧(30帧约1秒)为一段,低频和不敏感频率使用相对低的流量,高频和大动态表现时使用高流量。举例来说,当指定用192kbps ABR对一段wav文件进行编码时,Lame会将该文件的85%用192kbps固定编码,然后对剩余15%进行动态优化:复杂部分用高于192kbps 来编码、简单部分用低于192kbps来编码。与192kbps CBR相比,192kbps ABR在文件大小上相差不多,音质却提高不少。ABR编码在速度上是VBR编码的2到3倍,在128-256kbps范围内质量要好于CBR。可以做为 VBR和CBR的一种折衷选择。
  CBR(Constant Bitrate),常数比特率,指文件从头到尾都是一种位速率。相对于VBR和ABR来讲,它压缩出来的文件体积很大,但音质却不会有明显的提高。


有损和无损
  根据采样和量化的过程可知,音频编码最多只能做到无限接近 自然界的信号 ,至少目前的技术还不可能将其完全一样。这是因为自然界的信号是连续的,而音频编码后的 值 是离散的。因此,任何数字音频编码方案都是有损的,这也就意味着任何的音频都不可能完全还原出自然界的声音。
  在计算机应用中, PCM编码 能够达到最高保真水平。它已经被广泛地应用于素材保存及音乐欣赏,包括CD、DVD以及 WAV文件等等。因此,PCM约定俗成了无损编码,但是这并不意味着PCM就能够确保信号绝对保真,PCM也只能做到最大程度的无限接近。
  我们习惯性地把MP3列入有损音频编码范畴,这是相对PCM编码的。
  强调编码的相对性的有损和无损,要做到真正的无损是非常困难,甚至是不可能的。就如同,我们用小数去表达圆周率,不管小数精度有多高,也只能无限地接近,而不是真正等于圆周率的值。


为什么要使用音频压缩技术?
  要算一个PCM音频流的码率是一件很轻松的事情,采样率值&TImes;采样大小值&TImes;声道数bps。一个采样率为44.1KHz,采样大小为16bit,双声道 的PCM编码的WAV文件,它的数据速率则为 44.1K&TImes;16&TImes;2=1411.2 Kbps。我们常说128K的MP3,对应的WAV的参数,就是这个1411.2Kbps,这个参数也被称为数据带宽,它和ADSL中的带宽是一个概念。 将码率除以8,就可以得到这个WAV的数据速率,即176.4KB/s。这表示存储一秒钟采样率为44.1KHz,采样大小为16bit,双声道的PCM 编码的音频信号,需要176.4KB的空间,1分钟则约为10.34M,这对大部分用户是不可接受的,尤其是喜欢在电脑上听音乐的朋友,要降低磁盘占用, 只有2种方法,降低采样指标或者压缩。降低指标是不可取的,因此专家们研发了各种压缩方案。由于用途和针对的目标市场不一样,各种音频压缩编码所达到的音 质和压缩比都不一样,在后面的文章中我们都会一一提到。有一点是可以肯定的,他们都压缩过。


频率与采样率的关系
  采样率表示了每秒对原始信号采样的次数,我们常见到的音频文件采样率多为44.1KHz,这意味着什么呢?假设我们有2段正弦波信号,分别为 20Hz和20KHz,长度均为一秒钟,以对应我们能听到的最低频和最高频,分别对这两段信号进行40KHz的采样,我们可以得到一个什么样的结果呢?结果是:20Hz的信号每次振动被采样了40K/20=2000次,而20K的信号每次振动只有2次采样。显然,在相同的采样率下,记录低频的信息远比高频的详细。这也是为什么有些音响发烧友指责CD有数码声不够真实的原因,CD的44.1KHz采样也无法保证高频信号被较好记录。要较好的记录高频信号,看来需要更高的采样率,于是有些朋友在捕捉CD音轨的时候使用48KHz的采样率,这是不可取的!这其实对音质没有任何好处,对抓轨软件来说,保持和CD提供的44.1KHz一样的采样率才是最佳音质的保证之一,而不是去提高它。较高的采样率只有相对模拟信号的时候才有用,如果被采样的信号是数字的,请不要 去尝试提高采样率。


PCM编码
  PCM脉冲编码调制是Pulse CodeModulation的缩写。前面的文字我们提到了PCM大致的工作流程,我们不需要关心PCM最终编码采用的是什么计算方式,我们只需要知道 PCM编码的音频流的优点和缺点就可以了。PCM编码的最大的优点就是音质好,最大的缺点就是体积大。我们常见的AudioCD就采用了PCM编码,一张光盘的容量只能容纳72分钟的音乐信息。


WAVE
  这是一种古老的音频文件格式,由微软开发。WAV是一种文件格式,符合 PIFF Resource Interchange FileFormat规范。所有的WAV都有一个文件头,这个文件头音频流的编码参数。WAV对音频流的编码没有硬性规定,除了PCM之外,还有几乎所有 支持ACM规范的编码都可以为WAV的音频流进行编码。很多朋友没有这个概念,我们拿AVI做个示范,因为AVI和WAV在文件结构上是非常相似的,不过 AVI多了一个视频流而已。我们接触到的AVI有很多种,因此我们经常需要安装一些Decode才能观看一些AVI,我们接触到比较多的DivX就是一种 视频编码,AVI可以采用DivX编码来压缩视频流,当然也可以使用其他的编码压缩。同样,WAV也可以使用多种音频编码来压缩其音频流,不过我们常见的 都是音频流被PCM编码处理的WAV,但这不表示WAV只能使用PCM编码,MP3编码同样也可以运用在WAV中,和AVI一样,只要安装好了相应的 Decode,就可以欣赏这些WAV了。
  在Windows平台下,基于PCM编码的WAV是被支持得最好的音频格式,所有音频软件都能完美支持, 由于本身可以达到较高的音质的要求,因此,WAV也是音乐编辑创作的首选格式,适合保存音乐素材。因此,基于PCM编码的WAV被作为了一种中介的格式, 常常使用在其他编码的相互转换之中,例如MP3转换成WMA。


MP3编码
  MP3作为目前最为普及的音频压缩格式,为大家所大量接受,各种与MP3相关的软件产品层出不穷,而且更多的硬件产品也开始支持MP3,我们能够买 到的VCD/DVD播放机都很多都能够支持MP3,还有更多的便携的MP3播放器等等,虽然几大音乐商极其反感这种开放的格式,但也无法阻止这种音频压缩 的格式的生存与流传。MP3发展已经有10个年头了,他是MPEG(MPEG:Moving Picture Experts Group) AudioLayer-3的简称,是MPEG1的衍生编码方案,1993年由德国FraunhoferIIS研究院和汤姆生公司合作发展成功。MP3可以 做到12:1的惊人压缩比并保持基本可听的音质,在当年硬盘天价的日子里,MP3迅速被用户接受,随着网络的普及,MP3被数以亿计的用户接受。MP3编 码技术的发布之初其实是非常不完善的,由于缺乏对声音和人耳听觉的研究,早期的mp3编码器几乎全是以粗暴方式来编码,音质破坏严重。随着新技术的不断导 入,mp3编码技术一次一次的被改良,其中有2次重大技术上的改进。
  VBR:MP3格式的文件有一个有意思的特征,就是可以边读边放,这也符合流媒体的最基本特征。也就是说播放器可以不用预读文件的全部内容就可以播放,读到哪里播放到哪里,即使是文件有部分损坏。虽然mp3可以有文件头,但对于 mp3格式的文件却不是很重要,正因为这种特性,决定了MP3文件的每一段每一帧都可以单独的平均数据速率,而无需特别的解码方案。于是出现了一种叫 VBR(Variablebitrate,动态数据速率)的技术,可以让MP3文件的每一段甚至每一帧都可以有单独的bitrate,这样做的好处就是在 保证音质的前提下最大程度的限制了文件的大小。这种技术的优越性是显而易见的,但要运用确实是一件难事,因为这要求编码器知道如何为每一段分配 bitrate,这对没有波形分析的编码器而言,这种技术如同虚设。正是如此,VBR技术并没有一出现就显得光彩夺目。
  专家们通过长期的声学研究,发现人耳存在遮蔽效应。声音信号实际是一种能量波,在空气或其他媒介中传播,人耳对声音能量的多少即响度或声压最直接的 反应就是听到这个声音的大小,我们称它为响度,表示响度这种能量的单位为分贝(dB)。即使是同样响度的声音,人们也会因为它们频率不同而感觉到声音大小 不同。人耳最容易听到的就是4000Hz的频率,不管频率是否增高或降低,即使是响度在相同的情况下,大家都会觉得声音在变小。但响度降到一定程度时,人 耳就听不到了,每一个频率都有着不同的值。
  可以看到这条曲线基本成一个V字型,当频率超过15000Hz时,人耳的会感觉到声音很小,很多听觉不是很好的人,根本就听不到20000Hz的频 率,不管响度有多大。当人耳同时听到两个不同频率、不同响度的声音时,响度较小的那个也会被忽略,例如:在白天我们很难听到电脑中散热风扇的声音,晚上却 成了噪声源,根据这种原理,编码器可以过滤掉很多听不到的声音,以简化信息复杂度,增加压缩比,而不明显的降低音质。这种遮蔽被称为同时遮蔽效应。但声音 A被声音B遮蔽,如果A处于B为中心的遮蔽范围内,遮蔽会更明显,这个范围叫临界带宽。每一种频率的临界带宽都不一样,频率越高的临界带宽越宽。
  频率(Hz) 临界带宽(Hz) 频率(Hz) 临界带宽(Hz)
  50 80 1850 280
  150 100 2150 320
  350 100 2500 380
  450 110 3400 550
  570 120 4000 700
  700 140 4800 900
  840 150 5800 1100
  1000 160 7000 1300
  1170 190 8500 1800
  1370 210 10500 2500
  1600 240 13500 3500
  根据这种效应,专家们设计出人耳听觉心理模型,这个模型被导入到mp3编码中后,导致了一场翻天覆地的音质革命,mp3编码技术一直背负着音质 差的恶名,但这个恶名现在已经逐渐被洗脱。到了此时,一直被埋没的VBR技术光彩四射,配合心理模型的运用便现实出强大的诱惑力与杀伤力。
  长期以来,很多人对MP3印象不好,更多人认为WMA的最佳音质要好过MP3,这种说法是不正确的,在中高码率下,编码得当的MP3要比WMA优秀很多,可以非 常接近CD音质,在不太好的硬件设备支持下,没有多少人可以区分两者的差异,这不是神话故事,尽管你以前盲听就可以很轻松区分MP3和CD,但现在你难保 证你可以分辨正确。因为MP3是优秀的编码,以前被埋没了。”

 

波形数据-特征提取

 

上面介绍了,波形数据的基础概念, 那么读取一个wav格式的文件后,是否是我们可以直接使用的数据呢?

波形在时域上几乎没有描述能力,因此必须将波形作变换处理,常见的一种变换方法是提取MFCC特征,根据人耳的生理特性,把每一帧波形变成一个多维向量,可以简单地理解为这个向量包含了这帧语音的内容信息。这个过程叫做声学特征提取。

我们再源码里可以看到这段代码:

  1. def GetFrequencyFeature3(wavsignal, fs):
  2. if(16000 != fs):
  3. raise ValueError('[Error] ASRT currently only supports wav audio files with a sampling rate of 16000 Hz, but this audio is ' + str(fs) + ' Hz. ')
  4. # wav波形 加时间窗以及时移10ms
  5. time_window = 25 # 单位ms
  6. window_length = fs / 1000 * time_window # 计算窗长度的公式,目前全部为400固定值
  7. wav_arr = np.array(wavsignal)
  8. #wav_length = len(wavsignal[0])
  9. wav_length = wav_arr.shape[1]
  10. range0_end = int(len(wavsignal[0])/fs*1000 - time_window) // 10 # 计算循环终止的位置,也就是最终生成的窗数
  11. data_input = np.zeros((range0_end, 200), dtype = np.float) # 用于存放最终的频率特征数据
  12. data_line = np.zeros((1, 400), dtype = np.float)
  13. for i in range(0, range0_end):
  14. p_start = i * 160
  15. p_end = p_start + 400
  16. data_line = wav_arr[0, p_start:p_end]
  17. data_line = data_line * w # 加窗
  18. data_line = np.abs(fft(data_line)) / wav_length
  19. data_input[i]=data_line[0:200] # 设置为400除以2的值(即200)是取一半数据,因为是对称的
  20. #print(data_input.shape)
  21. data_input = np.log(data_input + 1)
  22. return data_input

每帧的长度为25毫秒,每两帧之间有25-10=15毫秒的交叠。我们称为以帧长25ms、帧移10ms分帧。分帧后,语音就变成了很多小段。

 

什么是MFCC Anssel:AI(I)语音(I):MFCC特征参数提取

傅里叶变换: 王希:我理解的傅里叶变换

理解:如何理解傅里叶变换公式?

这两位大佬的分析,可以说入木三分,尤其第二位大佬,看着故事,就懂了

 

通过MFCC特征提取,我们将获得到可以用于训练的语音向量数据。

 

下一篇 来学习CTC算法。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/326659?site
推荐阅读
相关标签
  

闽ICP备14008679号