关于语音朗读TTS的问题

神秘_博士 2011-11-13 04:22:23
#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、怎么实现播放过程中改变发音、音量、语速?上面更改了,但是只有本次播放完,对下次播放才能生效。
...全文
409 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
cgl_lgs 2011-11-14
  • 打赏
  • 举报
回复
您看看這個吧:
http://download.csdn.net/download/zhuseahui/1010304
或許會有點兒幫助?
cgl_lgs 2011-11-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lovelyelfpop 的回复:]

引用 2 楼 cgl_lgs 的回复:

SpVoice->SpeakCompleteEvent()强转一下就行了。
WaitForSingleObject((void*)SpVoice->SpeakCompleteEvent(), 200) == WAIT_OBJECT_0
我帖子上面其他问题你知道么?
[/Quote]沒用過,真不清楚呢:)
神秘_博士 2011-11-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 cgl_lgs 的回复:]

SpVoice->SpeakCompleteEvent()强转一下就行了。
WaitForSingleObject((void*)SpVoice->SpeakCompleteEvent(), 200) == WAIT_OBJECT_0
[/Quote]我帖子上面其他问题你知道么?
cgl_lgs 2011-11-14
  • 打赏
  • 举报
回复
SpVoice->SpeakCompleteEvent()强转一下就行了。
WaitForSingleObject((void*)SpVoice->SpeakCompleteEvent(), 200) == WAIT_OBJECT_0
cgl_lgs 2011-11-14
  • 打赏
  • 举报
回复
呵呵,是别扭些,不过应该还是可以译过来的:)
神秘_博士 2011-11-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 cgl_lgs 的回复:]

還有這個:
http://msdn.microsoft.com/zh-cn/library/ms720163%28v=VS.85%29.aspx#ModifyingSpeech
[/Quote]不过还是谢谢了
神秘_博士 2011-11-14
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 cgl_lgs 的回复:]

還有這個:
http://msdn.microsoft.com/zh-cn/library/ms720163%28v=VS.85%29.aspx#ModifyingSpeech
[/Quote]诶,微软那的是ISpVoice类,BCB是TSpVoice类,使用上有点不一样
vc的看着真别扭
神秘_博士 2011-11-13
  • 打赏
  • 举报
回复
WaitForSingleObject(SpVoice.SpeakCompleteEvent, 200) = WAIT_OBJECT_0

上面这个Delphi的语句怎么换成BCB的,我是这样写的
WaitForSingleObject(SpVoice->SpeakCompleteEvent(), 200) == WAIT_OBJECT_0

结果说
[BCC32 Error] Unit1.cpp(25): E2034 Cannot convert 'long' to 'void *'
[BCC32 Error] Unit1.cpp(25): E2342 Type mismatch in parameter 'hHandle' (wanted 'void *', got 'long')
怎么回事啊?

703

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder ActiveX/COM/DCOM
社区管理员
  • ActiveX/COM/DCOM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧