精品主页 | 软件下载 | 系统下载 | 精品导航| 精彩图片 | 转帖工具 | 版主申请 | 影视下载
发新话题
打印

利用 VB 编写“文本朗读精灵

利用 VB 编写“文本朗读精灵

  


                  最近下载了一个软件“文本朗读精灵”,它居然能朗读中文,高兴之余研究了一下,发现它只不过是调用了微软的TTS引擎,这在VB中是很容易实现的。既然如此,何不自己动手制作一个属于自己的“文本朗读精灵”呢?

一、界面设置

进入VB,选择“标准EXE”新建一个工程,选择“工程”菜单中的“部件”,在弹出的对话框中选择“MicrosoftCommonDialogControl6.0”和“MicrosoftWindowsCommonControls6.0”,再选择“工程”菜单中的“引用”,在弹出的对话框中选择“MicrosoftSpeechObjectLibrary”

(如果没有此项,应该先安装简体中文语音引擎)。在默认的窗体FORM1上添加如下控件:一个文本框控件MainTxtBox;四个命令按钮,其Caption分别设置为“朗读”、“停止”、“暂停”、

“保存为WAV”;两个组合框控件;两个Slider控件;一个通用对话框控件ComDlg;四个标签控件,其Caption分别设置为

“语言”、“速度”、“音量”、“格式”。设置完成的界面如图所示。二、源代码



切换到代码编辑器,输入如下源代码:

OptionExplicit

’声明SAPI对象

DimWithEventsVoiceAsSpVoice

’朗读风格

Dimm_speakFlagsAsSpeechVoiceSpeakFlags

’设置默认格式.

ConstDefaultFmt="22kHz16BitMono"PrivateisspeakingAsBoolean

PrivateispausedAsBoolean



PrivateSubCommand1_Click()

’保存为WAV文件

ComDlg.CancelError=True

OnErrorGoToErrHandler

’设置对话框标题

ComDlg.DialogTitle="保存到声音文件"

’Setfilters

ComDlg.Filter="所有文件(*.*)|*.*|声音文件(*.wav)|*.wav"

ComDlg.FilterIndex=2

’显示保存对话框

ComDlg.ShowSave

DimcpFileStreamAsNewSpFileStream

’设置输出格式为所选格式

cpFileStream.Format.Type=FormatCB.ItemData(FormatCB.ListIndex)

cpFileStream.OpenComDlg.FileName,SSFMCreateForWrite,False

Voice.AllowAudioOutputFormatChangesOnNextSet=False

SetVoice.AudioOutputStream=cpFileStream

Voice.SpeakMainTxtBox.Text,m_speakFlags

Voice.WaitUntilDone-1

cpFileStream.Close

SetcpFileStream=Nothing

MsgBox"WAV文件成功保存!",vbOKOnly,"文件存盘"

ExitSub



ErrHandler:

IfNotcpFileStreamIsNothingThen

SetcpFileStream=Nothing

EndIf

EndSub



PrivateSubForm_Load()

’创建语音对象

SetVoice=NewSpVoice

DimTokenAsISpeechObjectToken

ForEachTokenInVoice.GetVoices

VoiceCB.AddItem(Token.GetDescription())

Next

VoiceCB.ListIndex=0

AddItemToFmtCB

’设置速度与音量

RateSldr.Value=Voice.Rate

VolumeSldr.Value=Voice.Volume

’设置默认格式

FormatCB.Text=DefaultFmt

SetSpeakingStateFalse,False

ExitSub

EndSub



PrivateSubForm_Unload(CancelAsInteger)

SetVoice=Nothing

EndSub



PrivateSubFormatCB_Click()

OnErrorGoToErrHandler

Voice.AllowAudioOutputFormatChangesOnNextSet=False

Voice.AudioOutputStream.Format.Type=FormatCB.ItemData

(FormatCB.ListIndex)

SetVoice.AudioOutputStream=Voice.AudioOutputStream

ExitSub

ErrHandler:

MsgBox"设置格式错误:",Err.Description

EndSub



PrivateSubPauseBtn_Click()

’暂停

SelectCasePauseBtn.Caption

Case"暂停"



Voice.Pause

SetSpeakingStateisspeaking,True

Case"继续"

Voice.Resume

SetSpeakingStateisspeaking,False

EndSelect

EndSub



PrivateSubRateSldr_Scroll()

Voice.Rate=RateSldr.Value

EndSub



PrivateSubSpeakBtn_Click()

’朗读

OnErrorGoToErrHandler

IfMainTxtBox.Text=""Then

ExitSub

EndIf

IfNot(ispausedAndisspeaking)Then

Voice.SpeakMainTxtBox.Text,m_speakFlags



EndIf

IfispausedThenVoice.Resume

SetSpeakingStateTrue,False

ExitSub

ErrHandler:

SetSpeakingStateFalse,ispaused

EndSub



PrivateSubStopBtn_Click()

’停止

OnErrorGoToErrHandler

Voice.SpeakvbNullString,SVSFPurgeBeforeSpeak

IfispausedThenVoice.Resume

SetSpeakingStateFalse,False

ExitSubErrHandler:EndSub



PrivateSubVoiceCB_Click()

’改变语言

SetVoice.Voice=Voice.GetVoices().Item(VoiceCB.ListIndex)EndSub



PrivateSubVolumeSldr_Scroll()

’设置音量

Voice.Volume=VolumeSldr.Value

EndSub



PrivateSubAddFmts(ByRefnameAsString,ByValfmtAs

SpeechAudioFormatType)

DimindexAsString

index=FormatCB.ListCount

FormatCB.AddItemname,index

FormatCB.ItemData(index)=fmt

EndSub



PrivateSubAddItemToFmtCB()

AddFmts"8kHz8BitMono",SAFT8kHz16BitMono

AddFmts"8kHz8BitStereo",SAFT8kHz8BitStereo

AddFmts"8kHz16BitMono",SAFT8kHz16BitMono

AddFmts"8kHz16BitStereo",SAFT8kHz16BitStereo



AddFmts"11kHz8BitMono",SAFT11kHz8BitMono









AddFmts"11kHz8BitStereo",SAFT11kHz8BitStereo

AddFmts"11kHz16BitMono",SAFT11kHz16BitMono

AddFmts"11kHz16BitStereo",SAFT11kHz16BitStereo



AddFmts"12kHz8BitMono",SAFT12kHz8BitMono

AddFmts"12kHz8BitStereo",SAFT12kHz8BitStereo

AddFmts"12kHz16BitMono",SAFT12kHz16BitMono

AddFmts"12kHz16BitStereo",SAFT12kHz16BitStereo



AddFmts"16kHz8BitMono",SAFT16kHz8BitMono

AddFmts"16kHz8BitStereo",SAFT16kHz8BitStereo

AddFmts"16kHz16BitMono",SAFT16kHz16BitMono

AddFmts"16kHz16BitStereo",SAFT16kHz16BitStereo



AddFmts"22kHz8BitMono",SAFT22kHz8BitMono

AddFmts"22kHz8BitStereo",SAFT22kHz8BitStereo

AddFmts"22kHz16BitMono",SAFT22kHz16BitMono

AddFmts"22kHz16BitStereo",SAFT22kHz16BitStereo



AddFmts"24kHz8BitMono",SAFT24kHz8BitMono

AddFmts"24kHz8BitStereo",SAFT24kHz8BitStereo

AddFmts"24kHz16BitMono",SAFT24kHz16BitMono

AddFmts"24kHz16BitStereo",SAFT24kHz16BitStereo



AddFmts"32kHz8BitMono",SAFT32kHz8BitMono

AddFmts"32kHz8BitStereo",SAFT32kHz8BitStereo

AddFmts"32kHz16BitMono",SAFT32kHz16BitMono

AddFmts"32kHz16BitStereo",SAFT32kHz16BitStereo



AddFmts"44kHz8BitMono",SAFT44kHz8BitMono

AddFmts"44kHz8BitStereo",SAFT44kHz8BitStereo

AddFmts"44kHz16BitMono",SAFT44kHz16BitMono

AddFmts"44kHz16BitStereo",SAFT44kHz16BitStereo



AddFmts"48kHz8BitMono",SAFT48kHz8BitMono

AddFmts"48kHz8BitStereo",SAFT48kHz8BitStereo

AddFmts"48kHz16BitMono",SAFT48kHz16BitMono

AddFmts"48kHz16BitStereo",SAFT48kHz16BitStereo

EndSub



PrivateSubSetSpeakingState(ByValbSpeakingAsBoolean,ByValbPausedAsBoolean)

SpeakBtn.Enabled=True

StopBtn.Enabled=bSpeaking

PauseBtn.Enabled=bSpeaking

IfbPausedThen

PauseBtn.Caption="继续"

Else

PauseBtn.Caption="暂停"

EndIf

isspeaking=bSpeaking

ispaused=bPaused

EndSub

好了,打开音箱,输入一段中文,试一试吧。完整的SPEECHSDK5.1及语言包下载地址是:

http://msdn.microsoft.com/downloads/default.asp?

url=/downloads/sample.asp?url=/msdn-files/027/000/

781/msdncompositedoc.xml

文中程序在WindowsMe、VB6.0中文企业版下调试通过。源程序下载地址:http://www.cfan.net.cn/qikan/cfan/source/0218vbb.zip。

TOP

发新话题