Kinect for Windows SDK v2.0 开发笔记 (七)语音识别(上)

本文介绍了使用Kinect for Windows SDK v2.0进行语音识别的开发,包括所需的SDK、运行时库和语言包。讨论了语音识别的重要性,并指出在VS Express中需要额外下载WDK7.1来获取ATL支持。文章提到,由于SDK的限制,需要自定义Stream类来处理音频流,并讲解了如何创建SRGS语法文件来定义可识别的语音命令。作者分享了一个简单的汉语语音识别例子,为后续的C++代码实现打下基础。
摘要由CSDN通过智能技术生成

(转载请注明出处)

使用SDK: Kinect for Windows SDK v2.0 public preview

这次探讨语音识别。之前都是一节写两部分,这次反过来了,分为上下两部分。


语音识别算是使用官方SDK的一个理由吧,不然都用OpenNI了,毕竟微软在SR(语音识别)上的成果还是不错的。

首先,您需要下载语音识别的SDK运行时库以及您想支持的运行时语言,运行时语言里面SR代表语音识别,

TTS代表文本转语音,根据您的选择吧。本人选择下载了美国英语与大陆汉语。当然,坑爹的微软还专门为Kinect

准备Kinect运行时语言,支持语言较少,不过连日语都支持,竟然不支持汉语

或许仅仅是日语发音简单吧。


如果您和本人一样使用的是VS Express,那么请再下载WDK7.1,这个语音库需要一点点ATL支

持(貌似就COM智能指针),坑爹的微软在Express里面没有ATL库,为了获取合法ATL库需要下载这个

WDK7.1,里面有能合法使用的ALT库。我直接安装到C盘,请在项目里面包含这三个库的目录


语音平台、WDK、Kinect


有您自己的需要请自行包含其他库,最好将语音平台放到第一位。

目前语音识别应该只能识别PCM编码,处理后的数据是浮点编码,我们不能直接使用SDK默认提供的IStream。

是的,基于COM组件的通用性,我们只需继承IStream实现一个Stream类即可完成音频流的处理。

这个类主要实现Read方法即可,Seek方法在SR中也算比较重要不过Kinect还不支持,这个方法直接返回S_OK即可


实现这个类有两种办法,一种是基于前一节说的音频帧。自己用一个比较大的缓冲区(最好设计上是循环的),

获取音频帧再将数据写在里面,Read时将数据写入即可,比较麻烦。还有一个就是SDK提供例子里面使用的:

傀儡战术。

获取SDK提供的默认的IStream,Read的时候Read这个傀儡即可,数据获取完毕后进行转换即可,代码如下:

// IStream Read方法的实现
STDMETHODIMP KinectAudioStreamWrapper::Read(void *pBuffer, ULONG cbBuffer, ULONG *pcbRead){
    // 参数检查
    if (!pBuffer || !pcbRead) return E_INVALIDARG;
    // 在读取前未使用 m_SpeechActive 返回S_OK
    if (!m_SpeechActive){
        *pcbRead = cbBuffer;
        return S_OK;
    }
    HRESULT hr = S_OK;
    // 目标是将浮点编码转换成16位PCM编码
    INT16* const p16Buffer = reinterpret_cast<INT16*>(pBuffer);
    // 长度倍数
    const int multiple = sizeof(float) / sizeof(INT16);
    // 检查缓冲区释放足够
    auto float_buffer_size = cbBuffer / multiple;
    if (float_buffer_size &g
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值