SAPI: приложение не говорит

Пожалуйста, посмотрите на следующий код

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 = appSOURCES += 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"

Пожалуйста помоги!

1

Решение

Вы вызываете Release для объекта pVoice до того, как речь успеет закончиться. В API есть функция waitUntilDone, которая, вероятно, понадобится перед освобождением объекта.

0

Другие решения

Попробуйте с SPF_ASYNC вместо 0 во время вызова pVoice->Speak(L"Hello world", 0, NULL),
Вот как я это делаю:

[...]

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;
}

[...]

Партия токенов на самом деле не нужна, но может быть полезна, если вы хотите настроить голос (для оптимального результата на вашем компьютере должно быть установлено несколько голосов).

0

Эта проблема — ошибка драйвера или конфликт приложений. Мой ноутбук Dell Inspiron 4030, и именно здесь возникает эта проблема. Работает на моем настольном ПК.

0
По вопросам рекламы [email protected]