电话语音成绩查询系统

  、引言

  电话语音查询系统已广泛应用于电话银行、话费查询、证券委托、自动缴费(水、电、气等费用)、语音信箱、自动声讯服务、民航、公共考务、铁路等部门信息查询以及各种公共场所自动回答顾客提问等领域

  电话语音查询系统工作流程是用户拨通电话语音查询系统热线电话并根据电话中语音提示通过按电话键来查询电脑中存储各种信息; 电脑自动对用户操作进行应答并以语音形式将信息反馈给用户 其组成结构如图1所示



  图1 自动语音查询系统

   2、组成

  电话语音查询系统是现代电信技术和计算机技术高度结合产物般由硬件和软件Software两部分组成

  1.         硬件

  电话语音查询系统硬件部分主要包括:电脑、电话语音卡、外线(普通市话线路)或内线

  语音卡具体地讲是“电脑和电话语音处理卡”(以下简称为“语音卡”)它是种用于电脑并能够实现语音处理电脑插件语音卡主要功能是:通过计算机和电话网相连提供录音、放音、收码(DTMF 码、PULSE 码)、自动拨号、 振铃检测和控制摘挂机、信令检测、转接内线、监控录音、传真、数据传输、主叫号侦测等服务功能

  硬件部分安装过程极为简单只要将电话语音卡插入电脑扩展槽中再将电话线接至电话语音卡提供电话插座上即可构成电话语音查询系统硬件部分

  2.         软件Software

  软件Software般由操作系统、电话语音卡底层驱动软件Software和 2次开发接口软件Software、电话语音查询系统应用软件Software等 3个部分构成由于目前电话语音卡国际标准尚未制订因此区别生产厂家仍需随卡提供支持各种电话语音功能(如录音、放音、接收和发送双音频码等)底层驱动软件Software但是很多生产厂家还提供了方便用户进行 2次开发各种编程语言接口(主要以 .DLL 文件格式提供)

  电话语音查询系统应用软件Software般由电话语音处理和数据库处理两大模块组成

  电话语音处理模块主要任务是负责完成(通过底层驱动软件Software)每条线路摘挂机控制、放音、录音、接收由用户按键产生双音频信号以及发送双音频信号等功能并能够检测各种信号音如占线、忙音等

  数据库处理模块是根据语音处理模块所采集考号在数据库中查询所对应成绩模块是语音查询系统最重要组成部分的

   3、实现

  1.先把语音卡(我们用北京 5岳鑫信息技术有限公司生产8口TW_8VID型语音卡)插到电脑主板后重新启动计算机并安装该卡底层驱动软件Software和 2次开发接口软件Software(相关库动态连接口)以便电话语音处理

  2.通过语音卡自带录音功能把欢迎信息、用户操作提示信息、出错提示信息、引导信息、特别是把分数等用中文语音方式描述出来以便在语音查询系统适当过程中播放出来引导用户正确使用查询系统和获得所需要信息

  3.打开VB创建个工程分别添加5个计时器Control控件(Timer)及数据库连接Control控件(Ado)主要用于语音处理和数据库查询为保证语音处理实时性故将每个计时器Timer属性设置为200ms核心代码如下:

Dim AppDir As String
Dim MaxChannel As Long
Dim Dig As Double
Dim DataFound As Boolean
Dim DataReturn As String
Dim ReturnValueType As Integer
Dim CurChannel As Integer
Dim ChannelHitKey(0 To 7) As Integer
Dim ChannelSentence(0 To 7) As String
Dim ChannelTW_Folder(0 To 7) As String
Dim ChannelPlayFile(0 To 7) As String
Dim ChannelPlayTotal(0 To 7) As Long
Dim ChannelPlayRest(0 To 7) As Long
Dim ChannelRes(0 To 7) As Long
Dim ChannelPlaySentences(0 To 7) As String
 
Dim ChannelDataFound(0 To 7) As Boolean
Dim ChannelReturnScore(0 To 7) As String
Dim ChannelReturnValueType(0 To 7) As Integer
Dim ChannelWaiteTime(0 To 7) As Integer
Dim Score(0 To 7) As Integer
 
Dim ChannelRings(0 To 7) As Integer
Dim ChannelCallingID(0 To 7) As String
Dim ChannelCallingDate(0 To 7) As Date
Dim ChannelCallingStartTime(0 To 7) As String
Dim ChannelCallingEndTime(0 To 7) As String
Dim ChannelStep(0 To 7) As Integer
Dim ChannelLanguage(0 To 7) As Integer
 
Dim ChannelIsBegin(0 To 7) As Boolean
Dim ChannelSig(0 To 7) As Long
Dim ChannelCount(0 To 7)  As Long
Dim ChannelSigLen(0 To 7)  As Long
Dim ChannelSigUnuse(0 To 7)  As Long
Dim BarCodeStr As String
Dim ChannelBarCodEnterCount(0 To 7) As Integer
 
Private Sub SetVoice        
TV_SetVoicei CN_END, ""
TV_SetVoicei CN_NOTHING, ""              
TV_SetVoicei Asc(0), "voice\d0.tw"     '设置各数字及各种语音提示对应语音文件
TV_SetVoicei Asc(1), "voice\d1.tw"
 
TV_SetVoicei Asc(9), "voice\d9.tw"
TV_SetVoicei Asc(10), "voice\d10.tw"
TV_SetVoicei Asc(11), "voice\d100.tw"
TV_SetVoicei Asc(12), "voice\fen.tw"    '单字“分”ASCII码
 
End Sub
 
Private Sub Form_Load
Dim Channels As Integer
Channels = TV_Installed
If Channels = 0 Then
MsgBox "Tw8vid 驱动没有安装!"
TV_Disable
End
End If
TV_Initialize '化语音卡
Call SetVoice
End Sub
 
Private Sub Tmr_3_0_Timer
' 功能:       第 3号通道主控制模块
Dim Channel As Integer
Channel = 3
If Channels(Channel).CStatus = WS_HANGUP Then
ChannelRings(Channel) = TV_RingDetect(Channel)
If ChannelRings(Channel) > 2 Then
TV_OffHookCtrl Channel
Call InitializeChannal(Channel)
ChannelStep(Channel) = 1
Channels(Channel).CStatus = WS_OFFHOOK
End If
'End If
If Channels(Channel).CStatus = WS_OFFHOOK Then `处于摘机状态
Select Case ChannelStep(Channel)        
Case 1:                 `用户刚刚登陆系统播放欢迎词
ChannelPlayFile(Channel) = App.Path + "\voice\" + "welcome.tw"  `欢迎词
ChannelWaiteTime(Channel) = 25
TV_StartTimer Channel, ChannelWaiteTime(Channel)
Case 2:             `提醒用户输入考号
ChannelPlayFile(Channel) = App.Path + "\voice\" + "\Chn_2.tw"  `请输入考号
ChannelWaiteTime(Channel) = 50  
TV_StartTimer Channel, ChannelWaiteTime(Channel)
Case 3:         `提醒用户稍等以便系统进入下个阶段
ChannelPlayFile(Channel) = App.Path + "\voice\" +"\CHN_12.tw"   `请稍等
ChannelWaiteTime(Channel) = 50
TV_StartTimer Channel, ChannelWaiteTime(Channel)
ChannelStep(Channel) = 2         `开始输入考号
Case 4:                         
ChannelPlayFile(Channel) = App.Path + "\voice\"  + "\Chn_3.tw"   `您所输入考号为
ChannelWaiteTime(Channel) = 35
TV_StartTimer Channel, ChannelWaiteTime(Channel)
ChannelStep(Channel) = 5            `开始放音"所输入考号为"
Case 6:
ChannelPlayFile(Channel) = App.Path + "\voice\" + "\Chn_4.tw"
确认请按1 ,重新输入请按2,退出本系统请按3
ChannelWaiteTime(Channel) = 15
TV_StartTimer Channel, ChannelWaiteTime(Channel)
ChannelStep(Channel) = 7               `开始放音"确认请按1"
Case 8:
ChannelPlayFile(Channel) = App.Path + "\voice\" + "\Chn_11.tw" `请稍等
TmrSearch_3_4.Enabled = True
ChannelStep(Channel) = 8               `开始放音所输入考号
Case 9:
ChannelPlayFile(Channel) = App.Path + "\voice\" + "\Chn_5.tw" `'谢谢使用
Case 10:
ChannelPlayFile(Channel) = App.Path + "\voice\" + "\Chn_10.tw"   ` 你成绩为:
ChannelWaiteTime(Channel) = 15
TV_StartTimer Channel, ChannelWaiteTime(Channel)
ChannelStep(Channel) = 7                
Case 11:
ChannelPlayFile(Channel) = App.Path + "\voice\" + "\Chn_11.tw" `你成绩尚未录入 
End Select 
If TV_StartPlayFile(Channel, ChannelPlayFile(Channel), 0, LONG_MAX) = -1 Then
MsgBox "放音失败!", MB_ICONSTOP, "监听外线"
TV_HangUpCtrl Channel
ChannelIsBegin(Channel) = True
Else       `正在开始放音"
Channels(Channel).CStatus = WS_PLAYING
TV_FlushDTMF (Channel)
Select Case ChannelStep(Channel)
Case 1
TmrChoose_3_1.Enabled = True    
Case 2
TmrInputExamCode_3.Enabled = True   `启动考号输入操作监测模块
ChannelExamCode(Channel) = ""
ChannelSentence(Channel) = ""
Case 7
TmrConfirm_3_3.Enabled = True     `启动确认按键
End Select
End If
End If
If Channels(Channel).CStatus = WS_PLAYING Then
Select Case TV_PlayFileRest(Channel)
Case -1
MsgBox "放音失败!", MB_ICONSTOP, "监听外线"
TV_HangUpCtrl Channel
 Channels(Channel).CStatus = WS_HANGUP
 Case 0
 Channels(Channel).CStatus = WS_WAITING
 If ChannelStep(Channel) = 5 Then
 TV_PlaySentence Channel, ChannelSentence(Channel)
 Channels(Channel).CStatus = WS_PLAYINGSENTENCE
 ChannelRes(Channel) = 0
 TmrReadData_3_2.Enabled = True     
`启动读出用户所输入考号模块
 End If
 If ChannelStep(Channel) = 7 Then
 TV_PlaySentence Channel, ChannelSentence(Channel)
 Channels(Channel).CStatus = WS_PLAYINGSENTENCE
 ChannelRes(Channel) = 0
ChannelStep(Channel) = 12             `设置为查询完毕  
 End If
 If ChannelStep(Channel) = 8 Then TmrSearch_3_4.Enabled = True
 If (ChannelStep(Channel) >= 9) And (ChannelStep(Channel) <= 12) Then
 TV_HangUpCtrl Channel
 Channels(Channel).CStatus = WS_HANGUP
 ChannelIsBegin(Channel) = False
     End If
    End Select
End If
 
If (ChannelStep(Channel) = 9) And (Channels(Channel).CStatus = WS_ENDSEARCHING) Then
If ChannelDataFound(Channel) Then
Score(Channel)= Val(Trim(ChannelReturnScore(Channel)))
ChannelSentence(Channel) =""
Select Case Trim(ChannelReturnScore(Channel))
Case "100"
ChannelSentence(Channel) = String(1, Chr(11) )              `“百分”语音
Case Else
If (Score(Channel))<=10 then 
ChannelSentence(Channel) =String(1, Chr(Score(Channel)))    `“几分”语音
Else
ChannelSentence(Channel) =String(1, Chr(Score(Channel)\10))+ String(1, Chr(10))+ String(1, Chr(Score(Channel) Mod 10))                     `“几十几分”语音
End If
 End Select
ChannelStep(Channel) =10
    Else
ChannelStep(Channel) =11
   End If
TV_StopPlayFile (Channel)                          `停止“请稍等”语音
Channels(Channel).CStatus = WS_OFFHOOK
End If
End Sub
 
Private Sub TmrChoose_3_1_Timer
`功能: 第 3号通道开始工作时选择服务类别
Dim Channel As Integer
Channel = 3
If (ChannelStep(Channel) = 1) And (Channels(Channel).CStatus = WS_PLAYING Or Channels(Channel).CStatus = WS_WAITING Or Channels(Channel).CStatus = WS_DTMF) Then
ChannelHitKey(Channel) = TV_GetDTMFChar(Channel)
If ChannelHitKey(Channel) <> -1 Then
TV_StopPlayFile (Channel)
Channels(Channel).CStatus = WS_DTMF
Select Case ChannelHitKey(Channel)
Case 49:
TV_StopPlayFile (Channel)
Channels(Channel).CStatus = WS_OFFHOOK
ChannelStep(Channel) = 2        `服务选择为开始输入卡号
TmrChoose_3_1.Enabled = False
Case 50:
TV_StopPlayFile (Channel)
Channels(Channel).CStatus = WS_OFFHOOK
ChannelStep(Channel) = 2         `退出本系统
TmrChoose_3_1.Enabled = False
End Select
ElseIf (TV_TimerElapsed(Channel) = -1) Then
Channels(Channel).CStatus = WS_OFFHOOK
ChannelStep(Channel) = 9            `超时直接退出本系统
TmrChoose_3_1.Enabled = False
     End If
End If
End Sub
Private Sub TmrReadData_3_2_Timer
`功能: 第 3号通道 ,给用户读出所输入考号数据
Dim Channel As Integer
Channel = 3
If (ChannelStep(Channel) = 5) And (Channels(Channel).CStatus = WS_PLAYINGSENTENCE) Then
ChannelRes(Channel) = TV_PlaySentenceRest(Channel)
    Select Case ChannelRes(Channel)
    Case 0
      ChannelStep(Channel) = 6      
      Channels(Channel).CStatus = WS_OFFHOOK
      TmrReadData_3_2.Enabled = False
    Case -2
      'MsgBox "未定义文件名", MB_ICONSTOP, "读数字"
   End Select
End If
End Sub
Private Sub TmrInputExamCode_3_Timer
`功能: 第 3号通道 , 输入考号数据
Dim Channel As Integer
Channel = 3
 If (ChannelStep(Channel) = 2) And (Channels(Channel).CStatus = WS_PLAYING Or Channels(Channel).CStatus = WS_WAITING Or Channels(Channel).CStatus = WS_DTMF) Then
ChannelHitKey(Channel) = TV_GetDTMFChar(Channel)
 If ChannelHitKey(Channel) <> -1 Then
    TV_StopPlayFile (Channel)
    Channels(Channel).CStatus = WS_DTMF
     Select Case ChannelHitKey(Channel)
     Case 48 To 57:
              ChannelExamCode(Channel) = Trim(ChannelExamCode(Channel)) + String(1, Chr(ChannelHitKey(Channel)))
              ChannelSentence(Channel) = Trim(ChannelSentence(Channel)) + String(1, Chr(ChannelHitKey(Channel) )
     Case 35:
             If Len(ChannelExamCode(Channel)) <> 10 Then
                ChannelExamCode(Channel) = ChannelSentence(Channel) + "输入有误"
                ChannelStep(Channel) = 3             `输入数据有误
                ChannelExamCode(Channel) = ""
                ChannelSentence(Channel) = ""
                Else
                ChannelStep(Channel) = 4          `输入数据正确、确认、重新输入
             End If
             Channels(Channel).CStatus = WS_OFFHOOK
             TmrInputExamCode_3.Enabled = False
     End Select
    ElseIf (TV_TimerElapsed(Channel) = -1) Then
         Channels(Channel).CStatus = WS_OFFHOOK
         ChannelStep(Channel) = 9           `退出本系统
     End If
 End If
End Sub
 
Private Sub TmrSearch_3_4_Timer
`功能:   第 3号通道 ,按考号进行查询操作
'Dim Examcode_str As String
Dim Channel As Integer
Channel = 3
TmrSearch_3_4.Enabled = False
If (ChannelStep(Channel) = 8) Then
    Adodc1.RecordSource = "SELECT EXAMVAL FROM STUDRECORD WHERE EXAMCODE=" + "'" + ChannelExamCode(Channel) + "'"
    Adodc1.Refresh
    If Not Adodc1.Record.EOF Then    `库中存在此考生信息
      ChannelDataFound(Channel) = True
      ChannelReturnScore (Channel) = Adodc1.Record.Fields("EXAMVAL").Value & ""
    Else
        ChannelDataFound(Channel) = False   `库中不存在此考生信息
    End If
    Channels(Channel).CStatus = WS_ENDSEARCHING
    ChannelStep(Channel) = 9
End If
End Sub




   4、测试

  当外线电话打入时计算机自动检测到振铃信号并开始播放提示音同时开始接收用户电话按键信息用户通过电话按键输入考号计算机根据接收信息从后台数据库中取得查询结果数据并将相应分数数据进行语音合成再通过语音卡相应外线电话通道播放查询结果

   5、结语

  在通讯技术飞速发展且普及今天利用电话这最为百姓常用通讯工具并开发相应各类信息查询软件Software实现无论在何时何地均可查询本(用)户所需信息确实是件方便用户好事值得供各类信息服务提供者推广应用本文提供了实现语音成绩查询系统整个源代码相信读者利用这些源可以开发出适合自己需求语音查询系统



Tags: 

延伸阅读

最新评论

发表评论