Распознавание речи SAPI Delphi
-
27-09-2019 - |
Вопрос
Мне нужно создать программный эквивалент с использованием языка Delphi ... или может кто-то публиковать ссылку о том, как делать грамматики в Peech Distoriton, используя Delphi. Или любые примеры XML грамматики, который имеет программное эквивалент в 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 (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>
Решение 2
Парень, я наконец смог получить ответ ....
Это может быть полезно для других ... :)
Это фактический компонент, который я создал. Просто измените его для ваших потребностей.
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);
Пожалуйста, оставьте комментарий для разъяснений .... Удачи!
Другие советы
Есть прямая оболочка для речи API, сделанная командой Jedi, вы должны быть в состоянии найти код отсюда http://www.delphiedi.org/apilibrary.html. Однако я только что проверил, и ссылка на файл SAPI.ZIP, похоже, сломана, возможно, электронная почта в команду Jedi повернет его для вас.
Если вы получите удержание обертки, и далее, это прямая упаковка API, то MDSN Docs - это то, что вы хотите, просто замена Syntax Delphi для синтаксиса C ++ 99% будет прямо вперед, что это не просто спросить конкретный вопрос здесь (или на эмбаркадеро новостей)