Аудио WAV-файл MS Speech Server для текстовой ошибки SPERR_NOT_TOPLEVEL_RULE - PullRequest
0 голосов
/ 20 января 2019

Попытка заставить 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, и как заставить этот код работать с поддержкой различных языков.

Спасибо!

...