实时语音信号处理教学与实验方法研究

2019-10-15 06:09王青云梁瑞宇冯月芹包永强
实验室研究与探索 2019年9期
关键词:信号处理嵌入式语音

王青云, 梁瑞宇,, 赵 力, 冯月芹, 包永强

(1.南京工程学院 信息与通信工程学院,南京 211167; 2.东南大学 信息科学与工程学院,南京 210096)

0 引 言

伴随人工智能领域的突破性发展,语音信号处理技术愈来愈受到人们关注[1]。语音技术走进通信、机器人、智能家居、健康医疗等各个领域,百度小度、苹果Siri、微软小娜几位语音机器人诙谐机智的对话引爆世界[2]。为了紧跟行业发展方向,众多高校在本科生和研究生教学阶段开设了语音信号处理类课程[3]。但是这类课程在教学实施中存在一些难点。由于专业性强、对数学和信息处理基础要求高、新技术层出不穷且知识更新速度快,同时高校授课学时普遍紧张,导致课程体系、授课内容和深度难以把握,理论与实际应用容易脱节。

实验是语音信号处理课程重要的教学环节。以往该类实验往往采用Matlab平台,以离线处理方式进行[4]。杨毅等[5]研究了基于Matlab的语音信号处理系列实验开设方法,通过基础实验和自主实验培养学生对语音信号处理领域的科研兴趣与动手能力。刘卫东等[6]探索了基于Matlab的语音信号处理实验教学辅助软件的设计。还有一些针对机器人语音处理应用研究了相关的教学实验方法[7]。

对本科生及初学者而言,Matlab平台简单易学。但是,对于研究生或其他专业人员而言,Matlab平台和实际应用的开发系统相差甚远。离线处理和实际在线语音处理所关注的性能指标也完全不同。这种实验方式无法评估实验程序在真实系统中的效能、时延和资源占用情况。为了解决上述问题,需要研究基于嵌入式实时语音处理的教学方法与实验平台,但由于该领域的教学涉及到的专业知识面广,实验方法复杂,目前所提出的可行性方案较少[8-9]。

本文研究实时语音信号处理的教学方法与实验方案,提出基于嵌入式硬件平台、借助嵌入式Linux系统声音框架(Advanced Linux Sound Architecture,ALSA)[10]来实现实时语音信号处理单元实验及综合性实验的方法。为更好地介绍提出的实验教学方法,本文以动态语音情感识别为例,介绍了系统的硬件构成、嵌入式语音处理框架的移植、面向可视化编码的语音处理实现以及面向具体应用的算法实现。该方法在兼顾基础知识的前提下兼顾实用性与前沿性,能够加快授课内容与行业应用的接轨,提高学生的专业能力和工程能力。

1 语音信号处理授课内容与教学方法

语音信号处理课程的目的是讲授语音信号处理的基本理论、基本分析方法,使学习者了解本领域中相关研究热点,激发学习者对语音处理相关研究方向中的有关兴趣,为以后开展相关领域研究打下良好的基础。因此,在授课内容上应兼顾基础性与先进性,教学方法上可结合集中授课与分组讨论等多种方式。具体授课内容与阶段划分如下。

(1) 语音信号处理的基础知识。该部分内容包括语音信号的产生、特性、数学模型等。教学方法方面,应结合具体实例讲授,快速培养学生对课程的学习兴趣,需要时给予一些中英文参考文献,阶段性作业可以为综述性报告。

(2) 语音信号的分析方法。该部分内容包括语音信号的数字化和预处理、短时能量分析、短时过零分析、短时相关分析、短时傅里叶变换、复倒谱与倒谱分析、线性预测分析等。本阶段学习内容多,难度大,对数学知识要求高。在教学中,采用“抽象”变“形象”的方法可以加深学生的理解。如:用彩色语谱图讲解短时傅里叶变换域时频分析。结合具体实例讲解也可以提高学生的兴趣。

(3) 语音信号处理的典型应用。其中语音增强、语音合成和语音识别为重点讲授的典型应用。在以往的语音领域研究中,这些典型应用都涉及很多不同的实现方法。针对不同的授课对象,该部分授课内容和方法可以进行调整。针对本科生授课对象,讲解这些典型应用的基本方法,每种典型应用详细介绍1~2种具体算法。针对研究生授课对象,除讲解典型应用的基本方法外,给予大量的中英文参考文献,要求学生阅读并完成文献综述,最后安排一次研讨课,提交研究报告。

(4) 语音信号处理新领域。该部分内容的讲授将紧随行业发展方向,伴随最新研究进展进行及时调整。除语音隐藏之隐秘通话内容外,随着人工智能领域的飞速发展,语音机器人得到广泛关注。在语音机器人研究中,情感语音机器人又是最前沿的研究热点。语音情感识别和情感语音生成是本阶段授课重点讲授的内容之一。该阶段学习完成后,可以布置大作业,要求学生广泛收集本领域的最新研究进展,提交进展报告或PPT,分组进行研讨,开拓学生视野,指出未来的研究方向和研究方法。

2 实时语音信号处理实验设计与实现

2.1 嵌入式实时语音信号处理实验平台硬件构建

针对实时语音信号处理实验要求,本方案构建嵌入式实时语音信号处理实验平台,采用C语言进行程序设计,和传统的Matlab实验平台相比,具有如下特点:① 更接近实际应用系统,强化学生的工程能力,提高设计水平;② 能够以实时方式进行语音信号处理算法的在线调试;③ 便于评估算法的计算量、延时、存储容量等性能指标,可以为算法的硬件化提供参考。

嵌入式实时语音信号处理实验平台框图如图1所示。

图1 嵌入式实时语音信号处理实验平台框图

嵌入式语音信号处理实验平台主芯片采用ARM Cortex-A8微处理器Samsung S5PV210。该微处理器具有丰富的外设接口,可以满足各类应用需求。系统主频1 GHz,可以直接针对硬件进行裸机程序编程,也可以安装Linux操作系统或Android系统进行驱动代码或应用程序编程。

4路麦克风输入语音信号经过调理电路后输入2块WM8960编解码芯片中。WM8960是24位低功耗、高质量的立体声编解码器,内置有麦克风接口和立体声耳机驱动器以及立体声24 bit Σ-Δ模数转换器(ADC)和数模转换器(DAC),每块芯片支持两路麦克风输入。为了实现声源定位等麦克风阵列信号处理算法,嵌入式实时语音信号处理实验平台采用2块WM8960芯片实现4路麦克风信号输入,通过系统时钟进行数据同步。

2.2 嵌入式Linux高级声音框架移植

嵌入式Linux操作系统由于其完全开源的策略得到广泛应用。在嵌入式Linux操作系统中运行语音信号处理程序要使用到高级Linux声音框架(Advanced Linux Sound Architecture,简称ALSA)。ALSA高效支持所有的音频接口,完全模块化设计,支持应用开发库,为程序设计提供简单便捷的设计方法。使用ALSA编程需要调用库函数,其基本结构如图2所示。在这些库中,ALSA-LIB为应用函数库、ALSA-DRIVER为常见音频芯片的ALSA驱动代码、ALSA-FIRMWARE为DSP或ASIC的专用微码、ALSA-UTILS为ALSA测试工具、ALSA-OSS则提供了用ALSA接口模拟旧的OSS接口的方法。

图2 ALSA函数库基本结构

在嵌入式语音信号处理实验平台中,首先需要移植WM8960驱动函数。由于ALSA中WM8960驱动默认单声道,并且只实现了单片WM8960的驱动,而嵌入式语音信号处理实验平台采用4路麦克风输入,需要2片WM8960芯片,每片分左右声道输入,故需修改驱动代码中的入口和出口函数WM8960_modinit,WM8960_exit这两个函数。

static int __init WM8960_modinit(void) //wm8960模块初始化函数

{

int ret;

ret = i2c_add_driver(&WM8960_i2c_driver); /*添加i2c驱动设备*/

if (ret != 0)

{

printk(KERN_ERR "Failed to register WM8960 I2C driver: %d ", ret);

}

return ret;

}

static void __exit wm8960_exit(void) //wm8960模块

退出函数

{

i2c_del_driver(&wm8960_i2c_driver);

}

驱动里的配置默认采用的是I2C0和I2S0,为了使2块WM8960芯片都能工作,还需要添加I2C1和I2S1,因此还需要修改内核的板级配置文件mach-mini210.c。 mini210_devices[]中已有&s3c_device_i2c0,为使用I2C1,还要添加&s3c_device_i2c1。同样,在已有的&s5pv210_device_iis0后面添加&s5pv210_device_iis1。最后,修改I2S的初始化函数,成功激活I2S1。

2.3 音频信号采集与处理

在WM8960驱动移植成功之后,结合ALSA-LIB库函数,可以实现音频信号的采集与处理编程。其主要使用到的ALSA函数集包括:SND_readPcm(),SND_writePcm(),SND_P_getFormat(),SND_setParams(),SND_P_saveRead(),snd_open(),snd_close(),snd_playback(),snd_capture()等。

在嵌入式Linux系统中实现具体的应用时,常用的方式是采用QT开发环境编写图形显示界面并进行语音信号处理编程。例如,短时傅里叶函数short_fa实现代码如下:

/*Y为输入序列,H为窗函数,wlen为窗长,nf为帧数,inc为帧移,startPosition为帧位置即第startPosition帧*/

QVectorshort_fa

(constQVector&Y,constQVector&H,intwlen,intnf,intinc,intstartPosition)

{

QVector F1;

QVector E(wlen); //一帧序列

QVector R(wlen); //短时频谱

F1 = enframe(Y,H,wlen,nf,inc); //分帧

for(int i = 0 ;i

E[i] = F1[startPosition*wlen+i];

}

int width = 2 ; //fft长度

while(width

width = width*2 ; //取大于窗长的最小2的整数次方

}

std::complex f[width]; //复数频谱

for(int i = 0 ; i

f[i].imag() = 0 ;

f[i].real() = E[i];

}

for(int i = wlen ; i

f[i].imag() = 0 ;

f[i].real() = 0 ;

}

fft(f,width); //傅里叶变换

for(int i = 0 ; i

R[i] = log(sqrt(f[i].imag()*f[i].imag()+f[i].real()*f[i].real()));

}

return R;

}

2.4 基于K近邻分类算法的语音情感识别实现

考虑到实验教学的时间限制,本文介绍基于K近邻(K-Nearest Neighbor,KNN)分类算法的语音情感识别算法在上述嵌入式实时语音信号处理平台的实现方法。KNN分类算法,是一种较为简单直观的分类方法,虽然简单,但在语音情感识别中表现出的性能却很好。KNN分类器的分类思想是:给定一个在特征空间中的待分类的样本,如果其附近的K个最邻近的样本中的大多数属于某一个类别,那么当前待分类的样本也属于这个类别。

设待分类样本的特征参数为X,已知类别的训练样本集样本的特征参数集为{X1,X2,…,Xn};对于待测样本X,计算其与{X1,X2,…,Xn}中每一样本的欧氏距离D(X,Xl),l=1,2,…,n即:

(1)

l=1,2,…,n

式中:i为时间标号;N为特征向量的维数。min{D(X,Xl)}称为X的最近邻,而将D(X,Xl)从小到大排列后的前K个值称为X的K近邻。分析K近邻中属于哪一类别的个数最多,则将X归于该类。

KNN算法大致可分为4步:

(1) 由特征提取函数提取训练样本的特征向量,构成训练样本特征向量集合{X1,X2,…,Xn}。

(2) 设定算法中K的值。K值的确定没有一个统一的方法(根据具体问题选取的K值可能有较大的区别)。一般方法是先确定一个初始值,然后根据实验结果不断调试,最终达到最优。

(3) 利用特征向量提取函数提取待测样本的特征向量X,并计算X与{X1,X2,…,Xn}中每一样本的欧氏距离D(X,Xl),l=1,2,…,n。

(4) 统计D(X,Xl),l=1,2,…,n中K个最近邻的类别信息,给出X的分类结果。

实际程序中,可以将训练样本集与待测样本的特征提取合并一起,得到总特征向量集合,然后划分出训练样本集和待测样本集,以提高测试时的效率。

实现的动态情感分析界面如图3所示。通过麦克风采集语音,软件可以实时分析每段语音的情感成分,并将统计结果以饼状图进行显示。该界面直观有效,可以激发学生兴趣,进而可以诱导学生去深入理解原理,发现算法问题,从而查阅资料进行改进。

图3 动态情感分析界面

3 结 语

开设与应用接轨、行业同步的实验是提高语音信号处理课程教学质量的关键点。基于嵌入式平台的实时语音信号处理实验平台可以借助嵌入式Linux高级声音框架(ALSA),实现实时语音信号分析、增强、特征提取等单元实验,以及一些功能性扩展实验。同时,本文以情感识别算法为例,介绍了其需要的软硬件环境以及实时实现方法。本文所提出的方法与当前智能语音产品常用研发环境一致,有利于学生在掌握理论知识的同时提高研发能力和工程能力。

猜你喜欢
信号处理嵌入式语音
Focal&Naim同框发布1000系列嵌入式扬声器及全新Uniti Atmos流媒体一体机
魔力语音
基于MATLAB的语音信号处理
基于MQ3与MP3的价廉物美的酒驾语音提醒器
TS系列红外传感器在嵌入式控制系统中的应用
对方正在输入……
《信号处理》征稿简则
《信号处理》第九届编委会
《信号处理》征稿简则
《信号处理》第九届编委会