Моя проблема заключается в следующем: мой идентификатор SAPI inproc отказывается загружать мой файл грамматики, когда для Windows 10 язык отображения установлен на английский (Великобритания).Проблема с суб-языками Microsoft SAPI
Язык системы отображения установлен в Великобритании. Язык распознавания речи - это Великобритания. Системный язык - Великобритания. Грамматика формата SAPI xml даже определяет LANGID = 809 - насколько я могу судить, ВСЕ установлено в EN-GB, и все же грамматика все равно не загружается.
Но он загружается и прекрасно работает при отображении языка и устанавливается на английский (США).
Кто-нибудь знает, что с этим? Это очень расстраивает ... Надеюсь, я просто пропустил что-то простое.
SAPI Initialization Код:
//////////////INITIALIZE SAPI ENGINE AND GRAMMAR//////////////////////////////
HRESULT SpeechObject::Initialize(){
//INITIALIZE SR ENGINE
if (FAILED(test=::CoInitialize(NULL)))
SRError(L"COM Initialization Fail");
//Create recognizer instance
if (FAILED(test=cpEngine.CoCreateInstance(CLSID_SpInprocRecognizer))){
SRError(L"Can't Load Reco Engine");
return test;
}
//Load the audio Input (in seperate function to facilitate reload)
LoadAudio(); //should I check this?
//load Default recognizer settings
cpEngine->SetRecognizer(NULL);
//get and load default reco profile
if (FAILED(SpGetDefaultTokenFromCategoryId(SPCAT_RECOPROFILES, &cpObjectToken)))
SRError(L"Can't Find Recognition Profile");
if (FAILED(cpEngine->SetRecoProfile(cpObjectToken)))
SRError(L"Can't Load Recognition Profile");
//create reco context
if (FAILED(test=cpEngine->CreateRecoContext(&cpContext))){
SRError(L"Can't Create Reco Context");
return test;
}
//send pSpeechObject to global callback function
cpContext->SetNotifyCallbackFunction(
(SPNOTIFYCALLBACK*)SpeechCallBack,
NULL, (LPARAM)this);
if(FAILED(cpContext->CreateGrammar(NULL, &cpGrammar)))
SRError(L"Can't Create context");
char str[80]; ////TEST
sprintf(str, "LANGID: %X", GetUserDefaultUILanguage());
MessageBoxA(GetActiveWindow(), str,0,0);
//load grammar from compiled grammar resource
if (FAILED(test = cpGrammar->LoadCmdFromResource(
hModule, MAKEINTRESOURCE(GRAMMARCFG),
L"FILE", GetUserDefaultUILanguage(), SPLO_STATIC))){
SRError(L"Can't Load Grammar. Please check language settings");
return test;
}
//(comment above and uncomment following to load from raw xml file for testing)
//cpGrammar->LoadCmdFromFile(L"Grammar.xml", SPLO_STATIC);
//Enable Engine and Reco Context
cpEngine->SetRecoState(SPRST_ACTIVE);
cpContext->SetContextState(SPCS_ENABLED);
//enable ALWAYS ACTIVE and GROUND ENGINES ON commands
return(cpGrammar->SetRuleState(NULL, NULL, SPRS_ACTIVE));
}
////////////LOAD (AND RELOAD) AUDIO INPUT//////////////////////
HRESULT SpeechObject::LoadAudio(bool dlgFlag){
if (FAILED(test = SpCreateDefaultObjectFromCategoryId(SPCAT_AUDIOIN, &cpAudioIn))){
SRError(L"Can't Find Default Audio Input");
return test;
}
if (FAILED(test = cpEngine->SetInput(cpAudioIn, TRUE))){
if (!dlgFlag)
SRError(L"Can't Set Audio Input");
return test;
}
if (pSRDisplay)
pSRDisplay->DisplayText("Audio Reloaded");
if (pDLog)
pDLog->LogEvent("Audio Reloaded");
//RecoState must be reenabled after audio reset
cpEngine->SetRecoState(SPRST_ACTIVE);
if (pDLog)
pDLog->LogEvent("SR ENABLED");
return test;
}
я получаю «Не удается загрузить Grammar Пожалуйста, проверьте настройки языка.» Ошибку каждый раз, когда язык отображения не является английский (США), даже если я подтверждаю, что ВСЕ НАСТРОЙКИ матч ...
бы реально оценить любой вид проницательности от людей более знающих, чем я
Фарли
К сожалению, это не работает. В самом деле, я бы довольно удивился, если бы это произошло, учитывая, что настройка в панели управления речью уже соответствует языку отображения. Все настройки совпадают. Я очень ценю вашу помощь, и я очень хочу услышать любые другие идеи! – lequinne
работает с языком отображения 409 (США), но не с 809 (Великобритания). Ни SpFindBestToken(), ни SetRecognizer() не выполняются. Другими словами, у меня все еще есть одна и та же проблема. – lequinne
У вас есть механизм распознавания, установленный для ru-UK? Например, у моей машины Win10 нет. –