还有,怎么进行语音命令输入?

解决方案 »

  1.   

    还有,Peedy.Get_Width已经不存在了,只有Peedy.Width,但是不是integer,是smallint,我要进行计算,怎么办?蠢鸟一个,请高手赐教!
      

  2.   

    要给她设置语音引擎
    //来自超级猛料2003
    混合编程实现英文文章的语音输出信息产业部电子第二十二研究所青岛分所 郎锐 现在有些软件尤其是翻译类软件多提供有语音输出的功能,比较有名的有《金山词霸2000》、《不知不觉背单词》等,他们所提供的英文朗读功能是通过直接使用了Microsoft的TTS(Text-to-Speech)全程化语音技术来实现的。其实我们也可以在自己的程序中通过对MS Speech API的调用来增加语音输出功能,尤其是对于翻译类软件,如果没有语音功能可以说这个软件是不完备的。 
    一、准备工作 
    为实现TTS技术,一个必要的前提条件是系统中要有MS TTS引擎,可以通过查看Windows目录下是否有speech的目录来判断是否安装过该引擎。如果没有,可以从《金山词霸2000》光盘上的ciba子目录下的mstts.exe来安装MS TTS引擎和spchapi(MS Speech API)或是直接从互连网上下载:可以从http://bcbsrc.home.chinaren.com/ttsapi.exe下载语音接口程序TTSapi.exe; 可以从http://bcbsrc.home.chinaren.com/ttssetup.exe下载男声语音引擎程序TTSSetup.exe;可以从http://bcbsrc.home.chinaren.com/ttssetup2.exe下载女声语音引擎程序TTSSetup2.exe。 
      
    二、引言 
    在整个设计过程中,主要是围绕着Vtxtauto.tlb这个类型库展开的,由于在VC下实现类型库比较烦琐,我们选择使用TLB类型库比较方便的Delphi来同Vtxtauto.tlb进行交互,并将几个主要的功能如"朗读"、"暂停"、"恢复"、"停止"等用几个相应的功能函数来实现,最终通过DLL(动态链接库)将其封装在内,对外则仅提供几个简单接口,可以很方便的为Delphi或其他语言调用。在此我们通过采用VC++6.0来调用这个由Delphi开发的拥有TTS技术的动态链接库来实现英文文本的语音输出。 
      
    三、Delphi动态链接库的实现 
    1、选"File"、"New…",在"New Items"对话框中选择"DLL",新建一动态连接库工程Project1。 
    2、选"File"、"New…",在"New Items"中选择"Unit",新建一单元TTSDLL。 
    3、选"Project"、"Import Type Library…",点击"Add"按钮,选择C:\windows\speech\目录下的Vtxtauto.tlb类型库,便将其添加到工程中来了。 
    4、编辑TTSDll单元如下: 
    unit TTSDLL; 
    interface 
    uses VtxtAuto_TLB; 
    procedure Create;export; {待导出的过程和函数} 
    procedure Read(text:PChar);export; 
    procedure Pause;export; 
    procedure Resume;export; 
    procedure Stop;export; 
    function IsSpeaking:Boolean;export; 
    procedure Destory;export; 
      
    var 
    TTS: IVTxtauto;  
      
    implementation  
    procedure Create; 
    begin 
    TTS:=CoVTxtAuto.Create; {创建对象} 
    TTS.Register('Project1','Project1'); {注册 } 
    end; 
      
    procedure Read(text:PChar); 
    begin 
    TTS.Speak(text,vtxtst_READING);  
    {朗读函数。第一参数是待朗读的文本。第二参数用于控制朗读的语气和优先级,主要有以下几种,可以根据需要灵活选择,如需多种选择将其进行或运算即可: 
    vtxtst_STATEMENT = 1;平时说话时语气,默认。 
    vtxtst_QUESTION = 2; 提问的语气。 
    vtxtst_COMMAND = 4; 命令的语气。  
    vtxtst_WARNING = 8; 警告的语气。 
    vtxtst_READING = 16; 阅读文档时的语气。 
    vtxtst_NUMBERS = 32; 阅读数字时的语气。 
    vtxtst_SPREADSHEET = 64; 阅读电子表格中元素时的语气。  
    vtxtsp_VERYHIGH = 128; 立即读出,可以打断当前正读的内容。  
    vtxtsp_HIGH = 256; 尽快读出,加入播放队列开始。  
    vtxtsp_NORMAL = 512; 默认,加入播放队列末尾。} 
    end; 
      
    procedure Pause; 
    begin 
    TTS.AudioPause; {暂停朗读} 
    end; 
      
    procedure Stop; 
    begin 
    TTS.StopSpeaking;{终止朗读} 
    end; 
      
    procedure Resume; 
    begin 
    TTS.AudioResume;{恢复朗读} 
    end; 
      
    function IsSpeaking:Boolean; 
    var 
    Check:Boolean; 
    begin 
    if TTS.IsSpeaking then {判断当前状态} 
    begin 
    Check:=TRUE;{当前正在朗读} 
    end 
    else 
    begin 
    Check:=FALSE;{当前没有朗读} 
    end; 
    Result:=Check;{返回状态值} 
    end;  
      
    procedure Destory; 
    begin 
    TTS:=nil;{释放对象} 
    end; 
    end. 
    5、在Project1.dpr的begin前面添加如下待导出过程函数列表: 
    exports 
    Create index 1, 
    Read index 2, 
    Pause index 3, 
    Resume index 4, 
    Stop index 5, 
    IsSpeaking index 6, 
    Destory index 7; 
    编译通过后即可得到封装有TTS语音接口的动态链接库: Project1.dll。 
      
    四、在VC 中调用TTS动态链接库 
    1、选"File","New…"新建一MFC AppWizard(exe)工程TTSCall。最后一步选择基类为CformView。其余可取缺省设置。 
    2、在Form上添加四个按钮,分别为:IDC_BUTTON1"朗读";IDC_BUTTON2"暂停";IDC_BUTTON4"恢复";IDC_BUTTON3"停止",以及一编辑框IDC_EDIT1。并添加四个按钮的处理函数:OnRead、OnPause、OnResume、OnStop和编辑框EN_CHANGE事件的响应函数:OnChangeEdit。通过ClassWizard为编辑框同一变量m_Text绑定。 
    3、为CTTSCallView类添加两个变量: BOOL m_bCreated; HINSTANCE m_DLL;并在构造函数中初始化之。 
    CTTSCallView::CTTSCallView() : CFormView(CTTSCallView::IDD) 

    //{{AFX_DATA_INIT(CTTSCallView) 
    m_Text = _T("Hello! Welcome to use this software developed by LangRui."); 
    //}}AFX_DATA_INIT 
    m_DLL = NULL; 
    m_bCreated=FALSE; 

    4、在视类中的初始化函数中添加代码: 
    void CTTSCallView::OnInitialUpdate() 

    CFormView::OnInitialUpdate(); 
    GetParentFrame()->RecalcLayout(); 
    ResizeParentToFit(); 
    GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE); 
    GetDlgItem(IDC_BUTTON2)->EnableWindow(FALSE); 
    GetDlgItem(IDC_BUTTON4)->EnableWindow(FALSE); 
    GetDlgItem(IDC_BUTTON3)->EnableWindow(FALSE); 

    5、实现朗读功能: 
    void CTTSCallView::OnRead()  

    m_DLL=LoadLibrary("Project1.dll"); //动态加载动态连接库 
    void (*Create)(void); 
    //取得DLL中的Create函数 
    Create=(void(*)(void))::GetProcAddress(m_DLL,"Create");  
    Create(); 
    m_bCreated=TRUE; 
    void (*Read)(char*); 
    //取得DLL 中的Read函数 
    Read=(void(*)(char*))::GetProcAddress(m_DLL,"Read"); 
    //获取编辑框内容 
    UpdateData(TRUE); 
    char buf[10000]; 
    ::strcpy(buf,m_Text); 
    Read(buf);//朗读编辑框的内容。 
    GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE);//"朗读"按钮不可用 
    GetDlgItem(IDC_BUTTON2)->EnableWindow(TRUE); //"暂停"按钮可用 
    GetDlgItem(IDC_BUTTON4)->EnableWindow(FALSE);//"恢复"按钮不可用 
    GetDlgItem(IDC_BUTTON3)->EnableWindow(TRUE); //"停止"按钮可用 

      

  3.   

    6、实现暂停功能: 
    void CTTSCallView::OnPause()  

    m_DLL=LoadLibrary("Project1.dll"); 
    void (*Pause)(); 
    Pause=(void(*)())::GetProcAddress(m_DLL,"Pause"); 
    BOOL (*IsSpeaking)(); 
    //判断是否正在朗读 
    IsSpeaking=(BOOL(*)())::GetProcAddress(m_DLL,"IsSpeaking"); 
    if(IsSpeaking()) 

    Pause(); 
    GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE); 
    GetDlgItem(IDC_BUTTON2)->EnableWindow(FALSE); 
    GetDlgItem(IDC_BUTTON4)->EnableWindow(TRUE); 
    GetDlgItem(IDC_BUTTON3)->EnableWindow(TRUE); 


    7、实现恢复功能: 
    void CTTSCallView::OnResume()  

    m_DLL=LoadLibrary("Project1.dll"); 
    void (*Resume)(); 
    Resume=(void(*)())::GetProcAddress(m_DLL,"Resume"); 
    BOOL (*IsSpeaking)(); 
    IsSpeaking=(BOOL(*)())::GetProcAddress(m_DLL,"IsSpeaking"); 
    if(!IsSpeaking()) 

    Resume(); 
    GetDlgItem(IDC_BUTTON1)->EnableWindow(FALSE); 
    GetDlgItem(IDC_BUTTON2)->EnableWindow(TRUE); 
    GetDlgItem(IDC_BUTTON4)->EnableWindow(FALSE); 
    GetDlgItem(IDC_BUTTON3)->EnableWindow(TRUE); 


    8、实现停止功能: 
    void CTTSCallView::OnStop()  

    m_DLL=LoadLibrary("Project1.dll"); 
    void (*Stop)(); 
    Stop=(void(*)())::GetProcAddress(m_DLL,"Stop"); 
    Stop();//停止朗读 
    GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE); 
    GetDlgItem(IDC_BUTTON2)->EnableWindow(FALSE); 
    GetDlgItem(IDC_BUTTON4)->EnableWindow(FALSE); 
    GetDlgItem(IDC_BUTTON3)->EnableWindow(FALSE); 

    9、当编辑框内容发生改变,而又没有进行朗读时,应当处于准备朗读状态: 
    void CTTSCallView::OnChangeEdit()  

    if(m_bCreated) 

    m_DLL=LoadLibrary("Project1.dll"); 
    BOOL (*IsSpeaking)(); 
    IsSpeaking=(BOOL(*)())::GetProcAddress(m_DLL,"IsSpeaking"); 
    if(!IsSpeaking()) 

    GetDlgItem(IDC_BUTTON1)->EnableWindow(TRUE); 
    GetDlgItem(IDC_BUTTON2)->EnableWindow(FALSE); 
    GetDlgItem(IDC_BUTTON4)->EnableWindow(FALSE); 
    GetDlgItem(IDC_BUTTON3)->EnableWindow(FALSE); 



    10、当程序退出时应释放加载的动态链接库,添加虚函数DestoryWindow() 
    BOOL CTTSCallView::DestroyWindow()  

    AfxFreeLibrary(m_DLL);  
    return CFormView::DestroyWindow(); 

    五、运行测试 
    将由Delphi编制的动态链接库Project1.dll复制到VC的TTSCall 工程的Debug 目录下。编译并运行TTSCall工程,在编辑框上写一端英文,按下"朗读"按钮,就可以听到利用TTS全程化语音技术所发出的抑扬顿挫的声音。 
    小结:TTS是全程化语音技术,它可以实现英文单词以及短语的准确发音,甚至可以独立完成整篇英文文章的流畅朗读。而且TTS技术是建立在英文阅读规则基础上的语音合成技术,并非将单词一个一个拆开机械得进行朗读,因此在语气的转折和单词的衔接上都非常自然,问句和祈使句的升降调也能很好的
      

  4.   

    呵呵,去AgentRing上看看,那里有很多动画小人,呵呵,挺有意思!!!!
      

  5.   

    具体怎么用在Merilin或者Peedy上呢?能够解释一下吗?蠢鸟一个,多多包含!
      

  6.   

    Merlin.LanguageID为什么不可读取?