当前位置:编程学习 > 网站相关 >>

打造电话自动答录机

作者:iCexAOye[E.s.T]
== 我编写的电话自动答录机的程序界面如图1所示,使用了APro组件,Turbopower公司为Delphi和C++build开发者提供的一流通信应用VCL套件,提供了COM端口控制、RS-485、Mode、Winsock、FTP、GSM功能、终端仿真以及建立复杂商务电话应用程序等,还为kylix用户提供了CLX组件,更宝贵的是,开源的哦。

图1
反正也罗嗦了,索性再说一下安装组件的方法。“pakages”目录下,有多个版本的组件包,对于Delphi7来说,先打开a406_r70库文件进行编译,然后打开a4.6_d70安装就可以了,其他版本类似,4.6是组件版本号,后面的70是Delphi的版本号。OK,下面我们就开始工作,首先明确一下软件的功能和准备。
软件使用前提:Modem要带有语音功能,最好能检测DTMF键。
功能:电视里经常看到的,家里没人时,有人打电话能自动接听并让对方留言,以方便回家后看看有谁找过你(帅气)。
准备:准备一个问候语,也就是你的留言,比如“我现在8在家啦”之类,命名为hi.wav。再准备一个提示音,以便对方留言,命名为tishi.wav。将这两个文件放在与程序同一文件夹内就可以了。
这里用到的组件是Tapdcomport,用来控制串口,所有I/O串口访问都调用Tapdcomport方法。至于高层的通信行为,可以用该控件与硬件进行交互。ApdTapiDevice控件,主要提供了Modem拨号、应答和配置服务功能,该控件封装了TAPI函数和一些多媒体函数,可以解决电话录音和播放。这两个控件的属性和方法太多,全写出来,估计小编要杀了我的,这里就把用到的说一下,其他的大家去问Google老师吧。

‘const  //定义几个变量用于标识当前的modem状态
stategreeting=0;    //播放问候语状态
staterecording=1;   //录音
stateidle=2;        //空闲
statebeeping=3;    //播放录音提示
stateplayback=4;   //回放录音
private
{ Private declarations }
wavefiledir:string;   //录音文件的目录
callcount:integer;   //录音文件的序号,用于识别不同记录的录音
currentstate:integer;  //当前状态
procedure playbackmessage; //播放录音

程序主体部分的实现代码如下,很简单,大家一看就会明白。

procedure TForm1.FormCreate(Sender: TObject);
//程序窗口出现时
begin
wavefiledir:=extractfilepath(paramstr(0));
//在当前程序所在目录存放录音文件
callcount:=0 ;  //设置录音文件的序号
currentstate:=0;
ApdTapiDevice1.MonitorRecording:=CheckBox1.Checked;
end;

下面是选择设备Button的部分实现代码。

procedure TForm1.Button3Click(Sender: TObject);
begin
ApdTapiDevice1.SelectDevice;
//方法,显示一个对话框选择TAPI设备
ApdTapiDevice1.EnableVoice:=true;
//认识E文的应该知道是什么了吧?
end;

开启应答按键事件的代码如下。

procedure TForm1.Button1Click(Sender: TObject);
begin
if ApdTapiDevice1.EnableVoice then
//检测设备是否支持,若支持,则开启自动录音
ApdTapiDevice1.AutoAnswer
else
showmessage(选择的设备不支持语音功能);
end;

关闭应答按键事件的代码如下。

procedure TForm1.Button2Click(Sender: TObject);
begin
ApdTapiDevice1.CancelCall;
//应该能明白吧,关闭啦
Edit1.Text:=;   //把来电号码清空
Edit2.Text:=;
end;

当连接成功时,自动播放问候语,实现代码如下。

procedure TForm1.ApdTapiDevice1TapiConnect(Sender: TObject);
begin
Button2.Enabled:=true;
currentstate:=stategreeting;
label4.Caption:=播放问候语句;
ApdTapiDevice1.PlayWaveFile(wavefiledir+hi.wav);
end;

下面是重点,可能有点麻烦,我们一起看一下代码。

procedure TForm1.ApdTapiDevice1TapiWaveNotify(CP: TObject;
Msg: TWaveMessage);
var
filename,s:string;
size:Tsize;
temp:array[0..255] of char;
begin
case msg of
wadataready:    //录音完毕
begin
inc(callcount);    //保存录音,callN,wav,N递增
filename:=format(%scall%d.wav,[wavefiledir,callcount]);
ApdTapiDevice1.SaveWaveFile(filename,true);
end;
warecordclose:  //录音保存好
begin   //在列表中显示录音项,并且显示来电号码和日期
s:= format(%d.form:%s(%s)at%s,[callcount,edit2.Text,edit1.Text,datetimetostr(now)]);
listbox1.Items.AddObject(s,tobject(callcount));
gettextextentpoint(listbox1.Handle,strpcopy(temp,s),length(s),size);
//自动扩展录音列表
if (size.cx>listbox1.width) then
postmessage(listbox1.Handle,lb_sethorizontalextent,size.cx,0);
ApdTapiDevice1.CancelCall;   //停止连接
while ApdTapiDevice1.TapiState<>tsidle do
//等待下次连接的电话
application.ProcessMessages;
ApdTapiDevice1.AutoAnswer;
currentstate:=stateidle;
label4.Caption:=等待来电
end;
waplayclose:
case currentstate of
stategreeting:  //问候语播放后发出beep的提示音
begin
currentstate:=statebeeping;
ApdTapiDevice1.PlayWaveFile(wavefiledir+tishi.wav);
exit;
end;
statebeeping:   //开始播放beep
begin
currentstate:=staterecording;  //正式开始录音
ApdTapiDevice1.MaxMessageLength:=strtoint(edit3.Text);
label4.Caption:=录音中;
ApdTapiDevice1.StartWaveRecord;
exit;
end;
stateplayback:
begin
currentstate:=stateidle;
ApdTapiDevice1.UseSoundCard:=false;  //关闭声卡
label4.caption:=等待
end;
end;
end;
end;

下面是程序设计过程中涉及到的一些细节问题,我一并将其整理如下。
(1)对录制的留言进行编辑
begin
case key of
VK_DELETE:
listbox1.Items.Delete(listbox1.ItemIndex);
VK_RETURN:   //回车播放
playbackmessage;
end;
end;
(2)设置录音长度
try
ApdTapiDevice1.MaxMessageLength:=strtoint(edit3.Text);
except
on e:econverterror do begin
application.showexception(e);
edit3.SetFocus;
(3)播放留言
procedure TForm1.playbackmessage;
var
callnum:integer;
filename:string;
begin
label4.Caption:=留言;
callnum:=integer(listbox1.Items.Objects[listbox1.ItemIndex]);
filename:=format(%scall%d.wav,[wavefiledir,callnum]);
ApdTapiDevice1.UseSoundCard:=true;    //留言至声卡
ApdTapiDevice1.PlayWaveFile(filename);
end;
procedure TForm1.ApdTapiDevice1TapiCallerID(CP: TObject; ID, IDName: String);
begin
edit1.Text:=id;
edit2.Text:=idname;
end;

至此,整个程序就算编写完成了。难怪有人说Delphi像搭积木,把各个部分写好,拼起来就OK了。其实,以上只是最基本的APro组件的用途,该软件还能继续深入加工,我和朋友为学校写的电话自动查分系统,就是在此基础上加上检测对方输入的DTMF键,从而进行不同的操作,配合上数据库,可像高考电话查分一样进行成绩查询,如果加上IBM提供的语音开发应用程序Websphere voice server sdk建立语音识别就更棒了。本文结束之前,再给大家提供一段检测DTMF并进行相应操作的实现代码。

procedure TForm1.ApdTapiDevice1TapiDTMF(CP: TObject; Digit: Char;ErrorCode: Integer);
begin
case digit of   //当检测到不同的DTMF后进行相应操作
#:ApdTapiDevice1.CancelCall;
1:winexec(notepad.exe,sw_shownormal);
end;
end;
    
编程是枯燥的,但完成的喜悦是无与伦比的,让我们一起努力。嘻嘻,有了这东西,足够在女朋友面前炫一下了
补充:综合编程 , 其他综合 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,