我是SAPI的新手,如果你们中的任何人能够在SAPI中给我发表文本Hello World示例,我将非常感谢.我知道MS有一些例子,如“听写”等,但我想从一个非常小的开始.很高兴,如果你能提供帮助.
我使用SAPI玩Windows语音识别,它真的不是用户友好的.这是我写的代码示例(在C中):
#include <sphelper.h>
#include <sapi.h>
#include <iostream>
#include <string>

const ULONGLONG grammarId = 0;
const wchar_t* ruleName1 = L"ruleName1";

int start_listening(const std::string& word);
ISpRecoGrammar* init_grammar(ISpRecoContext* recoContext,const std::string& command);
void get_text(ISpRecoContext* reco_context);
void check_result(const HRESULT& result);

int main(int argc,char** argv)
{
    start_listening("Hello");
    return EXIT_SUCCESS;
}

// This function exits when the word passed as parameter is said by the user
int start_listening(const std::string& word)
{
    // Initialize COM library
    if (Failed(::CoInitialize(nullptr))) {
        return EXIT_FAILURE;
    }

    std::cout << "You should start Windows Recognition" << std::endl;
    std::cout << "Just say \""<< word << "\"" << std::endl;

    HRESULT hr;

    ISpRecognizer* recognizer;
    hr = CoCreateInstance(CLSID_SpSharedRecognizer,nullptr,CLSCTX_ALL,IID_ISpRecognizer,reinterpret_cast<void**>(&recognizer));
    check_result(hr);

    ISpRecoContext* recoContext;
    hr = recognizer->CreateRecoContext(&recoContext);
    check_result(hr);

    // disable context
    hr = recoContext->Pause(0);
    check_result(hr);

    ISpRecoGrammar* recoGrammar = init_grammar(recoContext,word);

    hr = recoContext->SetNotifyWin32Event();
    check_result(hr);

    HANDLE handleEvent;
    handleEvent = recoContext->GetNotifyEventHandle();
    if(handleEvent == INVALID_HANDLE_VALUE) {
        check_result(E_FAIL);
    }

    ULONGLONG interest;
    interest = SPFEI(SPEI_RECOGNITION);
    hr = recoContext->SetInterest(interest,interest);
    check_result(hr);

    // Activate Grammar
    hr = recoGrammar->SetRuleState(ruleName1,SPRS_ACTIVE);
    check_result(hr);

    // Enable context
    hr = recoContext->Resume(0);
    check_result(hr);

    // Wait for reco
    HANDLE handles[1];
    handles[0] = handleEvent;
    WaitForMultipleObjects(1,handles,FALSE,INFINITE);
    get_text(recoContext);

    std::cout << "Hello user" << std::endl;

    recoGrammar->Release();
    ::CoUninitialize();

    system("PAUSE");
    return EXIT_SUCCESS;
}

/**
* Create and initialize the Grammar.
* Create a rule for the grammar.
* Add word to the grammar.
*/
ISpRecoGrammar* init_grammar(ISpRecoContext* recoContext,const std::string& command)
{
    HRESULT hr;
    SPSTATEHANDLE sate;

    ISpRecoGrammar* recoGrammar;
    hr = recoContext->CreateGrammar(grammarId,&recoGrammar);
    check_result(hr);

    WORD langId = MAKELANGID(LANG_french,SUBLANG_french);
    hr = recoGrammar->ResetGrammar(langId);
    check_result(hr);
    // Todo: Catch error and use default langId => GetUserDefaultUILanguage()

    // Create rules
    hr = recoGrammar->GetRule(ruleName1,SPRAF_TopLevel | SPRAF_Active,true,&sate);
    check_result(hr);

    // Add a word
    const std::wstring commandWstr = std::wstring(command.begin(),command.end());
    hr = recoGrammar->AddWordTransition(sate,NULL,commandWstr.c_str(),L" ",SPWT_LEXICAL,1,nullptr);
    check_result(hr);

    // Commit changes
    hr = recoGrammar->Commit(0);
    check_result(hr);

    return recoGrammar;
}

void get_text(ISpRecoContext* reco_context)
{
    const ULONG maxEvents = 10;
    SPEVENT events[maxEvents];

    ULONG eventCount;
    HRESULT hr;
    hr = reco_context->GetEvents(maxEvents,events,&eventCount);

    // Warning hr equal S_FALSE if everything is OK 
    // but eventCount < requestedEventCount
    if(!(hr == S_OK || hr == S_FALSE)) {
        check_result(hr);
    }

    ISpRecoResult* recoResult;
    recoResult = reinterpret_cast<ISpRecoResult*>(events[0].lParam);

    wchar_t* text;
    hr = recoResult->GetText(SP_GETWHOLEPHRASE,SP_GETWHOLEPHRASE,&text,NULL);
    check_result(hr);

    CoTaskMemFree(text);
}

void check_result(const HRESULT& result)
{
    if (result == S_OK) {
        return;
    }

    std::string message;

    switch(result) {

    case E_INVALIDARG:
        message = "One or more arguments are invalids.";

    case E_ACCESSDENIED:
        message = "Acces Denied.";

    case E_NOINTERFACE:
        message = "Interface does not exist.";

    case E_NOTIMPL:
        message = "Not implemented method.";

    case E_OUTOFMEMORY:
        message = "Out of memory.";

    case E_POINTER:
        message = "Invalid pointer.";

    case E_UNEXPECTED:
        message = "Unexpecter error.";

    case E_FAIL:
        message = "Failure";

    default:
        message = "UnkNown : " + std::to_string(result);
    }

    throw std::exception(message.c_str());
}

正如我所说,这有点复杂.我认为您应该将所有代码包装到库中以使其更易于使用.

windows – SAPI:Speech to Text示例的更多相关文章

  1. 如何在Windows上获取视频捕获设备(网络摄像头)列表? (C )

    所以我们有一个简单的Cwin32控制台应用程序.我们想要的只是打印可用的网络摄像机和其他视频捕获设备列表.我们想尽可能多地使用windowsapis–毕竟没有外部库–我们想要的就是打印一个列表–不要飞到月球上!)如何做到这一点?也来自这个系列:>Howtogetalistofvideocapturedevicesonlinux?正确,尚未通过我的答案测试>Howtogetalistofvideocapturedevicesonwindows?

  2. 将托管DLL注入.net 4.0应用程序

    我已经成功地使用bootloaderdll(在c中)将托管DLL注入到.net3.5应用程序中,然后在(c#)中将我的“payload”dll注入.当我尝试这样做.net4.0应用程序总是崩溃.BootloaderC:有效载荷C#:我试过使用下面的修复程序,但没有用,有什么想法吗?

  3. TSQL Regular Expression WorkbenchTSQL的正则表达式

    We'veusedarangeofregexpatternsfromanumberofsourcesinthisworkbench.Likealotofprogrammers,wecollectupsnippetswecomeacross,almostalwaysforgettingtorecordtheoriginalauthor.Wethereforeapologiseinadvancefor

  4. windows – SAPI:Speech to Text示例

    我是SAPI的新手,如果你们中的任何人能够在SAPI中给我发表文本HelloWorld示例,我将非常感谢.我知道MS有一些例子,如“听写”等,但我想从一个非常小的开始.很高兴,如果你能提供帮助.我使用SAPI玩Windows语音识别,它真的不是用户友好的.这是我写的代码示例(在C中):正如我所说,这有点复杂.我认为您应该将所有代码包装到库中以使其更易于使用.

  5. winapi – 如何从使用“Project Centennial converter”转换为UWP的Win32应用程序访问Windows.Services.Store命名空间以启用应用内购买?

    使用WRL.以下是有关如何购买应用内购买的示例:以下是检查应用程序是否正在试用的方法:

  6. jQuery:prev()不工作?

    我在jQuery中使用prev()没有选择正确的元素时遇到麻烦.我的HTML结构如下:“活动”部分是#contact.我想选择上一节跳过active=active.prev似乎没有工作.我想我可能正在阅读文件错误…如果我拿出一切都很精美.关于如何跳过的任何想法在prev()?您可以调用.prev()一次跳过该小时,然后再次调用该部分:或者使用.prevAll()找到最接近的前一个:

  7. Angular:在表达式中与作用域交互

    新建expression_scope.html页面新建expression_scope.js页面:

随机推荐

  1. static – 在页面之间共享数据的最佳实践

    我想知道在UWP的页面之间发送像’selectedItem’等变量的最佳做法是什么?创建一个每个页面都知道的静态全局变量类是一个好主意吗?

  2. .net – 为Windows窗体控件提供百分比宽度/高度

    WindowsForm开发的新手,但在Web开发方面经验丰富.有没有办法为Windows窗体控件指定百分比宽度/高度,以便在用户调整窗口大小时扩展/缩小?当窗口调整大小时,可以编写代码来改变控件的宽度/高度,但我希望有更好的方法,比如在HTML/CSS中.在那儿?

  3. 使用Windows Azure查询表存储数据

    我需要使用特定帐户吗?>将应用程序部署到Azure服务后,如何查询数据?GoogleAppEngine有一个数据查看器/查询工具,Azure有类似的东西吗?>您可以看到的sqlExpressintance仅在开发结构中,并且一旦您表示没有等效,所以请小心使用它.>您可以尝试使用Linqpad查询表格.看看JamieThomson的thispost.

  4. windows – SetupDiGetClassDevs是否与文档中的设备实例ID一起使用?

    有没有更好的方法可以使用DBT_DEVICEARRIVAL事件中的数据获取设备的更多信息?您似乎必须指定DIGCF_ALLCLASSES标志以查找与给定设备实例ID匹配的所有类,或者指定ClassGuid并使用DIGCF_DEFAULT标志.这对我有用:带输出:

  5. Windows Live ID是OpenID提供商吗?

    不,WindowsLiveID不是OpenID提供商.他们使用专有协议.自从他们的“测试版”期结束以来,他们从未宣布计划继续它.

  6. 如果我在代码中进行了更改,是否需要重新安装Windows服务?

    我写了一个Windows服务并安装它.现在我对代码进行了一些更改并重新构建了解决方案.我还应该重新安装服务吗?不,只需停止它,替换文件,然后重新启动它.

  7. 带有双引号的字符串回显使用Windows批处理输出文件

    我正在尝试使用Windows批处理文件重写配置文件.我循环遍历文件的行并查找我想要用指定的新行替换的行.我有一个’函数’将行写入文件问题是%Text%是一个嵌入双引号的字符串.然后失败了.可能还有其他角色也会导致失败.如何才能使用配置文件中的所有文本?尝试将所有“在文本中替换为^”.^是转义字符,因此“将被视为常规字符你可以尝试以下方法:其他可能导致错误的字符是:

  8. .net – 将控制台应用程序转换为服务?

    我正在寻找不同的优势/劣势,将我们长期使用的控制台应用程序转换为Windows服务.我们为ActiveMQ使用了一个叫做java服务包装器的东西,我相信人们告诉我你可以用它包装任何东西.这并不是说你应该用它包装任何东西;我们遇到了这个问题.控制台应用程序是一个.NET控制台应用程序,默认情况下会将大量信息记录到控制台,尽管这是可配置的.任何推荐?我们应该在VisualStudio中将其重建为服务吗?我使用“-install”/“-uninstall”开关执行此操作.例如,seehere.

  9. windows – 捕获外部程序的STDOUT和STDERR *同时*它正在执行(Ruby)

    哦,我在Windows上:-(实际上,它比我想象的要简单,这看起来很完美:…是的,它适用于Windows!

  10. windows – 当我试图批量打印变量时,为什么我得到“Echo is on”

    我想要执行一个简单的批处理文件脚本:当我在XP中运行时,它给了我预期的输出,但是当我在Vista或Windows7中运行它时,我在尝试打印值时得到“EchoisOn”.以下是程序的输出:摆脱集合表达式中的空格.等号(=)的两侧可以并且应该没有空格BTW:我通常在@echo关闭的情况下启动所有批处理文件,并以@echo结束它们,所以我可以避免将代码与批处理文件的输出混合.它只是使您的批处理文件输出更好,更清洁.

返回
顶部