SAPI Распознавание речи delphi

Мне нужно создать программный эквивалент с использованием языка delphi ... или может кто-нибудь опубликовать ссылку о том, как делать грамматики в peech распознавании с использованием delphi. Или любые примеры грамматики XML, имеющей программный эквивалент в Delphi. Извините за мой английский.

**Programmatic Equivalent ** 

Ссылка: 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:

    <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>

person XBasic3000    schedule 17.05.2010    source источник


Ответы (2)


Существует прямая оболочка для API речи, созданная командой джедаев, вы сможете найти код здесь http://www.delphi-jedi.org/apilibrary.html, однако я только что проверил, и ссылка на файл sapi.zip, похоже, не работает, возможно, электронное письмо команде джедаев изменит ее для вас.

Если у вас есть оболочка и, учитывая, что это прямая упаковка API, тогда документы MDSN - это то, что вы хотите, просто замените синтаксис Delphi на синтаксис C ++. 99% будет прямым, а то, что нет, просто спросите конкретный вопрос здесь (или в группах новостей Embarcadero)

person Tim Jarvis    schedule 17.05.2010
comment
Спасибо, мистер Тим! Я попробовал подставить все параметры. у него нет ошибок. но у этих двоих разные результаты. Интересно, как обстоят дела с буквой L в параметре. {GetRule (LHelloWorld ....)} я не включил его в свой параметр. это означает СПИСОК? - person XBasic3000; 17.05.2010
comment
LHello World означает, что Hello World - это «широкая» (или Unicode) строка. - person Eric Brown; 18.05.2010

Парень, я наконец-то смог получить ответ ....
Это может быть полезно другим ... :)

это фактический компонент, который я создал. просто измените его под свои нужды.

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;

Вызов функции ...

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);

Оставьте, пожалуйста, комментарий для пояснений .... удачи!

person XBasic3000    schedule 28.05.2010