安装了MS SAPI5.1后,在DELPHI中使用TSpSharedRecoContext对象
但编译时到“★★”处时报ole错错,请赐教
完整代码请见:http://people.zeelandnet.nl/cpmol/delphi/speech.zip
unit fMain;interfaceuses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  SpeechLib_TLB, OleServer, StdCtrls, OleCtrls;type
  TForm1 = class(TForm)
    SpSharedRecoContext1: TSpSharedRecoContext;
    ListBox1: TListBox;
    procedure FormCreate(Sender: TObject);
    procedure SpSharedRecoContext1Recognition(Sender: TObject;
      StreamNumber: Integer; StreamPosition: OleVariant;
      RecognitionType: TOleEnum; var Result: OleVariant);
  private
    { Private declarations }
    Grammar: ISpeechRecoGrammar;
  public
    { Public declarations }
end;var
  Form1: TForm1;implementation{$R *.DFM}procedure TForm1.FormCreate(Sender: TObject);
begin
  SpSharedRecoContext1.Connect;
  Grammar := SpSharedRecoContext1.CreateGrammar(181);
  ★★Grammar.CmdLoadFromFile(ExtractFilePath(Application.ExeName) + 'test.xml', SLOStatic);
  Grammar.CmdSetRuleState('', SGDSActive);
end;procedure TForm1.SpSharedRecoContext1Recognition(Sender: TObject;
  StreamNumber: Integer; StreamPosition: OleVariant;
  RecognitionType: TOleEnum; var Result: OleVariant);
begin
  ListBox1.Items.Add ('Recognition: (' + Result.PhraseInfo.GetText (0, -1, True) + ')');
end;end.

解决方案 »

  1.   


    风兄最近好吗?
      下面是我原來找到的一点资料,有点xml资料,也许有点用.//--------------------------------------------------------------Speech SDK 采用 COM 的形式封装,和大多数COM对象一样,下面是一个似曾相识的初始化:     CoInitialize(NULL);     CLSIDFromProgID(L"SAPI.SpVoice", &CLSID_SpVoice);     ISpVoice * pSpVoice = NULL;     if (FAILED(CoCreateInstance(CLSID_SpVoice, NULL,         CLSCTX_INPROC_SERVER, IID_ISpVoice, (void **)&pSpVoice)))    {        cout << "Failed to create instance of ISpVoice!" << endl;        return -1;    }     现在我们用它来说 “Hello World”,非常简单: pSpVoice->Speak(L"Hello World!", SPF_DEFAULT, NULL); 最后,清除这一切 pSpVoice->Release(); CoUninitialize(); 很容易,是不是?下面我们稍微改变一下: IEnumSpObjectTokens *pSpEnumTokens = NULL;if (SUCCEEDED(SpEnumTokens(SPCAT_VOICES, L"language=409", NULL, &pSpEnumTokens))){       ISpObjectToken *pSpToken = NULL;        while (SUCCEEDED(pSpEnumTokens->Next(1, &pSpToken, NULL)) &&              pSpToken != NULL)       {              pSpVoice->SetVoice(pSpToken);              pSpVoice->Speak(L"Hello World!", SPF_DEFAULT, NULL);               pSpToken->Release();       }        pSpEnumTokens->Release();} 如果只需要一种 Voice,SpFindBestToken 更加方便: ISpObjectToken * pSpObjectToken = NULL; if (SUCCEEDED(SpFindBestToken(SPCAT_VOICES, L"gender=female",        NULL, &pSpObjectToken))){       pSpVoice->SetVoice(pSpObjectToken);        pSpVoice->Speak(L"Hello World!", SPF_DEFAULT, NULL);        pSpObjectToken->Release();} 现在改为使用中文: ISpObjectToken * pSpObjectToken = NULL; if (SUCCEEDED(SpFindBestToken(SPCAT_VOICES, L"language=804",        NULL, &pSpObjectToken))){       pSpVoice->SetVoice(pSpObjectToken);        pSpVoice->Speak(L"世界你好!", SPF_DEFAULT, NULL);        pSpObjectToken->Release();} ISpVoice::Speak 可以允许朗读的句子中包含 XML 标记,其实以上这一切用 XML 标记将变得十分简单: pSpVoice->Speak(L"<lang langid=\"804\">世界你好!</lang>", SPF_DEFAULT, NULL);     pSpVoice->Speak(L"<voice required=\"gender=female\">Hello World!</voice>", SPF_DEFAULT, NULL); 最后,以一段简单的报时结束这篇文章: SYSTEMTIME st;GetLocalTime(&st); ISpObjectToken * pSpObjectToken = NULL;if (SUCCEEDED(SpFindBestToken(SPCAT_VOICES, L"language=804", NULL, &pSpObjectToken))){       pSpVoice->SetVoice(pSpObjectToken);        WCHAR wsz[128];       swprintf(wsz,               L"现在是<context ID = \"CHS_Date_ymdhm\">%.4d-%.02d-%.2d %.2d:%.02d</context>",               st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute);        pSpVoice->Speak(wsz, SPF_IS_XML, NULL);        pSpObjectToken->Release();}