2018-11-06 09:43:13 Xwei1226 阅读数 5891
• C++语音识别开篇

本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹，国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

5907 人正在学习 去看看 杨波

好久没写博客了，今天更新一下使用Python提取声学模型的特征，一共三种特征，分别是MFCC、FABNK以及语谱图特征，直接上Python代码。

``````# -*- coding:utf-8 -*-
# author:zhangwei

"""
该脚本用于提取语音特征，包括MFCC、FBANK以及语谱图特征；
该脚本是对标签数据进行处理；
"""

from python_speech_features import mfcc, delta, logfbank
import wave
import numpy as np
from scipy.fftpack import fft

'''
获取文件数据以及采样频率；
输入为文件位置，输出为wav文件数学表示和采样频率；
'''
wav = wave.open(filename, 'rb')
num_frames = wav.getnframes()
num_channels = wav.getnchannels()
framerate = wav.getframerate()
wav.close()
wave_data = np.fromstring(str_data, dtype=np.short)
wave_data.shape = -1, num_channels
wave_data = wave_data.T
return wave_data, framerate

def get_mfcc_feature(wavsignal, fs):
'''
输入为wav文件数学表示和采样频率，输出为语音的MFCC特征+一阶差分+二阶差分；
'''
feat_mfcc = mfcc(wavsignal, fs)
print(feat_mfcc)
feat_mfcc_d = delta(feat_mfcc, 2)
feat_mfcc_dd = delta(feat_mfcc_d, 2)
wav_feature = np.column_stack((feat_mfcc, feat_mfcc_d, feat_mfcc_dd))
return wav_feature

def get_fbank_feature(wavsignal, fs):
'''
输入为wav文件数学表示和采样频率，输出为语音的FBANK特征+一阶差分+二阶差分；
'''
feat_fbank = logfbank(wavsignal, fs, nfilt=40)
feat_fbank_d = delta(feat_fbank, 2)
feat_fbank_dd = delta(feat_fbank_d, 2)
wav_feature = np.column_stack((feat_fbank, feat_fbank_d, feat_fbank_dd))
return wav_feature

def get_frequency_feature(wavsignal, fs):
'''
输入为wav文件数学表示和采样频率,输出为语谱图特征，特征维度是200；
'''
x = np.linspace(0, 400 - 1, 400, dtype=np.int64)
w = 0.54 - 0.46 * np.cos(2 * np.pi * (x) / (400 - 1))
time_window = 25
wav_array = np.array(wavsignal)
wav_length = wav_array.shape[1]
first2end = int(len(wavsignal[0]) / fs * 1000 - time_window) // 10
data_input = np.zeros(shape=[first2end, 200], dtype=np.float)
for i in range(0, first2end):
p_start = i * 160
p_end = p_start + 400
data_line = wav_array[0, p_start:p_end]
data_line = data_line * w
data_line = np.abs(fft(data_line)) / wav_length
data_input[i] = data_line[0: 200]
data_input = np.log(data_input)
return data_input

def get_wav_list(filepath):
'''
读取标签文件，并把标签文件与标签位置进行处理，输入为处理好的标签位置，输出为标签位置列表以及标签位置字典；
'''
list_wav = []
dic_filelist = {}
with open(filepath, 'r') as fr:
for line in lines:
res = line.strip().split(' ')
dic_filelist[res[0]] = res[1]
list_wav.append(res[0])
return dic_filelist , list_wav

def get_wav_text(filename):
'''
输入为文件位置，输出为标签位置以及标签字典（'D31_984': ['早稻', '播种', '和', '育秧', '的', '天气', '条件', '有利', '与否', '与', '这', '一', '期间', '的', '日', '平均', '温度', '阴雨', '日数', '密切', '相关'], 'D12_867':）；
'''
dic_wav_list = {}
list_text = []
with open(filename ,'r') as fr:
for line in lines:
res = line.strip().split()
list_text.append(res[0])
dic_wav_list[res[0]] = res[1 :]
return dic_wav_list , list_text

if __name__ == '__main__':
# filepath = 'D4_750.wav'
filepath = '/home/zhangwei/PycharmProjects/ASR_MFCC/datalist/test.word.txt'
# a = get_mfcc_feature(wavsignal , fs)
# b = get_fbank_feature(wavsignal , fs)
# get_frequency_feature(wavsignal , fs)
# get_wav_list(filepath)
get_wav_text(filepath)``````
```
```

2019-12-21 20:51:47 BBJG_001 阅读数 83
• C++语音识别开篇

本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹，国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

5907 人正在学习 去看看 杨波

openSMILE语音特征提取工具的使用

https://zhuanlan.zhihu.com/p/69170521

一、openSMILE简介

openSMILE是一个语音特征提取的工具，在语音识别(特征提取前端、关键字识别等.)，情感计算(情感识别、敏感虚拟代理等)，音乐信息检索(和弦标注、节拍跟踪、起跳检测等)等领域有着较为广泛的应用。

openSMILE可以处理的视频文件格式包括：

•RIFF-WAVE (PCM) (MP3, MP4, OGG等需要使用转换器)
•逗号分隔值(CSV)
•HTK参数les
•WEKA的ARFF格式
•通过openCV的视频流

openSMILE可以提取一下音频特征

• Frame Energy
• Frame Intensity / Loudness (approximation)
• Critical Band spectra (Mel/Bark/Octave, triangular masking lters)
• Mel-/Bark-Frequency-Cepstral Coecients (MFCC)
• Auditory Spectra
• Loudness approximated from auditory spectra.
• Perceptual Linear Predictive (PLP) Coecients
• Perceptual Linear Predictive Cepstral Coecients (PLP-CC)
• Linear Predictive Coecients (LPC)
• Line Spectral Pairs (LSP, aka. LSF)
• Fundamental Frequency (via ACF/Cepstrum method and via Subharmonic-Summation (SHS))
• Probability of Voicing from ACF and SHS spectrum peak
• Voice-Quality: Jitter and Shimmer
• Formant frequencies and bandwidths
• Zero- and Mean-Crossing rate
• Spectral features (arbitrary band energies, roll-o points, centroid, entropy, maxpos, minpos, variance (=spread), skewness, kurtosis, slope)
• Psychoacoustic sharpness, spectral harmonicity
• CHROMA (octave warped semitone spectra) and CENS features (energy normalised and smoothed CHROMA)
• CHROMA-derived Features for Chord and Key recognition
• F0 Harmonics ratios

• HSV colour histograms
• Local binary patterns (LBP)
• LBP histograms
• Optical fow and optical fow histograms
• Face detection: all these features can be extracted from an automatically detected facial region, or from the full image.

二、openSMILE工作机制

openSMILE工具自带多种语音特征提取的配置文件，通过调用配置文件，可以按配置文件的预设提取响应的语音特征。openSMILE中包含以下的配置文件供使用者选择。

• Chroma features for key and chord recognition
• MFCC for speech recognition
• PLP for speech recognition
• Prosody (Pitch and loudness)
• The INTERSPEECH 2009 Emotion Challenge feature set
• The INTERSPEECH 2010 Paralinguistic Challenge feature set
• The INTERSPEECH 2011 Speaker State Challenge feature set
• The INTERSPEECH 2012 Speaker Trait Challenge feature set
• The INTERSPEECH 2013 ComParE feature set
• The MediaEval 2012 TUM feature set for violent scenes detection.
• Three reference sets of features for emotion recognition (older sets, obsoleted by the new INTERSPEECH challenge sets)
• Audio-visual features based on INTERSPEECH 2010 Paralinguistic Challenge audio features.

四、 特征提取实现

openSMILE语音特征提取的命令如下

SMILExtract_Release -C 配置文件路径 -I “要处理的音频路径” -O “要保存特征向量的路径及文件名”

五、 使用python编程批量提取语音特征

https://blog.csdn.net/cg896406166/article/details/81066791

1. 读取指定文件中所有的语音文件，依次处理，将生成的特征文件保存到另一个指定文件中，代码如下
``````import os
audio_list=os.listdir(audio_path)   # 生成所有音频文件文件名的列表
features_list=[]
for audio in audio_list:    # 遍历指定文件夹下的所有文件
if audio[-4:]=='.wav':
this_path_input=os.path.join(audio_path, audio)  # 打开一个具体的文件，audio_path+audio
this_path_output=os.path.join(output_path,audio[:-4]+'.txt')
# &&连续执行；C: 进入C盘内；进入opensmile中要执行的文件的目录下；执行文件 -C 配置文件 -I 语音文件 -O 输出到指定文件
cmd = 'C: && cd C:/Program/opensmile-2.3.0/bin/Win32 && SMILExtract_Release -C C:/Program/opensmile-2.3.0/config/IS09_emotion.conf -I ' + this_path_input + ' -O ' + this_path_output
os.system(cmd)
print('over~')
``````
1. 批量处理生成特征的文本文件，提取组合出可以用来学习处理的矩阵文件。代码如下
``````import os
import pandas as pd

txt_list = os.listdir(txt_path)
features_list = []
for file in txt_list:    # 遍历指定文件夹下的所有文件
if file[-4:] == '.txt':
file_path = os.path.join(txt_path, file)
# 打开输出文件
f = open(file_path)
# 最后一行是特征向量，取最后一行
f.close()
features = last_line.split(',')
# 最后一行特征行的第一个元素为‘unknown’，最后一个为‘?’，都不是对应的特征，要去掉
features = features[1:-1]
features_list.append(features)
data_m = pd.DataFrame(features_list)
print('over')
``````

2018-01-05 10:58:01 w_manhong 阅读数 13069
• C++语音识别开篇

本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹，国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

5907 人正在学习 去看看 杨波

1. 能将语音信号转换为计算机能够处理的语音特征向量

2. 能够符合或类似人耳的听觉感知特性

3. 在一定程度上能够增强语音信号、抑制非语音信号

（1）线性预测分析（LinearPredictionCoefficients，LPC）

拟人类的发声原理，通过分析声道短管级联的模型得到的。假设系统的传递函数跟全极点的数字滤波器是相似的，通常用12-16个极点就可以描述语音信号的特征。所以对于n时刻的语音信号，我们可以用之前时刻的信号的线性组合近似的模拟。然后计算语音信号的采样值和线性预测的采样值。并让这两者之间达到均方的误差（MSE）最小，就可以得到LPC。

（2）感知线性预测系数（PerceptualLinearPredictive，PLP）

一种基于听觉模型的特征参数。该参数是一种等效于LPC的特征，也是全极点模型预测多项式的一组系数。不同之处是PLP是基于人耳听觉，通过计算应用到频谱分析中，将输入语音信号经过人耳听觉模型处理，替代LPC所用的时域信号，这样的优点是有利于抗噪语音特征的提取。

（3）Tandem特征和Bottleneck特征

这是两种利用神经网络提取的两类特征。Tandem特征是神经网络输出层节点对应类别的后验概率向量降维并与MFCC或者PLP等特征拼接得到。Bottleneck特征是用一种特殊结构的神经网络提取，这种神经网络的其中一个隐含层节点数目比其他隐含层小的多，所以被称之为Bottleneck（瓶颈）层，输出的特征就是Bottleneck特征。

（4）基于滤波器组的Fbank特征（Filterbank）

亦称MFSC，Fbank特征的提取方法就是相当于MFCC去掉最后一步的离散余弦变换，跟MFCC特征相比，Fbank特征保留了更多的原始语音数据。

（5）线性预测倒谱系数（LinearPredictiveCepstralCoefficient，LPCC）

基于声道模型的重要特征参数。LPCC是丢弃了信号生成过程中的激励信息。之后用十多个倒谱系数可以代表共振峰的特性。所以可以在语音识别中取得很好的性能。

（6）梅尔频率倒谱系数（MelFrequencyCepstrumCoefficient，MFCC）

基于人耳听觉特性，梅尔频率倒谱频带划分是在Mel刻度上等距划分的，频率的尺度值与实际频率的对数分布关系更符合人耳的听觉特性，所以可以使得语音信号有着更好的表示。1980年由Davis和Mermelstein搞出来的。从那时起。在语音识别领域，MFCC可谓是鹤立鸡群，一枝独秀。

Q: MFCC为何一枝独秀

人通过声道产生声音，声道的shape决定了发出怎样的声音。声道的shape包括舌头，牙齿等。如果我们可以准确的知道这个形状，那么我们就可以对产生的音素phoneme进行准确的描述。声道的形状在语音短时功率谱的包络中显示出来。而MFCC就是一种准确描述这个包络的一种特征。

处理语音信号，如何去描述它很重要，因为不同的描述方式放映它不同的信息,而声谱图的描述方式是最利于观测和理解的。

由上图可知，这段语音被分为很多帧，每帧语音都对应于一个频谱（通过短时FFT计算），频谱表示频率与能量的关系。在实际使用中，频谱图有三种，即线性振幅谱、对数振幅谱、自功率谱（对数振幅谱中各谱线的振幅都作了对数计算，所以其纵坐标的单位是dB（分贝）。这个变换的目的是使那些振幅较低的成分相对高振幅成分得以拉高，以便观察掩盖在低幅噪声中的周期信号）。

先将其中一帧语音的频谱通过坐标表示出来，如上图（a）。旋转90度，得到图（b）。把这些幅度映射到一个灰度级表示，得到了图（c）。这样操作的原因是为了增加时间维度，，得到一个随着时间变化的频谱图，这个就是描述语音信号的声谱图（spectrogram）。这样就可以显示一段语音而不是一帧语音的频谱，而且可以直观的看到静态和动态的信息。

下面是一个语音的频谱图。峰值就表示语音的主要频率成分，我们把这些峰值称为共振峰（formants），而共振峰就是携带了声音的辨识属性，用它就可以识别不同的声音。因此，需要把它提取出来。要提取的不仅是共振峰的位置，还得提取它们转变的过程。所以我们提取的是频谱的包络（SpectralEnvelope）。这包络就是一条连接这些共振峰点的平滑曲线。

由上图可以看出，原始的频谱由两部分组成：包络和频谱的细节。因此需要把这两部分分离开，就可以得到包络了。按照下图的方式进行分解，在给定logX[k]的基础上，求得logH[k]和logE[k]满足logX[k]=logH[k]+logE[k]。

由上面这个图我们可以看到，包络主要是低频成分，而高频主要是频谱的细节。把它俩叠加起来就是原来的频谱信号了。即，h[k]是x[k]的低频部分，因此将x[k]通过一个低通滤波器就可以得到h[k]了，也就是频谱的包络。

以上解卷过程的专业术语叫做同态信号处理，（另一种方法为基于线性变换）。语音本身可以看成是声道冲击信息（包括话者个性信息、语义信息，表现为频谱低频成分）经过声门激励的一个响应函数，在时域上表现为卷积形式。为将二者分离开来，求得声道共振特征和基音周期，需要把这种非线性问题转化为线性问题第一步通过FFT将其变成了乘性信号（时域的卷积相当于频域的乘积）；第二步通过取对数将乘性信号转化为加性信号；第三步进行逆变换，使其恢复为卷性信号。此时，虽然前后均是时域序列，但它们所处的离散时域显然不同，所以后者称为倒谱频域。计算过程如下图所示。

2018-09-02 22:15:45 alice_tl 阅读数 15186
• C++语音识别开篇

本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹，国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

5907 人正在学习 去看看 杨波

关于语音识别和声纹识别的测试重点分析

1、录入时的声源、环境影响、距离影响

2、讲话人的语速、音量、音色等（通过对几家语音识别的开放demo进行评测后，发现女声的语音识别准确度要高过于男声）

1、语种的覆盖，中文普通话、方言等，英文以及其他的外语等

2、语音的内容覆盖日常对话、衣食住行、新闻资讯等等

3、词库的涵盖，比如出了通用词库，是否包含了应用场景比如金融、法律、医疗对应领域的词库训练

4、不标准的发音和吐词等

2020-01-12 12:38:30 hsb1132 阅读数 30
• C++语音识别开篇

本篇mark老师将教大家使用第三方库的调用来简单的实现语音识别。随着机器学习和人工智能的热闹，国内语音行业也可谓是百花齐放。 语音识别一个伟大的时代已在我们身边悄悄走来。

5907 人正在学习 去看看 杨波

1.因为语音信号不是平稳信号(均值方差等统计特征随时间变化)，所以需要将信号分切成很多短的小范围内平稳的信号段(到音素级别)，也就是分帧，常用的帧长为 25ms,帧移是10ms，前后帧重叠会使前后帧的统计特征不至于变化太大。分帧是用窗口函数与原信号相乘，但时域相乘到了频域是卷积，窗口函数如果用矩形窗则会因为矩形信号频谱有比较大的旁瓣而造成频率泄漏 ，所以一般用旁瓣小的汉明窗。

2.分帧之前有一个加重处理，主要是为了去除口唇辐射的影响，提高语音高频的分辨率，使高频共振峰更加明显，所以将信号过了一个高通滤波器(x[n]=x[n]-a*x[n-1])，以增加高频部分的能量。

3.取窗口内的信号作为一个周期，这个周期以外的数据全用这个周期来扩展，这样取出来的信号不管是不是周期信号，扩展后的信号在整个时间轴上就变成了周期信号，离散周期信号就可以用计算机进行离散傅立叶变换。

4.因为人耳对频率的感知不是等间隔的，所以需要将频率转化为感知上等间隔梅尔频率（ mel=2595*log(1+f/700) ), 然后用一组三角滤器确定信号在各个梅尔频段上的能量。

5.将梅尔频段上的能量取log即得到fbank特征，fbank常作为为DNN特征。

6.频域信号可以成一个低频率包络和高频信号合成(包络*高频细节)，其中低频包络的共振峰对识别音素效果特别显著。将包络与高频分离的方法为:将频域信号取模(这里主要是为做离散余弦变换DCT，离散余弦变换与离散傅立叶变换的差别在于他只在实数域进行变换，一个实偶函数的傅里叶变换仍然是一个实偶函数。DTC是一种压缩傅立叶变换，不同频段压宿密度不同，很多场合低频信息重要度高于高频信息），然后取对数(对数特征对输入信号扰动不敏感)，再进行逆离散傅立叶变换(相当于对频域信号再进行一次傅立叶变换)，得到的结果即为MFCC特征(12维)，然后将得到的特征进行一阶差分(12维）、二阶差分(12维）、能量特征(一维：sum(x[n]*x[n]))，一阶差分能量(一维)，二阶差分能量(一维)，共39维。MFCC特征与Fbank特征相比，各维度之间的相关性小(和DCT变换有关)。