安装了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.
但编译时到“★★”处时报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.
风兄最近好吗?
下面是我原來找到的一点资料,有点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();}