需要簡(jiǎn)單的語(yǔ)音識(shí)別功能,大部分語(yǔ)音平臺(tái)都是收費(fèi)的,并且依賴(lài)網(wǎng)絡(luò),簡(jiǎn)單的識(shí)別有語(yǔ)音識(shí)別芯片LD3320,測(cè)試了一下效果不是很好,測(cè)試一下微軟自帶的SDK。
先下載了5.1版本,用QT,修改了好多,編譯過(guò)了,鏈接失敗。5.1版本只有32位的,沒(méi)有64位的。直接放棄。更換11。跟換11的X64版本后,11版本的庫(kù)對(duì)QT友好多了,可以直接編譯過(guò),鏈接成功。
找到網(wǎng)上的例子,在QT里面修改一下,CoCreateInstance執(zhí)行失敗,搞了好久才明白還要裝一個(gè)SpeechPlatformRuntime.msi。裝上runtime后,CoCreateInstance執(zhí)行好了。但是還不能發(fā)聲,pSpVoice->Speak返回錯(cuò)誤,網(wǎng)上查了一堆都是沒(méi)用的。后來(lái)想到在5.1上下了語(yǔ)音包但是不知道怎么用,11上會(huì)不會(huì)也有類(lèi)似的語(yǔ)音包。官網(wǎng)還真有。下載安裝。終于可以發(fā)聲了。環(huán)境應(yīng)該配置好了。后面可以搞識(shí)別了。
安裝步驟:
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
代碼:
頭文件定義兩個(gè)變量(由于speech sdk和opencv有的宏沖突,頭文件類(lèi)型用void替換原類(lèi)型)
void * pSpVoice;
void *pSpToken;
初始化:
::CoInitialize(NULL);//初始化語(yǔ)音環(huán)境
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)))
{
// 依次獲取每個(gè)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;
}
}
析構(gòu)函數(shù)
((ISpVoice*)pSpVoice)->Release(); //釋放語(yǔ)音變量
((ISpObjectToken*)pSpToken)->Release(); // 釋放token
發(fā)聲
ret = ((ISpVoice*)pSpVoice)->SetVolume(100);
ret = ((ISpVoice*)pSpVoice)->Speak(L"hello,今天的天氣真好", SPF_ASYNC, NULL);//執(zhí)行語(yǔ)音變量的Speek函數(shù),這個(gè)函數(shù)用來(lái)讀文字。
注意設(shè)置語(yǔ)音時(shí),如果設(shè)置了英文就不能讀漢子了。盡量只裝中文的。如果裝了的話可以在注冊(cè)表里刪掉或時(shí)判斷一下你想用的。
另外包含頭文件時(shí)需要加
聯(lián)系客服