何建军
【摘要】 本文在安卓平台上设计实现了基于GMM模型的说话人识别系统,完成了GMM模型参数的训练和识别过程。并基于TIMIT语料库,通过调整GMM阶数和测试人数,对基于GMM模型的说话人识别系统的时效性进行了验证分析。实验结果表明:①GMM模型的阶数越多,系统的识别时间越长;②测试人数越多,系统的识别时间越长。在GMM模型阶数不高以及使用人数不多的情况下,该说话人识别系统基本满足用户的使用需求。
【关键词】 美尔频率倒谱系数 高斯混合模型 说话人识别 安卓
引言:
说话人识别,也叫声纹识别,是通过对说话人语音信号的分析处理来完成说话人的辨认或确认。随着嵌入式软硬件技术和无线通信领域的迅猛发展,语音输入和控制将成为手持移动设备和嵌入式系统最佳的交互方式,以声纹信息为特征的身份鉴别技术也越发显得重要。
与基于PC机的说话人识别系统相比,虽然基于嵌入式设备的说话人识别系统在存儲容量、运算速度等方面都不及PC机,但是,基于嵌入式设备的说话人识别系统由于同时具备嵌入式系统本身的低功耗、便携性、可靠性,以及说话人识别技术的准确性、方便性、经济性等诸多优势[1],随着嵌入式软硬件技术和无线电通信技术的迅猛发展,基于嵌入式设备的说话人识别系统的优势越发彰显。
一、说话人识别技术
目前,说话人识别新技术接连不断出现,如GMM-UBM结构[2]与支持向量机(support vector machine,简称SVM) [3-4]结合技术、基于得分规整技术的HNORM、ZNORM和TNORM技术、潜伏因子分析(latent factor analysis,简称LFA)技术、大词汇表连续语音识别(large vocabulary continuous speech recognition,简称LVCSR)应用于说话人识别技术、话音信号中的高维信息使用、以及用于解决通道失配问题的SMS技术等等。然而,当今最出色的说话人识别系统依然是基于GMM模型的,尤其是基于UBM-MAP结构的。
说话人识别的目的是识别出说话人的身份,其前提是需要提供说话人所讲的一段话,从而从该语音中提取能够反映说话人个性的特征参数,再分析和处理这些参数,最终甄别出说话人的身份。其实质是一个模式识别[5-6]的问题,基本原理是将待识别的说话人模型与现存模板库中的模型进行比较,根据概率似然度或某种距离来判定待识别的说话人是库中哪个说话人,或判断待识别的说话人究竟是不是所声称的那个说话人。说话人识别系统通常由语音信号预处理、说话人特征参数提取、模型参数训练、模式匹配和结果判决等几部分组成,其基本结构框图[7]如图1所示。此外,说话人识别系统还必须对判决阈值进行选择,从而达到较好的识别效果。
一个完整的说话人识别系统的建立和应用可分为模型参数训练阶段和结果识别阶段[8]。
模型训练框图如图2所示。
结果识别框图如图3所示。
本文语音加窗预处理使用的是汉明窗,采用美尔频率倒谱系数(Mel Frequency Cepstrum Coefficient,简称MFCC)[9-11]作为特征参数,采用高斯混合模型作为训练/识别模型。
二、系统实现及实验结果分析
2.1系统在安卓平台的实现
2.1.1 软件开发环境
软件开发环境如下:
1.操作系统:Windows XP;
2.开发环境:Eclipse 3.5;
3.开发工具包:JDK1.6和Android 2.2 SDK。
2.1.2 用户界面
用户界面是使用安卓提供的GUI组件实现的,最终实现的效果如图4所示。
训练部分:训练时,先设置特征向量和GMM模型参数,然后点击“选择语音文件”按钮选择训练语音文件,最后点击“建立模型”或“继续训练”按钮进行模型训练,并保存模型参数,模型训练流程如图5所示。
识别时,同样需要先设置特征向量和GMM模型参数,然后点击“选择语音文件”选择待识别语音文件,最后点击“识别”按钮进行识别并输出匹配结果,识别流程如图6所示。
2.1.3 语音数据
语音数据提取主要实现由类WavReader(如图7所示)完成,用户选择语音文件后,在选择“建立模型”、“继续训练”或“识别”按钮时,主程序将语音文件路径传入类WavReader中,类WavReader则从语音文件中读取并返回语音数据。
类WavReader的主要成员方法说明:
1. public WavReader( String fileName )
该方法用于实例化一个WavReader对象。其中,方法参数为待读取的语音文件路径。
2. public int getSampleRate( )
该方法用于获取wav文件的采样率。
3. public int getNumSamples( )
该方法用于获取wav文件数据点数,即语音数据采样点数。
4. public double[] getSampleData( )
该方法用于获取Wav文件语音数据,获取的语音数据长度为getNumSamples()的返回值。
2.1.4 特征提取
本文采用MFCC作为特征参数,先将语音的功率谱转换成Mel频率对应的功率谱,再进行滤波取对数,最后进行离散余弦变换的方法求取出来,其计算流程如图8所示。
特征提取的主要实现由类MFCC(如图9所示)完成,用户选择语音文件后,再次选择“建立模型”、“继续训练”或“识别”按钮时,主程序将读取出的语音采样数据与待提取特征矢量的相关参数传入类MFCC中,类MFCC则进行特征参数提取并返回特征矢量。
类MFCC的主要成员方法说明:
1. public MFCC(int sampleRate, int windowSize, int incSize, int
numberCoefficients, int numberFilters)
该方法用于实例化一个MFCC对象。其中,方法参数sampleRate为语音数据采样率;windowSize为一帧语音数据采样点数,即帧长;incSize为相邻两帧重叠点数,即帧移;numberCoefficients为MFCC参数维数;numberFilters为Mel尺度滤波器数。
2. public float[][] melcepst(double input[])
该方法用于从语音数据中提取MFCC特征参数。其中,方法参数input为从wav文件中提取出来的语音数据。
3. private double[] hamming(int size)
该方法用于产生汉明窗。其中,方法参数size为窗口长度。
4. private double[][] enframe(double input[], double window[], int frameShift)
该方法用于对语音数据进行分帧。其中,方法参数input为待分帧语音数据;window为帧长,也是加窗操作的汉明窗窗口长度;frameShift为帧移。
5. private Map rfft(double input[][], int row, int column, int n, int dim)
该方法用于计算语音信号的频谱,即进行短时傅里叶变换(DFT)。其中,方法参数input为分帧后的语音数据;row为分帧语音数据的列数;column為分帧语音数据的行数;n为FFT变换点数;dim为矩阵维数。
6. private Map melbankm(int melChnNum, int fftSize, int fs, float fl, float fh)
该方法用于计算Mel尺度滤波器系数。其中,方法参数melChnNum为Mel尺度滤波器数;fftSize为FFT长度;fs为采样率;fl为Mel滤波器的开始间隔;fh为Mel滤波器的结束间隔。
7. private double[][] rdct(double x[][], int m, int k)
该方法用于对Mel尺度滤波器输出的对数功率谱进行反离散余弦变换(DCT)。其中,方法参数x为滤波器输出的对数功率谱;m为FFT长度;k为帧长。
2.1.5 模型训练/识别
模型训练/识别的主要实现由类Gauss(如图10所示)完成,用户选择语音文件,及选择“建立模型”或“继续训练”后,主程序将读取出的语音采样数据与待提取特征矢量的相关参数传入类Gauss中,类Gauss则进行GMM模型参数估计。
类Gauss的主要成员方法说明:
1. public Map gaussmix(float x[][], float c, float l, int m0, String v0)
该方法用于初始化GMM模型参数。其中,方法参数x为MFCC特征参数;c为最小方差的归一化数据;l的整数部分为最大迭代次数,小数部分为迭代终止阀值;m0为GMM混合数;v0为GMM初始方法设置。
本函数采用K-均值聚类算法初始化GMM模型参数。
2. public Map gaussmix(float x[][], float c, float l, float m0[][], float v0[][], float w0[])
该方法用于估计GMM模型参数。其中,方法参数x为MFCC特征参数;c为最小方差的归一化数据;l的整数部分为最大迭代次数,小数部分为迭代终止阀值;m0为GMM模型的均值矩阵;v0为GMM模型的方差矩阵;w0为GMM模型的权重向量。
本函数采用EM算法对GMM模型参数进行估算。
3. public Map gaussmixp(float y[][], float m[][], float v[][], float w[])
该方法用于计算对数似然度。其中,方法参数y为MFCC特征参数;m为GMM模型的均值矩阵;v为GMM模型的方差矩阵;w为GMM模型的权重向量。
4. private Map gaussmix_train_diagonal(float xs[][], float m[][], float v[][],float w[],float c, float l, float sx0[], float mx0[])
该方法用于估计GMM模型参数,协方差矩阵取对角阵。其中,方法参数xs为MFCC特征参数;m为GMM模型的均值矩阵;v为GMM模型的方差矩阵;w为GMM模型的权重向量;c为最小方差的归一化数据;l的整数部分为最大迭代次数,小数部分为迭代终止阀值;sx0和mx0为gaussmix( )方法内部使用变量。
5. public Map kmeans(float d[][], int k, String x0, int l)
该方法为K-均值聚类算法。其中,方法参数d为待分类的数据;k为GMM模型混合数;x0为初始化方法设置;l为最大迭代次数。
2.1.6 模型参数存取
模型训练完成后,需將模型参数存储在SD卡中,在识别时从SD卡读出。模型参数存取的主要实现由类Matrix(如图11所示)完成。
识别时,同样需要先设置特征向量和GMM模型参数,然后点击“选择语音文件”选择待识别语音文件,最后点击“识别”按钮进行识别并输出匹配结果,识别流程如图6所示。
操作Matrix的主要方法说明:
1. public void writeMatrix(Matrix matrix,String fileName)
该方法用于将Matrix对象数据保存到文件中。其中,方法参数matrix为待写入的矩阵数据;fileName为待写入文件的文件名。
2. public Matrix readMatrix(String fileName)
该方法用于从文件中读取Matrix对象数据。其中,方法参数fileName为待读取矩阵数据的文件名。
估计出的GMM模型参数的存储、读取分别由函数writeMatrix()和readMatrix()来完成。
2.1.7 权限声明
要实现对SD卡的写入、删除,以及录音操作,需为应用程序添加相应操作权限。应用程序的操作权限需AndroidManifest.xml文件中添加,即在
1.添加写SD卡权限
2.添加SD卡文件删除权限
3.添加录音权限
2.2 实验结果分析
在安卓平台手机上进行说话人识别,时效性是影响系统性能的一个重要指标。实验从TIMIT语音库中随机选取20人的语音作为样本,分别从不同训练语音时长和不同测试人数对说话人识别系统的时效性进行了分析。
2.2.1 实验环境
识别系统的运行环境为LG P990手机,其主要配置如下:
1. CPU:双核1GHz;
2. RAM:512MB;
3.操作系统:安卓 2.2。
2.2.2 GMM模型的阶数对系统时效性的影响
GMM模型的阶数不同,系统的识别时间也不相同,为了测试不同GMM模型的阶数对系统时效性的影响,本论文做了GMM模型阶数对系统时效性影响实验。
实验条件如下:从TIMIT语音库中选取10人的10段语音作为样本数据,平均每段语音长4.5秒, 任选其中一段作为测试数据,在MFCC系数的维数为12,测试人数为10的情况下,分别用不同GMM模型阶数测试系统的识别时间,测试结果如表1所示:
从实验结果可以看出,GMM模型的阶数越多,系统的识别时间越长。因此,为安卓平台手机选择一个合适的GMM模型阶数是很有必要的。一般来说,阶数的选择不易取得过高,但也不能太小,往往需要大量的实验数据来确定。
2.2.3 测试人数对系统时效性的影响
测试人数不同,系统的识别时间也不相同,为了测试不同人数对系统时效性的影响,本论文做了测试人数对系统时效性影响实验。
实验条件如下:从TIMIT语音库中选取20人的20段语音作为样本数据,平均每段语音长4.5秒, 任选其中一段作为测试数据,在GMM模型的阶数为16,MFCC系数的维数为12的情况下,分别用不同人数测试系统的识别时间,测试结果如表2所示:
从实验结果可以看出,测试人数越多,系统的识别时间越长。因此,在安卓平台手机上进行说话人识别,应限制使用人数,过长的系统识别时间是人们所不能接受的。
四、结束语
本文在Android平台上设计实现的基于GMM的说话人识别系统,并通过实验分析了不同模型参数以及不同人数对系统时效性的影响。实验结果表明,在GMM模型阶数不高以及使用人数不多的情况下,本文实现的说话人识别系统基本满足用户的使用需求。
参 考 文 献
[1]哈斯塔木嘎. 嵌入式Linux环境下与文本有关的说话人确认系统的实现[D]. 呼和浩特:内蒙古大学学位论文,2009:1-2.
[2]周玥媛,孔钦. 基于 GMM-UBM 的声纹识别技术的特征参数研究[J].计算机技术与发展,2020,30(5):76-83.
[3] Cortes C, Vapnik V. Support-Vector Networks[J]. Machine Learning, 1995,20(3):273-297.
[4]李荟, 赵云敏. GMM-UBM和 SVM在说话人识别中的应用[J]. 计算机系统应用,2018,27(1):225-230.
[5]齐敏,李大健,郝重阳. 模式识别导论[M]. 北京:清华大学出版社,2009:27-30.
[6]孙即祥. 现代模式识别(第二版)[M]. 北京:高等教育出版社,2008:47.
[7] Reynolds D A, Quatieri T F, Dunn R B. Speaker Verification Using Adapted Gaussian Mixture Model[J]. Digital Signal Processing,2000 (10):19-41.
[8]陈强. 基于GMM的说话人识别系统研究与实现[D]. 武汉:武汉理工大学硕士学位论文,2010:31.
[9]周萍 沈昊,郑凯鹏. 基于MFCC 与GFCC 混合特征参数的说话人识别[J]. 应用科学学报,2019,37(1):24-32.
[10]邵央等. 基于MFCC和加权矢量量化的说话人识别系统[J]. 计算机工程与应用,2002(5):127-128.
[11]蒋皓石. 基于矢量量化的说话人识别研究[D]. 长沙:国防科学技术大学硕士学位论文,2005:24-26.