首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SAPI:申请不是在说

SAPI:申请不是在说
EN

Stack Overflow用户
提问于 2013-05-03 14:51:02
回答 3查看 1.2K关注 0票数 1

请看下面的代码

main.cpp

代码语言:javascript
复制
    #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“消息。但是没有声音出来!它应该说“你好世界”!为什么会这样呢?

下面是QT .pro设置,以防需要

下面是QT .pro设置

代码语言:javascript
复制
#-------------------------------------------------
#
# 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"
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-10 06:27:09

此问题是驱动程序错误或应用程序冲突。我的笔记本电脑是戴尔inspiron 4030,也是这个问题发生的地方。工作在我的桌面电脑。

票数 0
EN

Stack Overflow用户

发布于 2013-05-07 08:09:51

在调用SPF_ASYNC时尝试使用pVoice->Speak(L"Hello world", 0, NULL)而不是0。

我就是这样做的:

代码语言:javascript
复制
[...]   

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

[...]

令牌部分并不是真正必要的,但是如果您想要自定义声音(为了获得最佳的结果,必须在计算机上安装几个声音),它可能很有用。

票数 1
EN

Stack Overflow用户

发布于 2013-05-03 14:55:57

在演讲结束之前,您正在调用pVoice对象的发布。API有一个waitUntilDone函数,在释放对象之前可能需要这个函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16361781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档