1

Mon problème est le suivant: Mon programme de reconnaissance SAPI inproc refuse de charger mon fichier de grammaire lorsque la langue d'affichage de Windows 10 est définie sur Anglais (UK).Problème de sous-langage Microsoft SAPI

Système Langue d'affichage définie sur UK. La langue de reconnaissance vocale est le Royaume-Uni. System Locale est le Royaume-Uni. SAPI xml-format Grammar spécifie même LANGID = 809 - autant que je sache, EVERYTHING est défini sur EN-GB, et pourtant la grammaire ne chargera toujours pas.

Mais il se charge et fonctionne très bien lorsque la langue d'affichage est définie sur Anglais (US).

Est-ce que quelqu'un sait quoi de neuf? C'est extrêmement frustrant ... J'espère que je manque quelque chose de simple.

SAPI Code Initialisation:

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

je reçois le « ne peut pas charger la grammaire S'il vous plaît vérifier les paramètres de langue. » Erreur chaque fois que la langue d'affichage est pas l'anglais (États-Unis), même si je confirme que tous les paramètres match de ...

apprécierions vraiment toute sorte de perspicacité des personnes plus informés que moi

Farley

Répondre

0

Le problème était que j'avais mal interprété la signification du paramètre "language" dans LoadCmdFromResource(). Je vais le blâmer sur la documentation SAPI ambiguë, bien que si j'avais de l'expérience en chargeant d'autres types de ressources avant que je puisse avoir été averti de cela. ;) Je pensais que SAPI l'utilisait d'une façon ou d'une autre et devrait correspondre à la langue du système et du système de reconnaissance (c'est ce que cela donnait dans la documentation). Il s'avère que cela ne fait que spécifier la langue utilisée pour compiler le fichier .RC dans lequel la grammaire est incluse (probablement pour permettre l'inclusion de plusieurs traductions dans des fichiers .rc séparés).

Le code fonctionne parfaitement comme initialement publié, à condition de remplacer "GetUserDefaultUI()" par un "0x409" explicite (la langue spécifiée dans le compilateur de ressources) dans l'appel à LoadCmdFromResource(). Maintenant, il fonctionne avec l'anglais américain, anglais britannique et probablement tous les reconnaisseurs anglais, et charge le reconnaisseur sélectionné dans le panneau de contrôle de la parole quel que soit le réglage de la langue d'affichage (qui peut même être non-anglais).

Merci beaucoup à Eric Brown pour m'avoir mis au courant, je commençais à perdre la tête.

Farley

0

Vous devez ex chargez le module de reconnaissance dans la langue de votre choix. En particulier, ceci:

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

charge toujours le module de reconnaissance spécifié dans le panneau de commande de la parole. Vous voulez probablement quelque chose comme ceci:

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

où vous aurez besoin de convertir le LCID de GetUserDefaultUILanguage à un nombre hexadécimal.

+0

Malheureusement, cela ne semble pas fonctionner. En effet, je serais très surpris si c'était le cas, étant donné que le réglage dans le panneau de commande de la parole correspondait déjà à la langue d'affichage. Tous les paramètres correspondent. J'apprécie vraiment votre aide, et j'ai hâte d'entendre d'autres idées! – lequinne

+0

fonctionne avec la langue d'affichage 409 (US), mais pas avec 809 (UK). Ni SpFindBestToken() ni SetRecognizer() échouent. En d'autres termes, j'ai toujours exactement le même problème. – lequinne

+0

Avez-vous, en fait, un moteur de reconnaissance installé pour en-UK? Ma machine Win10, par exemple, ne le fait pas. –