(转载请注明出处)
使用SDK: Kinect for Windows SDK v2.0 public preview
紧接上节,这次要怎么初始化Kinect呢,很简单:
// 初始化Kinect
HRESULT ThisApp::init_kinect(){
IAudioSource* pAudioSource = nullptr;
IAudioBeamList* pAudioBeamList = nullptr;
// 查找当前默认Kinect
HRESULT hr = ::GetDefaultKinectSensor(&m_pKinect);
// 绅士地打开Kinect
if (SUCCEEDED(hr)){
hr = m_pKinect->Open();
}
// 获取音频源
if (SUCCEEDED(hr)){
hr = m_pKinect->get_AudioSource(&pAudioSource);
}
// 获取音频链表
if (SUCCEEDED(hr)){
hr = pAudioSource->get_AudioBeams(&pAudioBeamList);
}
// 获取音频
if (SUCCEEDED(hr)){
hr = pAudioBeamList->OpenAudioBeam(0, &m_pAudioBeam);
}
// 获取输入音频流
if (SUCCEEDED(hr)){
IStream* pStream = nullptr;
hr = m_pAudioBeam->OpenInputStream(&pStream);
// 利用傀儡生成包装对象
m_p16BitPCMAudioStream = new KinectAudioStreamWrapper(pStream);
SafeRelease(pStream);
}
SafeRelease(pAudioBeamList);
SafeRelease(pAudioSource);
return hr;
}
剩下就是初始化语音识别引擎,因为非常定式化,建议大家直接复制即可:
// 初始化语音识别
HRESULT ThisApp::init_speech_recognizer(){
HRESULT hr = S_OK;
// 创建语音输入流
if (SUCCEEDED(hr)){
hr = CoCreateInstance(CLSID_SpStream, nullptr, CLSCTX_INPROC_SERVER, __uuidof(ISpStream), (void**)&m_pSpeechStream);;
}
// 与我们的Kinect语音输入相连接
if (SUCCEEDED(hr)){
WAVEFORMATEX wft = {
WAVE_FORMAT_PCM, // PCM编码
1, // 单声道
16000, // 采样率为16KHz
32000, // 每分钟数据流 = 采样率 * 对齐
2, // 对齐 : 单声道 * 样本深度 = 2byte
16, // 样本深度 16BIT
0 // 额外数据
};
// 设置状态
hr = m_pSpeechStream->SetBaseStream(m_p16BitPCMAudioStream, SPDFID_WaveFormatEx, &wft);
}
// 创建语音识别对象
if (SUCCEEDED(hr)){
ISpObjectToken *pEngineToken = nullptr;
// 创建语言识别器
hr = CoCreateInstance(CLSID_SpInprocRecognizer, nullptr, CLSCTX_INPROC_SERVER, __uuidof(ISpRecognizer), (void**)&m_pSpeechRecognizer);
if (SUCCEEDED(hr)) {
// 连接我们创建的语音输入流对象
m_pSpeechRecognizer->SetInput(m_pSpeechStream, TRUE);
// 创建待识别语言 这里选择大陆汉语(zh-cn)
// 目前没有Kinect的汉语语音识别包 有的话可以设置"language=804;Kinect=Ture"
hr = SpFindBestToken(SPCAT_RECOGNIZERS, L"Language=804", nullptr, &pEngineToken);
if (SUCCEEDED(hr)) {
// 设置待识别语言
m_pSpeechRecognizer->SetRecognizer(pEngineToken);
// 创建语音识别上下文
hr = m_pSpeechRecognizer->CreateRecoContext(&m_pSpeechContext);