利用 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。