Попытка заставить MS Speech Server распознавать речь WAV аудио файла и преобразовать ее в текст в Delphi XE7 в 64-разрядной версии Windows 7 Professional, но получить ошибку 0x80045054 «SPERR_NOT_TOPLEVEL_RULE».
Не могу найти ничего об этой ошибке. Этот же код, содержащий только две разные строки, прекрасно работает с SAPI, но мне также нужна поддержка разных языков, и он нашел только файлы локализации распознавания речи для Speech Server (https://www.microsoft.com/en-us/download/details.aspx?id=3971).
Установил MS Speech Server, импортировал библиотеку типов ActiveX в Delphi (SpeechLibServer_TLB.pas) и это код:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.OleServer, SpeechLibServer_TLB, ActiveX;
type
TForm1 = class(TForm)
Button1: TButton;
procedure SPRecognition(ASender: TObject; StreamNumber: Integer; StreamPosition: OleVariant; RecognitionType: TOleEnum; const Result: ISpeechRecoResult);
procedure SPFalseRecognition(ASender: TObject; StreamNumber: Integer; StreamPosition: OleVariant; const Result: ISpeechRecoResult);
procedure SPEndStream(ASender: TObject; StreamNumber: Integer; StreamPosition: OleVariant; StreamReleased: WordBool);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
FileStream: TSpFileStream;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
SR: TSpInProcRecoContext;
Grammar: ISpeechRecoGrammar;
begin
{
Error 0x80045054
Value: -2147200940 | 0x80045054 | 2147766356
What does it mean?
SPERR_NOT_TOPLEVEL_RULE
An attempt to deactivate or activate a non-toplevel rule.
}
FileStream := TSpFileStream.Create(Self);
SR := TSpInProcRecoContext.Create(Self);
try
SR.OnEndStream := SPEndStream;
SR.OnFalseRecognition := SPFalseRecognition;
SR.OnRecognition := SPRecognition;
Grammar := SR.CreateGrammar(0);
//* British English $809, American English $409, DK = 1030, strange but this line accepts any number even locale IDs that are not installed.
Grammar.Reset($409);
//Grammar.DictationSetState(SGDSActive); //* Error: Not implemented. for Speech Server, accepted for SAPI.
Grammar.State := SGSEnabled; //* Added this line for Speech Server.
FileStream.Open('whatstheweatherlike.wav', SPFM_OPEN_READONLY, False);
SR.Recognizer.AudioInputStream := FileStream.DefaultInterface;
Grammar.CmdSetRuleState('TopRule', SGDSActive); //* Error 0x80045054 An attempt to deactivate or activate a non-toplevel rule.
finally
FreeAndNil(SR);
end;
end;
procedure TForm1.SPEndStream(ASender: TObject; StreamNumber: Integer; StreamPosition: OleVariant; StreamReleased: WordBool);
begin
FileStream.Close;
end;
procedure TForm1.SPFalseRecognition(ASender: TObject; StreamNumber: Integer; StreamPosition: OleVariant; const Result: ISpeechRecoResult);
begin
Showmessage('Cannot recognize');
end;
procedure TForm1.SPRecognition(ASender: TObject; StreamNumber: Integer; StreamPosition: OleVariant; RecognitionType: TOleEnum; const Result: ISpeechRecoResult);
begin
Showmessage(Result.PhraseInfo.GetText(0, - 1, True));
end;
end.
Вопрос в том, что означает эта ошибка, как ее исправить и почему не получить ее с помощью Microsoft Speech Object Library (SAPI), а с MS Speech Server, и как заставить этот код работать с поддержкой различных языков.
Спасибо!