我下载了Borland的delphi官方Speech sdk5.1语音识别例子,但此生成的Exe在进行语音识别时,总是出现“变量转换错误类型”,而用微软VB的官方例子却无运行错误。我试了98,XP皆如此。不知哪位好汉能帮我?另外,我希望能和了解语音识别开发的交个朋友。mailto: [email protected]

解决方案 »

  1.   

    实现中文语音
    ============1、安装speechsdk51.exe
    2、安装speechsdk51LangPack.exe
    3、启动Delphi6
    4、安装了sdk5.1后,在Delphi里面Project<Import Type Library对话框里会有一个
      Micosoft Speech Object Library[Version5.1]的ActiveX组件,将它导入。
      你会看到一大堆控件,不过你要用的只是TSpVoice而已。
      TSpVoice实现了对SAPI的包装,能够设置Rate(音速), volume(音量),
      当然还有Voice(即你要的中文语音),
      用TSpObjectTokens的EnumTokens方法得到目前安装的语音,
      装了中文包后你就能得到中文的那个语音,然后TSpVoice.Voice := ...就可以了。
      详细请看SAPI.chm(sdk5.1中自带的help)以及其中的例程。
    下载地址:
    http://download.microsoft.com/download/speechSDK/SDK/5.1/WXP/EN-US/speechsdk51.exe
    http://download.microsoft.com/download/speechSDK/SDK/5.1/WXP/EN-US/speechsdk51LangPack.exe利用Microsoft Text To Speech技术编程 金山词霸2000进行查字典时,可以同时读出相应的英文单词,这大大方便用户的使用。其实,我们也可以在自己的应用程序中加入这种功能。金山词霸2000中利用的语音发声就是微软的Text To Speech技术,简称为MSTTS。在金山词霸2000的安装过程中,将自动安装MSTTS,我们也可以利用金山词霸2000安装光盘中的MSTTS.EXE文件单独安装。安装成功后,系统的Windows目录下将有一个Speech子目录,其中安装了相应的支持文件。其中的Vcmd.exe作为进程外的自动化服务器,提供将文本转换为语音的服务。Vtxtauto.tlb为相应的类型库,对服务器的接口给出了与语言无关的描述。在注册表中注册了相应的接口和自动化对象Speech.VoiceText.1。下面给出一个使用Delphi利用相应接口进行开发的简单例子,程序可以读出一个文本编辑控件中的文本。例子主要利用Win32的COM API进行编程,该方法同样适用于VC等开发语言。 首先,选择Project|Import Type Library菜单项检查是否注册了相应的类型库文件Vtxtauto.tlb,如果没用选择安装目录下的Vtxtauto.tlb文件进行注册。此时,Delphi将在Import子目录下生成该类型库的Object Pascal"包装"文件VtxtAuto_TLB.Pas,打开该文件可以看到该自动化对象支持的接口较为简单,只有一个IVTxtAuto接口,下面是该接口的说明: IVTxtAuto = interface(IDispatch)
    ['{FF2C7A50-78F9-11CE-B762-00AA004CD65C}']
    procedure Register(const pszSite: 
    WideString; const pszApp: WideString); safecall;
    procedure Speak(const pszBuffer: 
    WideString; dwFlags: Integer); safecall;
    procedure StopSpeaking; safecall;
    procedure AudioPause; safecall;
    procedure AudioResume; safecall;
    procedure AudioRewind; safecall;
    procedure AudioFastForward; safecall;
    procedure Set_Callback(const Param1:
    WideString); safecall;
    procedure Set_Speed(pdwSpeed: Integer); safecall;
    function Get_Speed: Integer; safecall;
    procedure Set_Enabled(pdwEnabled: Integer); safecall;
    function Get_Enabled: Integer; safecall;
    function Get_IsSpeaking: WordBool; safecall;
    property Callback: WideString write Set_Callback;
    property Speed: Integer write Set_Speed;
    property Enabled: Integer write Set_Enabled;
    property IsSpeaking: WordBool read Get_IsSpeaking;
    end;新建一个应用程序,在新建的工程中加入VtxtAuto_TLB.Pas,并在主窗体单元中引用该文件。在主窗体中加入一个编辑控件(TEdit)和一个按钮(TButton),在主窗体单元中说明全局变量IVTxtAuto1:IVTxtAuto,在主窗体的创建过程中加入如下代码。 IVTxtAuto1:=nill;CoInitialize(nil);//初始化COM库OleCheck(CoCreateInstance(CLASS_VTxtAuto_,nil,
     CLSCTX_ALL,IID_IVTxtAuto,IVTxtAuto1));
     //创建IVTxtAuto接口IVTxtAuto1.Register('Demo1','Project1.Exe');
     //向服务器注册IVTxtAuto1.Set_Enabled(1);//使能TTS功能
    IVTxtAuto1.Set_Speed(150);//设置语音速度IVTxtAuto1.Speak('Hi,I am trying to 
     speak to you, Do you hear me?',
     vtxtsp_VERYHIGH);//发声在Button1的Click事件处理过程中加入如下的代码。if IVTxtAuto1<>nil then
     IVTxtAuto1.Speak(Edit1.Text,vtxtsp_VERYHIGH)
    Else
     ShowMessage( '服务器没用初始化成功');编译运行程序就可以听到相应的Edit1编辑控件中文本的发音了。