基于Tcl/Tk与C的语音信号盲分离测试工具
马骏
西安市地下铁道有限责任公司 西安 710018
摘要:如何分离多说话人环境下麦克风所采集的混合语音信号是盲源分离研究的一个重要课题。文章采用TCL/TK与C语言混合编程,自主开发了用于语音信号盲分离测试的工具,并介绍了该工具的结构、界面和功能。最后通过试验验证了该工具的正确性。
关键词:盲源分离 语音信号 Tcl/Tk
A Tcl/Tk & C-based testing tool for blind separation of
audio signals
Ma Jun
Xi'an Metro Co., Ltd. Xi'an 710018
Abstract: Separating independent signal from audio mixtures is one of the elementary problems in Blind Source Separation (BSS) research. The interface between Tcl/Tk is explained, and a testing tool for blind separation of audio signals is developed. The structure, interface and function of the tool are introduced. The validity of the tool is proved by experiment.
Keywords:Blind source separation Audio signals Tcl/Tk
1.引言
盲源分离(BSS)[1,2,3,4]是人工神经网络与统计信号处理以及信息论相结合的产物,而混合语音信号的盲分离是该领域的一个重要课题。使计算机具有和人类一样的听觉,是计算机智能领域研究者们的梦想。语音识别技术为我们实现计算机听觉的这一目标提供了有效的途径,使得计算机能听懂我们人类的语言,计算机操作从此变得更互动和简单自然,方便了人机的交流。混合语音信号盲分离虽然不能实现计算机听觉这一目标,但是通过该技术却能使原本相互混叠的语音信号相互剥离,来作为语音识别的预处理,从而使得噪声环境下和多说话人情形下的语音识别的实现成为可能,增大了识别算法的鲁棒性和适应能力,从这种意义上来讲该问题的研究具有很大的现实意义。
本文首先阐述了盲源分离的基本理论知识以及Tcl/Tk[5]与C语言的接口编程,然后采用分层软件模型开发了用于语音信号盲分离的测试工具,其外壳选择灵活的事件驱动脚本Tcl/Tk作为基本的界面开发平台,完成配置、控制任务;而其低层的BSS核心算法库则利用高效的编译型C语言实现。另外为了完成语音信号的读写等操作还参考了snack[6]语音处理库及其源代码。文章介绍了该工具的结构、界面和功能,最后通过实验验证了该测试工具的正确性。
2.盲源分离模型及算法
设由N个未知的统计独立的信号源
构成了一个列向量
其中t是离散采样时刻。设A是一个未知的
维矩阵,通常称为混合矩阵。设
是由M个传感器观测到混合信号
构成的列向量,且满足下列方程:
(1)
其中
是由M个空间白化、统计独立噪声信号
构成的列向量。盲源分
离的命题是,对任何t,根据观测到的
,在A未知的条件下求
。
图1给出了语音信号盲分离算法框架图。
图1算法框图
由图1知,求解BSS的思路是寻找一个
维的解混合阵W,
经过W变换后得到N维输出列向量
,即有:
(2)
显然,如果通过学习得以实现
(其中
为置换矩阵,
为对角矩阵),则输出信号与源信号的波形便能保持一致。业已
证明
住所证明下载场所使用证明下载诊断证明下载住所证明下载爱问住所证明下载爱问
,BSS实现正确的分离的结果只能表现在Y(t)的各个分量统计独立上。按以上基本思路,目前国际上已经提出了多种有效算法,其最终目标都是估计分离矩阵W。表1给出了工具包中已经实现的一些算法。
3.基于Tcl/Tk与C语言进行混合编程[5]
Tcl是一种功能强大的可嵌入式解释型语言,其最初设计目的就是提供一种可扩充的语言与用户的应用程序协同工作。Tk是Tcl的一种扩充,由一组简化构造窗口应用程序的C语言库过程组成,通过提供按钮、菜单等控件(Widget)增加了图形窗口界面。
Tcl/Tk采用层次结构对其已有的各控件进行管理。另外,Tcl/Tk提供了访问用户应用程序的接口,使得用户界面处理与应用程序的其余部分完全分离,提高了可移植性。用户可以集中精力设计自己的应用程序的核心部分,编译成可执行程序后供Tcl/Tk设计的脚本调用。Tcl/Tk被设计成可以通过用C语言编写新的命令来进行方便的扩展。Tcl/Tk的解释器本身是以C的库函数方式提供的,它可以嵌入任何用C写的程序;C应用程序可以启动一个命令解释器,并由它来解释执行任何一个Tcl脚本。同时,也可以将任何一个C过程变为Tcl的一个新命令,也就是说,可以从Tcl中调用任何C过程,一方面是因为C实现比Tcl/Tk的效率要高,另一方面是因为有些应用无法用Tcl/Tk实现。
Tcl/Tk库程序提供一个Tcl_Main函数由应用程序调用。Tcl_Main创建一个Tcl解释器及所有标准Tcl命令,然后调用Tcl_AppInit函数(该函数由用户定义,其中可以注册新的Tcl命令),最后读入一段程序并进入交互式循环。类似地,Tk_Main也具有同样地调用过程。由于Tk_Main包含了Tcl_Main,若用户使用到了Tk的命令,则只需调用Tk_Main。
4.语音信号盲分离测试工具(WAVBSS)
基于上述BSS模型及相应算法框架,兼顾Tcl/Tk在界面编程中的长处和用C语言来处理BSS算法涉及到的大量的矩阵运算的高效性,本文的工具采用 C 与 tcl/tk 共同开发。该工具具有界面简洁友好,使用方便,跨平台等特点,能完成对线性混合语音信号的盲分离。
4.1 WAVBSS的结构和功能
图2所示为WAVBSS的软件结构图。其主要包括如下几个功能模块:信号的加载与编辑模块;信号的混合及加噪模块;信号预处理模块;BSS算法模块;数据/曲线模块等。
图2 WAVBSS的软件结构图
信号的加载模块主要是基于snack库实现语音文件(*.wav)读、写等操作。另外,通过信号编辑模块用户可以对已加载的信号随意的进行删除或添加。
一旦源信号被加载,WAVBSS将可以通过多种方式人为的生成混合信号。若加载的信号已经是经过混合后的信号,则可以选择不再进行混合。WAVBSS包含了5种不同的混合方式。其中,对于任意一种矩阵混合方式用户都可以在软件包中进行任意的修改。另外为了考察特定算法对加性噪声的鲁棒性,WAVBSS允许用户在进行信号BSS之前人为加入一定强度的噪声。软件包提供信噪比分别为0dB,5dB,10db,15dB,20dB五个等级的两种噪声,即高斯白噪声和均匀噪声供用户选择。
通常在对混合信号进行分离之前,需先对其进行一些预处理[3],为此工具提供了信号预处理模块。目前该工具包含的预处理方法有信号中心化、白化、PCA处理。
BSS算法模块作为WAVBSS的核心部分,目前提供了4种不同的性能优异的BSS算法,其中包括FASTICA算法、自然梯度算法、EASI算法和Adaptive RLS算法等优秀的算法,用户可以从中选取一种对已获得的语音数据进行BSS测试。
曲线/数据模块是测试工具的一个重要部分,语音数据处理结果可以语音数据文件(.wav)的格式被输出到硬盘,同时通过观察曲线显示界面,有助于对仿真的结果进行分析。曲线显示包括源信号波形、混合信号波形和分离信号波形的显示等,而且每种视图可以任意的被显示、关闭、重新显示、移动、放大缩小而且互不影响。
以上各个功能模块的组织、协调皆围绕其核心模块——BSS算法模块而实现,内部采用函数式封装结构,具有可扩展的优点。
4.2 WAVBSS的图形界面的Tcl/tk设计与移植
按照如上所述的模块化结构,设计WAVBSS的界面主窗口如图3所示,其显示了工具的框架结构、工具的操作流程以及系统的运行状态,主要包括菜单栏与语音信号盲分离的分步骤操作区。其中各分步骤操作区实际上与前述相应功能模块对应,意义直观明了,易于操作。
图3 主界面
WAVBSS在Windows和Linux的安装目录分别为“C:/wavbss”和“/usr/local/bin”。Tcl变量tcl_platform是Tcl的一个内部数组,其元素platform保存了当前的工作平台。用以下Tcl/Tk脚本可以获取WAVBSS当前的工作平台,并保存在变量sysplt中,然后在变量DIRECTORY_WAVBSS_Root中设置WAVBSS的安装目录。
Set sysplt $tcl_platform(platform)
If {$sysplt==”windows”} {
Set DIRECTORY_WAVBSS_Root “c:\\wavbss\\”
} else {
Set DIRECTORY_WAVBSS_Root “/usr/local/bin/”
}
由于Tcl在Windows上运行时,能够自动地将Tcl/Tk脚本中的文件和目录中的字符“/”转换为“\”,故在将WAVBSS的图形界面从Linux移植到Windows时,不必修改其它文件和目录的名称,只需修改sysplt变量,对C编译程序的名称等几处在Linux和Windows存在差别的地方分别作不同的处理即可。
5.实验研究
分别由两人讲“good morning”与“こんばんは”(采样频率为16kHz),利用声卡采集两个人的语音信号作为源信号,波形图如图4(a)所示。通过在界面上选取“随机矩阵混合”将将上图所示的双源信号进行线性混合,最后生成混合信号,如图4(b)所示。
一旦预处理完毕,用户便可以从软件包中的算法列表中选取一种算法开始仿真试验。图4为本文工具运行所获得的结果图。由图可知,分离出来的信号波形与源信号波形一致,另外测试结果可被输出为语音(.wav)文件,通过播放该实验所分离的语音信号,声音清晰可辨,杂音较小,二者皆很好的说明了该测试工具的正确性和有效性。
(a)源信号 (b)混合信号 (c)分离信号
图4 实验信号波形图
6.结束语
本文介绍了笔者开发的用于进行语音信号盲分离的测试工具WAVBSS。实验表明,该工具可以对经过线性混合的语音信号进行盲分离测试,并且由于其图形界面采用Tcl/Tk设计,因而很容易移植到Linux平台,从而为语音信号盲分离进一步的研究提供了试验平台。
参考文献
[1] Ding Liu, Xiaoyan Liu, et al. Blind Source Separation based on dual adaptive control. 4th International Symposium on Independent Component Analysis and Blind Signal Separation, Nara, Japan, 2003: 445-450