APP下载

Unity3D中的Kinect声源定位与人机交互技术

2017-02-22王洪源陈慕羿

沈阳理工大学学报 2017年1期
关键词:麦克风声源调用

杨 竹,王洪源,陈慕羿

Unity3D中的Kinect声源定位与人机交互技术

杨 竹,王洪源,陈慕羿

(沈阳理工大学 信息科学与工程学院,沈阳 110159)

Kinect是与Xbox360游戏机配套使用的一款外设,内置四元线性非对称麦克风阵列,可以根据各麦克风接收到声音信号的时延差,计算出声源方位与角度。Unity3D是一个可以创建三维视频游戏、建筑可视化、实时三维动画等类型互动内容的综合型游戏引擎,其本身缺少高级人机声音交互功能。为此,研究开发了基于Kinect的Unity3D人机声音交互接口。采用C++/C#混合编程技术,将Kinect API for Windows中关于声音的相关功能封装为非托管的C++动态链接库(DLL),利用该DLL把Unity3D引擎、Kinect体感设备和Visual Studio平台衔接起来;在Unity3D平台上对由Kinect获取到的声源位置进行识别定位,得到的实时数据可用于高级人机交互应用。

Unity3D;Kinect;声源定位;线性麦克风阵列;人机交互技术

作为微软公司的总裁,比尔盖茨于2008年首次给出了“自然用户界面(Natural User Interface)”的概念,并且对人机交互技术的未来进行了预言:在用户界面上,更为自然的触摸、语音、肢体语言等交互形式将逐步淘汰以键盘、鼠标为主的输入手段[1]。而就在同一时段,有人又提出了“有机用户界面(Organic User Interface)”的创新理念,界面拥有最新的生物识别、皮肤显示传感器,甚至植入了大脑与机器的无缝连接,这些技术都将大幅改变人们的互动理念和生活方式。随着互联网技术和传感器技术的普遍应用,“数据化”的特性将逐渐在现实生活中显现,而人机自然交互技术为人们搭建了现实世界与虚拟环境的桥梁[1]。

Unity3D是由Unity Technologies开发的一款创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台、综合型游戏开发工具,是一个全面整合的专业游戏引擎,其人机交互一般是通过鼠标、键盘实现,引擎本身不具备声音识别、定位、控制等高级人机交互功能。

Kinect 是微软公司基于 XBOX 360 和 Wind-ows PC 机的视频游戏控制台开发的一款运动传感输入设备,是目前世界上唯一一款较为成熟的商业人体动作感知设备,目前大量应用在体感游戏上。由于微软对Kinect 的开发环境设置是开源的,因此开发者可以开发基于Kinect 的各种应用。正是它的人机交互式方式以及开放式的开发环境,使得 Kinect 很快在全球得到广泛应用。如今在医疗、教育、军事和三维人体建模等领域都得到了许多富有创意的新运用[2]。Kinect内置四元线性非对称麦克风阵列,传感器内含数字信号处理器(DSP),能收集所在环境中的各种声音信息,算法分析搜集到的信息后判断声音的来源方位,根据各麦克风接收到声音信号的时延差,计算出声源方位与角度,提供给应用程序使用。定位精度高,空间算法简便,在声源定位中得到越来越多的应用[3]。

目前大多数的工作关注于其交互技术本身的研究,而缺乏对人类自身听觉特点的利用和如何利用声音来表征信息的挖掘。随着人们需求的不断改变以及Kinect技术的不断完善,Kinect在各个领域的应用都会向前迈出一大步,并且在人机交互领域将会得到更为广泛的应用[4]。选题旨在扩展Kinect体感设备的应用领域,充分利用Unity3D绘制引擎的特性,创建人机交互领域的大范围应用契机。在自然人机交互需求不断提升的今天,体感技术已经是各领域科研小组所研究的热点,将这种技术结合其它开发平台的应用正在步入日常生活,未来也可以进入教育、军事、医学等相关领域。

基于Kinect的Unity3D声音人机交互技术的开发是以一种“面向过程”的方式进行,使用“非托管的C++动态链接库”封装方式,当Unity3D开发需要调用DLL时,只要用C#脚本编程声明并调用需要的接口函数,就能实现Kinect和Unity3D之间传递数据的功能。

1 Kinect音频系统与DMO技术

麦克风阵列声源定位与跟踪指的是利用麦克风阵列完成对声音信号的采集,通过处理和分析捕获的多声道声音信号,在空间中定位出一个或者多个声源的平面坐标或空间坐标,由此得到声源所在位置,进而实现对声源目标的跟踪。由于麦克风阵列由一组按一定几何结构摆放的麦克风组成,因此能够同时处理来自空间不同方向的声音信号,从而大大提高了声源定位的准确度。在现阶段,基于麦克风阵列的声源定位与跟踪系统依然是众多声源定位方法中发展较成熟、应用较广泛的一种[5]。图1为均匀直线麦克风阵列模型。

图1 均匀直线麦克风模型

1.1 Kinect音频系统概况

Kinect 是一个底端有四个麦克风组成的直线型麦克风阵列的传感器,该阵列可用来为更上层API提供关于透过音波形式辨识声音来源、回音消除、自动增益等功能,并且能与Windows 语音识别 API 整合,更能进行声源定位和环境噪声抑制。如图 2 所示,它的四个麦克风非均匀排列在 Kinect 的两侧,通道 1 的麦克风在左侧,距离中心 11.3cm,另外三个麦克风在右侧,距离中心分别为 3.6cm、7.6cm 和 11.3cm。四个麦克风离原点的高度均为 2cm[5]。

图2 Kinect的麦克风阵列

Kinect的声音采样(sampling)频率为16000(16kHz,每秒采样16000次),采样位数为16位(2B,也就是把采样声音区分成65536种等级)。由于四个麦克风位置不同,故对某发音源所接收到的音量强弱,Kinect可分析出仅限水平方向的声音来源。本系统主要利用Kinect具有的麦克风输入和语音辨识功能,通过其四元麦克风阵列来捕捉多声道立体声,再通过数字信号处理(DSP)等组件,根据收到的声音时延判断声源所在方向。

1.2 DMO技术

DirectX是Microsoft公司为游戏和其他高性能多媒体应用所提供的一套底层图形应用编程接口(API)。这些接口包括对二维和三维图形,声效和音乐,输入设备以及多玩家网络游戏等的支持。安装了它,系统中软件会比较直接的利用硬件加速资源[6]。DirectX Media Objects(DMO):是微软提供的一种流数据处理COM组件。它是从DirectSh-ow中分离出来的,作为另一种高效率的流数据处理解决方案。它提供包括对视频和音频等数据流对象的读写支持,以及编解码实现。

DirectX的功能都是以COM组件的形式提供的,而DirectShow是一套完全基于COM的应用系统。COM组件是建立在二进制规范上的对象,它常常被作为动态链接库(DLL)。

2 KinectCommonBridge相关介绍及DLL相关技术与调试方法

2.1 KinectCommonBridge简介

KinectCommonBridge是Kinect for Windows SDK的一个补充,它在创意开发库和工具包方面易于集成Kinect方案。在与openFrameworks和Cinder类成员工作时,很明显,它们需要类似于托管API但是基于C++的东西。它们所使用的图形库完全是用本机C++写的。至于功能,它们想要这种轻量级的一些东西来尽可能轻量地继续扩展它们的库。如果用户不熟悉这些库或任何类型的游戏开发模型,它们并没有一种典型的应用设计模式。它们需要尽量快速地运行模拟、更新对象的位置,然后要么尽量的快要么锁定与刷新显示同步地呈现在屏幕上。它可以以典型的每秒60帧速度运行,和CPU/GPU处理速度一样高。

KinectCommonBridge的目的是:允许任何能够加载DLL的任何框架直接访问数据。Kinect-CommonBridge还有支持传感器的额外的更高级功能,如人脸跟踪和语音识别。若要使用语音识别,用户需要在工程的C++预处理器属性中添加如下预处理器定义:

KCB_ENABLE_SPEECH;

当用Kinect for Windows SDK和Kinect设备工作时的常见任务是:

(1)选择一个传感器;

(2)从中获取颜色/红外、深度和骨骼数据[7]。

2.2 动态链接库(DLL)的创建及函数导出

DLL是一个包含可由多个程序同时使用的代码和数据库,它不能直接运行,也不能接收消息,但可以被其他执行文件和其他DLL文件动态调用。通过使用DLL,程序可以实现模块化,使其成为相对独立的组件模块。此外,改写DLL以更新应用并不会影响该程序的其他部分。

应用程序在链接DLL中的函数信息之前,需要从DLL文件中导出函数。导出DLL中的函数的方法有两种:一是在定义函数时使用导出函数关键字“_declspec(dllexport)”;二是使用模块定义文件(.def)。本文使用方法一。

(1)头文件(KinectCommonBridgeLib.h)

DLL中函数的声明一般在头文件中进行。其头文件(KinectCommonBridgeLib.h)的定义及函数导出如下:

KinectCommonBridgeLib.h:

#ifdef _WIN32

#ifdef DLL_EXPORTS

#define KINECT_CB __declspec(dllexport)#else

#define KINECT_CB __declspec(dllimport)#pragma comment(lib,“KinectCommonBridge.

lib”)

#endif

#endif

(2)函数的实现文件(KinectCommonBridge-Lib.cpp)

在文件的首部添加代码:#include“KinectCo-mmonBridgeLib.h”。借助#include语句把.h文件与相应.cpp文件联系起来,然后通过编译器对工程文件进行编译、链接等过程,最终在工程的Debug文件夹下生成DLL文件(KinectCommonBridge.dll)。图3是在Visual Studio平台上用C++编译生成KinectCommonBridge.dll的操作界面。

图3 生成KinectCommonBridge.dll的操作界面

关键字_declspec(dllimport)指出用户程序需要的函数在DLL中要导入的信息,而_declspec(dllexport)指出DLL中要导出的信息。

2.3 动态链接库(DLL)的引入与调用

从MSDN了解到,DllImport是用来将特性化方法由非托管动态链接库(DLL)作为静态入口点公开。使用DllImport将C++类通过DLL引入到C#的方法是:

(1)创建编译文件,生成C++类的DLL;

(2)调用这个DLL,将其放置到C#工程目录下;

(3)向C#工程中添加新类,在生成的cs文件中添加代码。

如图4中,将C++创建的DLL放置到Unity项目中的工程目录下。

图4 Unity3D项目中Plugins文件夹下的DLL

例如在Unity项目中的C#脚本中使用DllImport导入KinectCommonBridge函数。如下:

[DllImportAttribute(“KinectCommonBridge”,EntryPoint=“SetDebugFunction”,CallingConvention=CallingConvention.StdCall)]public static extern void SetDebugFunction(IntPtr fp);

之后可以在C++插件中的任何地方调用这个函数。如在KinectCommonBridgeLib.cpp中:

MyUnityDebug(“Create COM failed.”);

MyUnityDebug(“The COM library is already initiali-zed on this thread.”)。

3 Unity3D与Kinect联调及结果

本文使用一个将调试文本从C++插件重定向到Unity控制台的方法。该方法是基于C#中的委托,委托可以被视为在C++中的一个函数指针的类型,可以从非托管代码中调用。在C#中编写函数,它接受一个字符串作为它的参数,并将其打印到Unity控制台窗口,然后将这个函数的指针传递给C++类的DLL,所以,可以通过它的指针从C++调用该函数,这会将字符串从C++重定向到日志窗口。

首先定义一个像这样的委托:

using System.Runtime.InteropServices;

[UnmanagedFunctionPointer(CallingConvention.Cdecl)]

public delegate void MyDelegate(string str);

这是一个函数类型的委托,函数有一个字符串参数,没有返回值。然后编写一个方法,可以从C++中调用它来打印日志字符串,这是一个Unity脚本文件的成员函数。

static void CallBackFunction(string str)

{

Debug.Log(“::CallBaaaaaaack:”+str);

}

在Unity脚本的Start()函数中实例化这个被定义的委托:

MyDelegate callback_delegate=new

MyDelegate(CallBackFunction);

IntPtr intptr_delegate=

Marshal.GetFunctionPointerForDelegate(callback_delegate);

AudioWrapper.SetDebugFunction(intptr_delegate);

SetDebugFunction是一个方法,它把函数指针赋给另一个指针,该指针在C++代码中定义。如下:

typedef void(*FuncPtr)(const char *);

FuncPtr MyUnityDebug;

接着,可以访问其他源代码中的这个指针。如下:

KINECT_CB void APIENTRY

SetDebugFunction(FuncPtr fp)

{

MyUnityDebug=fp;

}

最后在C#代码中使用Dllimport导入它。如上节所述,可在C++中调用该函数。图5为用C# 脚本编程声明并调用上面DLL封装的函数时,Unity3D控制台的运行界面部分打印信息。

图5 Unity3D控制台声明调用DLL的打印信息

现在,运行Unity3D引擎,在不同的位置说话,可以看到实时获取的声源位置数据流。图6为显示在Unity3D系统中获取声源方位的交互界面画面,图7为实时声源位置数据在调试窗口中的显示。

图6 获取声源方位在Unity3D中的交互界面

图7 Unity3D调试窗口中显示的实时数据

表1为系统运行后随机截取的实验数据。

表1 随机截取实验数据

表中:beamAngle是方向性麦克风(麦克风阵列)对准声音来源的角度;sourceAngle是经过数学算法处理后,系统最终判定声音来源的角度;sourceConfidence属性值用来作为判定声音强弱或声音距离远近的依据。Kinect能辨识的水平声音来源为以传感器为中心的±50°(共100°)。故系统显示出的位置读数皆是以传感器中心位置为0的相对位置读数。

4 结束语

测试表明,本研究利用Kinect传感器的四元线性麦克风阵列捕获用户声音信号,并进行实时定位。采用Kinect设备与Unity3D引擎结合开发的相关资源包的工作方式,通过在VS平台上封装C++类的DLL,并在Unity项目上调用,将Kinect和Unity3D衔接起来,使其在Unity控制台显示实时的定位数据输出,该数据流可供程序使用,弥补了Unity3D引擎缺乏人机声音交互技术的不足,具有较大推广价值。

[1]刘兴亮.互联网的未来:声音时代和体感时代[J].中国传媒科技,2014(9):14-15.

[2]韩雪,李泽滔,孙昊.基于Kinect传感器的移动机器人声源目标跟踪系统[J].自动化与仪器仪表,2015(6):185-186.

[3]王森.Kinect体感程序设计入门:使用C#和C++[M].北京:科学出版社,2014.

[4]石曼银.Kinect技术与工作原理的研究[J].哈尔滨师范大学自然科学学报,2013,29(3):83-86.

[5]崔斌,陈亮,胡红梅,等.基于Kinect的声源定位时延获取及算法性能研究[J].信息技术,2014(10):103-107.

[6]Dunlop R,Shepherd D,Martin M.Direct X 7速成教程[M].北京:机械工业出版社,2002.

[7]Clark R,Pua Y H,Fortin K,et al.Validity of the Microsoft Kinect for Assessment of Postural Control[J].Gait & Posture,2012,36(3):372-377.

(责任编辑:马金发)

Sound Source Localization and Human-computer Interaction Techniques Based on Kinect in Unity3D

YANG Zhu,WANG Hongyuan,CHEN Muyi

(Shenyang Ligong University,Shenyang 110159,China)

Kinect is a peripheral device for Xbox360 game console,which contains four non-symmetric linear microphone array.According to the microphones to receive sound signals delay inequality,the sound source position and angle are calculated.Unity3D is an integrated game engine to create a three-dimension video games,architectural visualization,real-time 3-dimension animations and other types of interactive contents.It lacks of advanced man-machine voice interactive feature.Therefore,the research develops a human-machine sound interaction interface of Unity3D based on Kinect.C++/C# mixed programming technology is adopted to encapsulate the functionality associated with Kinect for unmanaged C++dynamic link library(DLL),and then Unity3D engine,Kinect device and VS platform are concatenated with the DLL.Finally,position of sound source is identified and located for Kinect on Unity3D platform,which gets the real time data to be used for advanced human-computer interaction.

Unity3D;Kinect;the sound source localization;linear microphone array;Human-Computer Interaction Techniques

2016-05-18

辽宁省教育厅一般项目(L2013083)

杨竹(1991—),女,硕士研究生;通讯作者:王洪源(1963—),男,教授,研究方向:模拟仿真训练系统、区域数据链路体系结构。

1003-1251(2017)01-0085-06

TP391

A

猜你喜欢

麦克风声源调用
GRAS发布新12Bx系列、支持TEDS的测量麦克风电源模块
虚拟声源定位的等效源近场声全息算法
核电项目物项调用管理的应用研究
Binaural Rendering based on Linear Differential Microphone Array and Ambisonic Reproduction
基于GCC-nearest时延估计的室内声源定位
LabWindows/CVI下基于ActiveX技术的Excel调用
麦克风的艺术
基于系统调用的恶意软件检测技术研究
运用内积相关性结合迭代相减识别两点声源
麦克风