2010-05-17 14 views
1

J'ai besoin de créer un équivalent programmatique en utilisant le langage delphi ... ou quelqu'un pourrait poster un lien sur la façon de faire des grammaires en reconnaissant peech en utilisant le delphi. Ou des exemples de grammaire XML ayant un équivalent programmatique dans Delphi. Désolé pour mon anglais.SAPI Reconnaissance de la parole delphi

**Programmatic Equivalent ** 

Ref: http://msdn.microsoft.com/en-us/library/ms723634(v=VS.85).aspx

 SPSTATEHANDLE hsHelloWorld; 
     hr = cpRecoGrammar->GetRule(L"HelloWorld", NULL, 
         SPRAF_TopLevel | SPRAF_Active, TRUE, 
         &hsHelloWorld); 
     hr = cpRecoGrammar->AddWordTransition(hsHelloWorld, NULL, 
       L"hello world", L" ", 
       SPWT_LEXICAL, NULL, NULL); 
     hr = cpRecoGrammar->AddWordTransition(hsHelloWorld, NULL, 
       L"hiya|there", L"|", 
       SPWT_LEXICAL, NULL, NULL); 
     hr = cpRecoGrammar->Commit(NULL); 

XML Grammaire Sample (s):

<GRAMMAR> 
     <!-- Create a simple "hello world" rule --> 
     <RULE NAME="HelloWorld" TOPLEVEL="ACTIVE"> 
      <P>hello world</P> 
     </RULE> 
     <RULE NAME="HelloWorld_Disp" TOPLEVEL="ACTIVE"> 
      <P DISP="Hiya there!">hello world</P> 
     </RULE> 
     <RULE NAME="Question_Pron" TOPLEVEL="ACTIVE"> 
      <P DISP="I don't understand" PRON="eh">what</P> 
     </RULE> 
     <RULE NAME="NurseryRhyme" TOPLEVEL="ACTIVE"> 
      <P>hey</P> 
      <P MIN="2" MAX="2">diddle</P> 
     </RULE> 
     <RULE NAME="UseWeights" TOPLEVEL="ACTIVE"> 
      <LIST> 
       <P WEIGHT=".95">recognize speech</P> 
       <P WEIGHT=".05">wreck a nice beach</P> 
      </LIST> 
     </RULE> 
     <RULE NAME="UseProps" TOPLEVEL="ACTIVE"> 
      <P PROPNAME="NOVALUE">one</P> 
      <P PROPNAME="NUMBER" VAL="2">two</P> 
      <P PROPNAME="STRING" VALSTR="three">three</P> 
     </RULE> 
    </GRAMMAR> 

Répondre

1

de finalement je Guy en mesure d'obtenir la réponse ....
Cela pourrait être utile aux autres ... :)

C'est le composant que j'ai créé. il suffit de le modifier pour vos besoins.

Function TSRRule.AddWord (Word : String; Value : string = ''; Separator : char = '|') : integer; 
var 
    OleValue : OleVariant; 
begin 
    result := 0; 
    if Fwordlist.IndexOf(Word) = -1 then 
    begin 
     OleValue := Value; 
     Fwordlist.Add(Word); 
     FRule.InitialState.AddWordTransition(nil, word, Separator, SPWT_LEXICAL, FRuleName+'_value',Fwordlist.Count, OleValue, 1.0); 
     FWordCount := Fwordlist.Count; 
     result := FWordCount; 
    end; 
end; 

fonction d'appel ...

FSpRunTimeGrammar := SpInProcRecoContext.CreateGrammar(2); // we assign another grammr on index 2 

    SrRule1 := TSRRule.Create(1,'Rule1',FSpRunTimeGrammar); 
    with SrRule1 do 
     begin 
     AddWord('Maxtor'); 
     AddWord('Open NotePad','Notepad.exe'); 
     AddWord('Maxtor Dexter TrandPack','',' '); 
     commit; 
     end; 
    SrRule2 := TSRRule.Create(2,'Rule2',FSpRunTimeGrammar); 
    with SrRule1 do 
     begin 
     AddWord('the box'); 
     AddWord('WeLcOmE SaPi'); 
     AddWord('Halo World'); 
     commit; 
     end; 
    FSpRunTimeGrammar.CmdSetRuleState('Rule1',SGDSActive); 
    FSpRunTimeGrammar.CmdSetRuleState('Rule2',SGDSActive); 

S'il vous plaît Laisser un commentaire des éclaircissements .... bonne chance!

1

Il y a une enveloppe directe pour la api vocale fait par l'équipe jedi, vous devriez être en mesure de trouver le code d'ici http://www.delphi-jedi.org/apilibrary.html mais je viens de vérifier et le lien vers le fichier sapi.zip semble être brisé, peut-être un e-mail à t L'équipe Jedi va le faire pour vous.

Si vous obtenez le wrapper, et étant donné que c'est un retour direct à l'API, alors les docs MDSN sont ce que vous voulez, il suffit de remplacer la syntaxe Delphi pour la syntaxe C++ 99% sera simple, ce qui n'est pas t, il suffit de demander la question spécifique ici (ou sur les newsgroups Embarcadero)

+0

Merci Monsieur Tim! J'ai essayé de remplacer tous les paramètres. il n'a pas d'erreurs. mais les deux ont des résultats déférents. Je me demande comment le 'L' fait dans le paramètre. {GetRule (L "HelloWorld" ....)} Je ne l'ai pas inclus dans mon paramètre. est-ce que cela signifie une liste? – XBasic3000

+1

L "Hello World" signifie que "Hello World" est une chaîne "large" (ou Unicode). –

+0

Oui, Eric a raison. –