玉管通地理,朱笔点天文
        欢迎光临文天软件之家
 
全站搜索
联系方式


网 址:文天软件之家

    www.jh-lzf.com

联系人:文天(刘中甫)

邮 箱:jh-lzf@21cn.com

地 址:湖北·武汉

    中国石化·江汉油田

    石油工程技术研究院

    信息中心

  

天气信息
新闻详情
多媒体语音报分功能的设计
来源:━━━━《计算机应用》2001第7期作者:刘中甫网址:http://www.jh-lzf.com浏览数:4

多媒体语音报分功能的设计

在多媒体软件中,其视觉效果与声觉效果的完美结合,让人耳目一新,这在一定程度上,提高了使用者的兴趣,消除了使用者因长时间操作电脑的疲劳感。下面笔者应用VB6,以多媒体语音报分功能的设计过程为例,介绍多媒体声音效果的实现方法。

一、设计用户界面

设计一个简单的用户界面如图1所示。其中“去掉一个最高分”、“去掉一个最低分”、“本次计算平均分”、“加上前次初审分”、“加上项目附加分”、“本项目最终得分”分别对应标签 Label8~Label13;文本框Text1 ~Text6为各类分数的输入及显示框;“语音报分”按键为Command1,“退出系统”按键为Command2。

二、插入多媒体控件

应用Mci32.ocx控件作为本系统的多媒体接口可实现语音报分功能。由于此控件不是VB6的基本控件,因此,需要应用“工程\部件”菜单,选中“Microsoft Multimedia Controls 6.0”(即打上勾),亦可点击“浏览”,选择“Mci32.ocx”控件,确定后即在工具箱中出现MMControl控件图标(鼠标在此图标上停留片刻,就会显示MMControl字样),双击此控件图标,便将多媒体控件添加到窗体上了,图1中灰白显示的即为MMControl1控件。

由于在语音报分程序中,窗体上的多媒体控件是由程序自动控制的,无需人工干涉,这就要求在程序运行时此控件应该是不可见的,即必须将此控件的Visible属性设为False,或在表单初始化时加入语句:MMControl1. Visible=False。

三、录制语音信息

要想在程序运行时播放窗体中的评审结果,我们必须预先录制好所有事件的声音,如“去掉一个最高分”、“去掉一个最低分”、“本次计算平均分”、“加上前次初审分”、“加上项目附加分”、“本项目最终得分”及0~10、“百”、“千”、“万”、“负”、“点”、“分”等语音(上述语音亦可直接从金山词霸中提取),待相应的事件发生后调用相应的WAV文件。本示例程序中,各语音信息及其所对应的WAV文件名如表1所示。

表1:语音信息与WAV文件对照表

语音信息

WAV文件

语音信息

WAV文件

去掉一个最高分

Max.wav

0~10

0.wav~10.wav

去掉一个最低分

Min.wav

百、千、万

100.wav、1000.wav、10000.wav

本次计算平均分

Avg.wav

Minus.wav

加上前次初审分

Fri.wav

Point.wav

加上项目附加分

Add.wav

scope

本项目最终得分

Sum.wav



四、编制事件触发程序

编制程序时,应特别注意两个问题。

其一是波型文件的路径问题:笔者所见的各类教科书及报刊杂志上一般都要强调,在程序中调用文件时,正确的方法是使用相对路径,而不用绝对路径,否则编译后运行程序会到此绝对路径去寻找文件,以致于会因找不到文件而出错。但是,笔者发现即使有时使用了相对路径(如波型文件在VB6所在的目录),编译后运行程序仍然没有声音,这是因为在窗体上插入了“打开/保存文件”等控件,运行时由于打开或保存文件后,系统便将此路径作为当前的缺省路径,程序运行时不是到安装路径去调用波型文件,而是到此缺省路径去调用波型文件,毫无疑问会因找不到波型文件而无声。为此,笔者在表单初始化时,便加入了一行语句dirs = CurDir,用于记录程序的安装路径,调用波型文件时,需用安装路径加上相对路径(如:dirs + "\scope.wav"),便可准确地定位波型文件所在地了。

其二是播音的延时问题:若连续播音几个波型文件时,各波型文件之间的延时必须适中。如果延时不够,轻则播音变调,重则无法播音;而延时过长,则既耽误时间,而且听起来慢条斯理,也让人很难受。因此必须在语音报分子程序中加入语句delays = MMControl1.Length,获取所调用波型文件的长度(单位:ms),并调用语句Call delaytime(delays)进行延时,延时可稍大于波型文件的长度,如延时程序中,将毫秒转换为秒时不是除1000,而是除900。

本示例程序的全部程序清单如下。

Dim dirs As String '定义启动路径变量

Private  Sub Command1_Click()    '语音报分按键Command1敲击事件

 Text6 = Val(Text3) + Val(Text4) + Val(Text5)

 Me.Refresh

 sound_scope '调用语音报分主程序

End Sub

Private Sub Command2_Click()   '退出系统按键Command2敲击事件

 Unload Me

End Sub

Private Sub Form_Load() '表单位初始化

 dirs = CurDir         '记录启动路径

 MMControl1. Visible=False     '隐藏多媒体控件

 '以下初始设置并非必要(只是举例),各数据可在运行时输入

 Combo1.text = "PT通用数据库管理系统(V1.0)"

 Combo2.text = "刘中甫"

 Text1 = 98.56: Text2 = 92.5: Text3 = 96.886: Text4 = 98.2: Text5 = -2.5

 Text6 = Val(Text3) + Val(Text4) + Val(Text5)

End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)    '退出系统

 Msg = "您确定要退出系统吗?!"

 If MsgBox(Msg, vbQuestion + vbYesNo, Me.Caption) = vbNo Then Cancel = True

End Sub

Private Sub sound_scope() '语音报分按键Command1的主调用程序

 Dim bits As Integer       'TEXT位数(含数字、小数点及负号)

 Dim bit As Integer        'TEXT整数位数

 For k = 1 To 6

    Select Case k

     Case 1: text = Text1: wavfile = dirs + "\max.wav"  '去掉一个最高分

     Case 2: text = Text2: wavfile = dirs + "\min.wav"  '去掉一个最低分

     Case 3: text = Text3: wavfile = dirs + "\avg.wav"  '本次计策平均分

     Case 4: text = Text4: wavfile = dirs + "\fri.wav"  '加上前次初审分

     Case 5: text = Text5: wavfile = dirs + "\add.wav"  '加上项目附加分

     Case 6: text = Text6: wavfile = dirs + "\sum.wav"  '本项目最终得分

End Select

If text <> "" Then       '仅当文本框中有分数时读此项

  sounds wavfile            '读标签文字

  bit = Len(Int(text)) '获取整数位数

  For i = 1 To Len(text)

     num_sound = Mid(text, i, 1)

     get_wav num_sound

     If num_sound <> "-" Then Call ands(bits, bit - i)

  Next

  Call sounds(dirs + "\scope.wav")   '

End If

 Next

End Sub

Private Sub get_wav(num_sound)   '分离出数字与其它字符

 For i = 0 To 9

If num_sound = Trim(i) Then

  Call sounds(dirs + "\" + Trim(i) + ".wav")        '报数字分

End If

 Next

 Select Case num_sound                              '报其它字符

  Case  "." :  Call sounds(dirs + "\point.wav")     '.

  Case  "-" :  Call sounds(dirs + "\minus.wav")     '-

  Case "分" :  Call sounds(dirs + "\scope.wav")     '报分

 End Select

End Sub


Private Sub sounds(wav_x)          '语音报分

 Dim delays As Integer

 MMControl1.Command = "Close"     '关闭多媒体声音控制系统,相当于初始化

 MMControl1.Notify = True

 MMControl1.Wait = True

 MMControl1.Shareable = False

 MMControl1.DeviceType = "WaveAudio"

 MMControl1.FileName = wav_x

 MMControl1.Command = "Open"

 MMControl1.Command = "play"

 delays = MMControl1.Length

 Call delaytime(delays)

End Sub


Private Sub delaytime(delay_t As Integer)           '延时

 Dim delay_sratr, delay_end

 delay_start = Timer

 Do Until delay_end - delay_start >= delay_t / 900

    delay_end = Timer

 Loop

End Sub


'以下子程序用于在入各数字之间加入“十”、“百”、“千”、“万”等,不是必要的,因此限于篇幅,本程序未加入判断后缀为零的整数情况。

Private Sub ands(bit1 As Integer, bit2 As Integer)

 'bit1第几位字符 , bit2第几位整数

 Select Case bit2                              '判断bit-1的值

      Case 1 : Call sounds(dirs + "\10.wav")   '有2位整数时中间加发"十"

  Case 2 : Call sounds(dirs + "\100.wav")      '有3位整数时中间加发"百"

      Case 3 : Call sounds(dirs + "\1000.wav") '有4位整数时中间加发"千"

  Case 4 : Call sounds(dirs + "\10000.wav")    '有5位整数时中间加发"万"

  Case 5 : Call sounds(dirs + "\10.wav")       '有6位整数时中间加发"十"

End Select

End Sub

五、运行程序

程序运行窗体如图2所示。在各输入框中输入好数据后,点击语音报分便能完全一字不错地读出评审结果框中的信息。如:“去掉一个最高分九十八点五六分 …… 本项目最终得分一百九十点五八六分”。