需要简单的语音识别功能,大部分语音平台都是收费的,并且依赖网络,简单的识别有语音识别芯片LD3320,测试了一下效果不是很好,测试一下微软自带的SDK。
先下载了5.1版本,用QT,修改了好多,编译过了,链接失败。5.1版本只有32位的,没有64位的。直接放弃。更换11。跟换11的X64版本后,11版本的库对QT友好多了,可以直接编译过,链接成功。
找到网上的例子,在QT里面修改一下,CoCreateInstance执行失败,搞了好久才明白还要装一个SpeechPlatformRuntime.msi。装上runtime后,CoCreateInstance执行好了。但是还不能发声,pSpVoice->Speak返回错误,网上查了一堆都是没用的。后来想到在5.1上下了语音包但是不知道怎么用,11上会不会也有类似的语音包。官网还真有。下载安装。终于可以发声了。环境应该配置好了。后面可以搞识别了。
安装步骤:
1 安装speech sdk https://www.microsoft.com/en-us/download/details.aspx?id=27226
2 安装runtime 在speech sdk安装目录下面Microsoft SDKs\Speech\v11.0\Redist\SpeechPlatformRuntime.msi
代码:
头文件定义两个变量(由于speech sdk和opencv有的宏冲突,头文件类型用void替换原类型)
void * pSpVoice;
void *pSpToken;
初始化:
::CoInitialize(NULL);//初始化语音环境
if (FAILED(CoCreateInstance(CLSID_SpVoice, NULL,CLSCTX_INPROC_SERVER, IID_ISpVoice, (void **)&pSpVoice)))
{
qDebug() << "Failed to create instance of ISpVoice!";
qDebug() << GetLastError();
return;
}
LPWSTR ppszCoMemTokenId;
IEnumSpObjectTokens *pSpEnumTokens = NULL;
if (SUCCEEDED(SpEnumTokens(SPCAT_VOICES, NULL, NULL, &pSpEnumTokens)))
{
// 依次获取每个token并朗读字符串
while (SUCCEEDED(pSpEnumTokens->Next(1, (ISpObjectToken**)&pSpToken, NULL)) && ((ISpObjectToken*)pSpToken) != NULL)
{
HRESULT ret = 0;
ret = ((ISpObjectToken*)pSpToken)->GetId(&ppszCoMemTokenId);
if(ret != S_OK)
{
qDebug() << "GetId" << ret;
}
((ISpVoice*)pSpVoice)->SetVoice((ISpObjectToken*)pSpToken);
break;
}
}
析构函数
((ISpVoice*)pSpVoice)->Release(); //释放语音变量
((ISpObjectToken*)pSpToken)->Release(); // 释放token
发声
ret = ((ISpVoice*)pSpVoice)->SetVolume(100);
ret = ((ISpVoice*)pSpVoice)->Speak(L"hello,今天的天气真好", SPF_ASYNC, NULL);//执行语音变量的Speek函数,这个函数用来读文字。
注意设置语音时,如果设置了英文就不能读汉子了。尽量只装中文的。如果装了的话可以在注册表里删掉或时判断一下你想用的。
另外包含头文件时需要加
#undef UNICODE
#include <sphelper.h>
#define UNICODE
来源:https://blog.csdn.net/yangshuanzhu/article/details/102776607