读书人

关于语音朗读TTS的有关问题

发布时间: 2012-03-27 13:44:24 作者: rapoo

关于语音朗读TTS的问题

C/C++ code
#include "SpeechLib_OCX.h"#include "SpeechLib_TLB.h"TSpVoice *SpVoice1;ISpeechObjectTokensPtr sots;DWORD __stdcall TreadPlay(LPVOID lpParametr){    WideString con=Form1->Memo1->Text;    ::CoInitialize(NULL);    SpVoice1->Speak(con, SVSFDefault);    ::CoUninitialize();    return 0;}//---------------------------------------void __fastcall TForm1::FormCreate(TObject *Sender){    SpVoice1=new TSpVoice(this);    sots=SpVoice1->GetVoices(WideString("Language=804"), (wchar_t*)"");    if(sots->get_Count() == 0)    {        MessageBox(Handle, "没有安装中文朗读语音库!", "警告", MB_OK +            MB_ICONWARNING);        Close();    }    //列出所有语音库    ComboBox1->Items->Clear();    for(int i=0;i<sots->get_Count();i++)    {        ComboBox1->Items->Add(sots->Item(i)->GetDescription(NULL));    }    ComboBox1->ItemIndex = 0;    SpVoice1->_set_Voice(sots->Item(0));//设置发音}//---------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender)//播放按钮{    CreateThread(NULL,0,TreadPlay,this,0,NULL);}//---------------------------------------void __fastcall TForm1::Button3Click(TObject *Sender)//继续按钮{    SpVoice1->Resume();}//---------------------------------------void __fastcall TForm1::ComboBox1Change(TObject *Sender)//更换发音{    SpVoice1->_set_Voice(sots->Item(Form1->ComboBox1->ItemIndex));}//---------------------------------------void __fastcall TForm1::trckbr1Change(TObject *Sender)//音量{    SpVoice1->set_Volume(trckbr1->Position);}//---------------------------------------void __fastcall TForm1::trckbr2Change(TObject *Sender)//语速{    SpVoice1->set_Rate(trckbr2->Position);}void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action){    SpVoice1->Pause();//关闭时先停止,因为不知道停止怎么实现,先用暂停代替}//---------------------------------------void __fastcall TForm1::FormDestroy(TObject *Sender){    delete SpVoice1;}//---------------------------------------

问题:
1、怎么判断机子是否安装了微软的tts引擎呢?
2、怎么判断当前说话结束没有?上面只是部分代码,因为我想说话结束前,“播放”按钮不可用,播放完才可用。
3、怎么实现停止功能?TSpVoice 只有pause()和resume()函数,好像没有停止。
4、怎么实现播放过程中改变发音、音量、语速?上面更改了,但是只有本次播放完,对下次播放才能生效。

[解决办法]
SpVoice->SpeakCompleteEvent()强转一下就行了。
WaitForSingleObject((void*)SpVoice->SpeakCompleteEvent(), 200) == WAIT_OBJECT_0

读书人网 >C++ Builder

热点推荐