1

Моя проблема заключается в следующем: мой идентификатор 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 Пожалуйста, проверьте настройки языка.» Ошибку каждый раз, когда язык отображения не является английский (США), даже если я подтверждаю, что ВСЕ НАСТРОЙКИ матч ...

бы реально оценить любой вид проницательности от людей более знающих, чем я

Фарли

ответ

0

Проблема заключалась в том, что я неправильно истолковал значение параметра «language» в LoadCmdFromResource(). Я обвиню его в двусмысленной документации SAPI, хотя, если бы у меня был опыт загрузки некоторых других типов ресурсов, прежде чем я мог бы перейти к этому. ;) Я думал, что это каким-то образом используется SAPI и должно соответствовать языку системы и распознавателя (так оно и звучало в документации). Оказывается, на самом деле он просто указывает язык, используемый для компиляции файла .RC, в который включена грамматика (предположительно, чтобы включить несколько переводов в отдельные .rc).

Код работает отлично, как первоначально было опубликовано, до тех пор, пока я заменил «GetUserDefaultUI()» явным «0x409» (язык, указанный в компиляторе ресурсов) в вызове LoadCmdFromResource(). Теперь он работает с английским английским, британским английским и, предположительно, всеми распознавателями английского языка, и загружает распознаватель, выбранный на панели управления речью, независимо от настройки языка дисплея (который может быть даже неанглийским).

Многие, большое спасибо Эрику Брауну за то, что он меня опрокинул, я начинал терять рассудок.

Farley

0

Вы должны экс платно загрузите распознаватель для вашего предпочтительного языка. В частности, это:

//load Default recognizer settings 
cpEngine->SetRecognizer(NULL); 

всегда загружает распознаватель, указанный в панели управления речью. Скорее всего, вы хотите что-то вроде этого:

CComPtr<ISpObjectToken> cpEngineToken; 
hr = SpFindBestToken(SPCAT_RECOGNIZERS, L"Language=<hex language id>", NULL, &cpEngineToken); 
// check hr 
hr = cpEngine->SetRecognizer(cpEngineToken); 

, где вам нужно преобразовать LCID из GetUserDefaultUILanguage в шестнадцатеричное число.

+0

К сожалению, это не работает. В самом деле, я бы довольно удивился, если бы это произошло, учитывая, что настройка в панели управления речью уже соответствует языку отображения. Все настройки совпадают. Я очень ценю вашу помощь, и я очень хочу услышать любые другие идеи! – lequinne

+0

работает с языком отображения 409 (США), но не с 809 (Великобритания). Ни SpFindBestToken(), ни SetRecognizer() не выполняются. Другими словами, у меня все еще есть одна и та же проблема. – lequinne

+0

У вас есть механизм распознавания, установленный для ru-UK? Например, у моей машины Win10 нет. –