请查看以下代码
的main.cpp
#define _ATL_APARTMENT_THREADED
#include <atlbase.h>
//You may derive a class from CComModule and use it if you want to override something,
//but do not change the name of _Module
extern CComModule _Module;
#include <atlcom.h>
#include <sapi.h>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
cout << "Hello" << endl;
ISpVoice * pVoice = NULL;
if (FAILED(::CoInitialize(NULL)))
return FALSE;
HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice);
if( SUCCEEDED( hr ) )
{
cout << "Succeeded" << endl;
hr = pVoice->Speak(L"Hello world", 0, NULL);
pVoice->Release();
pVoice = NULL;
}
else
{
cout << "Not succeeded" << endl;
}
::CoUninitialize();
return TRUE;
}
当我运行此代码时,窗口打开,打印“Hello”消息。但没有声音出来!它应该说“Hello World”!这是为什么?
如果需要,以下是QT .pro设置
以下是QT .pro设置
#-------------------------------------------------
#
# Project created by QtCreator 2013-05-03T14:31:00
#
#-------------------------------------------------
QT += core
QT -= gui
TARGET = Speech
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
SOURCES += main.cpp
INCLUDEPATH += "C:/Program Files/Microsoft Speech SDK 5.1/Bin"
INCLUDEPATH += "C:/Program Files/Microsoft Speech SDK 5.1/Include"
LIBS += "C:/Program Files/Microsoft Speech SDK 5.1/Lib/i386/sapi.lib"
LIBS += "C:/Program Files/Microsoft SDKs/Windows/v7.0A/Lib/User32.lib"
请帮忙!
答案 0 :(得分:0)
在演讲有时间结束之前,您正在调用pVoice对象上的Release。 API有一个waitUntilDone函数,在释放对象之前可能需要它。
答案 1 :(得分:0)
在调用pVoice->Speak(L"Hello world", 0, NULL)
时尝试使用SPF_ASYNC而不是0
我是这样做的:
[...]
HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, reinterpret_cast<void**>(&pVoice));
if( SUCCEEDED( hr ) )
{
const wchar_t* reqAttributs = L"Language=409"; // 409 = en_US; 809 = en_UK; 40C = fr_FR
const wchar_t* optAttributs = L"Gender=Female"; // or L"Gender=Male"
ISpObjectToken* cpTokenEng;
if (FAILED(::SpFindBestToken(SPCAT_VOICES, reqAttributs, optAttributs, &cpTokenEng))) {
throw std::exception("Couldn't find a Token with the required attributs.");
}
pVoice->SetVoice(cpTokenEng);
hr = pVoice->Speak(L"Hello World", SPF_ASYNC, nullptr);
if (hr == S_OK) {
// OK
} else if (hr == E_INVALIDARG) {
// One or more parameters are invalid
} else if (hr == E_POINTER) {
// Invalid pointer
} else if (hr == E_OUTOFMEMORY) {
// Exceeded available memory
} else {
// Unknown error
}
hr = pVoice->WaitUntilDone(INFINITE);
pVoice->Release();
pVoice = nullptr;
}
[...]
令牌部分并不是必需的,但如果您想自定义声音,它可能很有用(您的计算机上必须安装多个声音才能获得最佳效果)。
答案 2 :(得分:0)
此问题是驱动程序错误或应用程序冲突。我的笔记本电脑是戴尔inspiron 4030,它是这个问题发生的地方。适用于我的台式电脑。