gpt4 book ai didi

windows - SAPI:语音转文本示例

转载 作者:可可西里 更新时间:2023-11-01 14:39:52 30 4
gpt4 key购买 nike

我是 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, 0, 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, 0, 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, FALSE, &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:语音转文本示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16547349/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com