一段"古老"的构思; 两组不难的程序;三个常见的软件;
这就请你编出"会报数的计算器"!
一段"古老"的构思:
记得还是在97年春天的时候,老师让我在电脑上统计全班考试的总成绩。我一个人在桌前一边用Windows附件里的计算器,一边手里那着厚厚的考卷往电脑里输入成绩。眼睛一会看考卷,一会移向屏幕,一会儿又得盯着键盘上右边的数字键。这样不仅眼睛和脖子累得很,而且很容易把数字录入错了。忽然想起宿舍小卖部里的那台会发音的计算器,它在按数字键时它会主动报出数字来。
那时我刚刚成为Visual Basic的狂热爱好者,马上就想到用VB必然可以编出这种会语音报数的计算器来,并且让这个程序仅用一张3寸软盘就可以装下。
两组不难的程序:
用VB实现一个计算器的功能,我想这就不用我多说了吧?VB自带的范例里就已经有计算器的程序了(在VB目录下的samples/calc中)。这是VB教学里最基本的程序,但是这个自带的计算器程序只能用鼠标点击计算器上的数字键时才能输入数字,所以我们还要加上响应数字键盘的程序。这一点VB的初学者都可以轻易解决。
另一个技术上的关键就是让计算机发音,这个问题在VB里同样可以解决。我们事先录下一段起名为sound.wav的声音文件。然后再用VB的多媒体控制接口MMControl控件命令来控制播放这段声音文件就可以了。你要是在VB的工具箱ToolBox中找不到MCI控件,可以在菜单里的"Tools"中"CustomControls"选"Microsoft Multimedia Control"对象就可以在工具箱中增加MMControl对象。
看,"发音计算器"程序主要构成就是这两组不难的模块部分。 但是构思的最精彩细节还在后面。
三个常见的软件:
首先我们要录一段声音文件。如图1,对着WINDOWS附件中的录音机快速而又有停顿地念出1234567890,把他们起名存成sound.wav文件。这个过程不用我细细描述了吧?但要注意录音的音频属性要调整为收音质量品质,用不着象CD一样的音质,这样文件就可以少占用空间了。看这段wav文件只有80K大小、3.7秒长,但这还只是开始,我们后面还有绝招。
第二个要用到的软件就是COOL,这是一个音频处理软件。它需要注册才能同时使用全部功能,但是我们这里仅用到COOL1.33版的一部分编辑和存盘的功能就足够了。因为此文是篇"古老"的东西,所以1.33版已是很老的玩意了,现在应该早就有了很多的更新版本。实际刚才录下的声音文件在每个数字声波间隔中还有很大一段没有有用信息的空间。如图2,用Zoom in放大声波文件我们就可以看到数字发音1和2中有0.2秒的无用信息,数字发音1前也有一段无用信息。用鼠标选中它们后删除,删除的同时你就可以看到COOL软件下方随时都在报这段文件改动后的大小和时间长短。经过简单的删除,紧缩的声音文件一下就变成了42K、2秒大小了。其实要是仔细修饰和调整声波文件,再用COOL重新选择编码方式还就可以把文件作得更小。这就使一张3寸软盘就可以装下整个发音计算器软件的可能变可行。另外还要注意COOL右下角的Time参数,用它和放大波形图的配合可以精确地标算出每一个数字发音文件的起始位和结束位,一会我们在VB中就要用到它所标出的参数定位。
第三个软件当然是我们的VB大宝宝。先来个小实验:如图3,用上面描述过的方法在窗体加上一个MCI多媒体播放器的控件,再加上一个按钮,上面标上数字2。加入一下程序代码:
Private Sub
Form_Load()
MMControl1.TimeFormat = 0
MMControl1.DeviceType = "waveaudio"
MMControl1.filename = "c:\sound.wav"
MMControl1.Command = "open"
End Sub
这些代码告诉了电脑设定计时方式为把1秒分成1000个单位;启动MCI控件播放声波.wav的文件;通知电脑要播放的文件所处位置;打开MCI控件作好播放准备。
再在"2"按钮中加入代码:
Private Sub
Command1_Click()
MMControl1.From = 180:
MMControl1.To = 400
MMControl1.Command = "play"
End Sub
一运行按按钮就会清晰地发出"2"这一发音。现在我们可以说对整个"发音计算器"程序的实现有了一个清楚的认识了吧?通过VB的From和To的控制,我们可以挑选.wav文件的任意一段来播放。我们可以通过COOL软件精确地知道在sound.wav文件中从0.18秒到0.4秒是"2"这一数字的发音。COOL之类的音频处理软件和VB的MCI多媒体控件对声波文件的播放功能之完美组合就可以化不可能为可能。我们在计算器按那个数字键时同时就让MCI控件播放那个数字的发音片段,比如和Select Case Index语句作简单配合就可以轻而易举地实现按数字发音的效果,篇幅有限这里就不再具体描述了。整个程序的主体用不着半天就可以完成了,而且相当实用。使用计算器时眼睛只用看着纸面,手指就可以在数字小键盘上潇洒轻快地点动着。请你快快实现它吧,作为你开发的又一个自由软件成名于天下。
不过要想让它可靠实用地工作还有一些工作要做。比如声音里还要加入"+-*/= . 清0"等符号的声音,还要有除0时的警告,如果我们用API形式来播放声音文件还要具体考虑声音的同步异步播放、函数在声音播放后的返不返回问题,还应该加入对计算结果的逐字读出的等功能,要开发也得加上科学计算器的形式……好苦呀!所以我把这些工作都留给了你。
^_^ 后记:也许当时就早有人用到了这个小构思,但我在自己想出这个主意的时候还是很有成就感的,不用为每一个数字键都作一段录音了,节省了大量的空间和简化了程序的运行过程。最近发现北京114电话查询台播报号码时很可能也是利用了播放数字声音片段的方式,有些发音电子记事本可能也是"抄袭"了我的技术。由此延伸,其实会报时的闹钟、计时器、车船飞机的售票处、旅馆车站查询服务台等等很多地方都可以用这样的方法来完成种种发音功能。
……