智能电话机器人,使用Microsoft语音识别技术(Speech sdk)(下)
现在,硬件上的准备工作做完了.
下一步,先打开Modem的电源,用SecureCRT,有电话机器人,VOS线路问题或要演示站AI技术支持,外呼中心搭建找博主。VX_ID:3307623172连接串口,敲入些AT命令,看看Modem能否执行.
这里简单说一下AT命令:
AT命令有两种解释一种是调制解调器命令语言,简单来说就是一些固定格式的字符串,我们通过串口向Modem发送AT命令的字符串,Modem就会按照
命令去执行不同的操作.AT命令的百度百科请看这里,具体的命令格式和使用方法请自行百度.
我们先来试试拨号
向串口发送命令:atdt10086;
不出意外的话Modem就会摘机,并发出拨号音,然后就会听到10086的语音了.
然后是按键交互
比如我要按1键然后按#号键则
按键命令:atd,1,#;
逗号的作用是延时,让多个按键之间有些间隔,防止对方识别不清
然后是挂机
挂机的命令是:ath;
发送这个命令,Modem就执行挂机动作了.
这些基本动作都可以完成之后,下面就进入第二个问题了:
用什么技术来实现语音识别1xx86那边所说的语音?
这里我经过一段时间的技术调查,最终决定使用微软Windows7自带的语音识别引擎
这个引擎有两种识别模式,第一种是自由识别,这种方式每当引擎识别出任意一段文字之后便会触发识别事件SpeechRecognized
另一种方式是关键词识别,这种方式只有引擎识别出的文字符合关键词,才会触发识别事件SpeechRecognized
我们采用关键词模式进行识别,根据1xx86语音播报的不同关键词,来按不同的按键,完成功能.
这个功能在控制面板里可以看到控制面板->轻松访问->语音识别
.Net有对应的类库可以调用,命名空间如下:
usingSystem.Speech.Recognition;usingSystem.Speech.Synthesis;
引擎使用方法:
首先,创建语音识别引擎,设置音频输入设备
复制代码CultureInfomyCIintl=newCultureInfo(“zh-CN”);foreach(RecognizerInfoconfiginSpeechRecognitionEngine.InstalledRecognizers())//获取所有语音引擎{if(config.Culture.Equals(myCIintl)&&config.Id==“MS-2052-80-DESK”){Recognizer=newSpeechRecognitionEngine(config);Recognizer.SetInputToDefaultAudioDevice();//选择默认的音频输入设备break;}//选择中文的识别引擎}if(Recognizer!=null){InitializeSpeechRecognitionEngine(fg);//初始化语音识别引擎}else{MessageBox.Show(“创建语音识别失败”);}复制代码然后进行初始化,加载关键词
复制代码//////初始化,加载关键词组//////关键词组privatevoidInitializeSpeechRecognitionEngine(string[]fg){GrammarcustomGrammar=CreateCustomGrammar(fg);//根据关键字数组建立语法Recognizer.UnloadAllGrammars();Recognizer.LoadGrammar(customGrammar);//加载语法}复制代码然后开始识别
复制代码//////开始识别///publicvoidBeginRec(){TurnSpeechRecognitionOn();}复制代码上述简单介绍了识别引擎的使用过程,我将此过程封装为一个类,方便主程序调用
复制代码usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Speech;usingSystem.Speech.Recognition;usingSystem.Globalization;usingSystem.Windows.Forms;
usingSystem.Speech.Synthesis;usingSystem.Diagnostics;
namespaceSp10086{publicclassSRecognition{//////语音识别引擎///publicSpeechRecognitionEngineRecognizer{get;set;}
//重载构造函数publicSRecognition():this(newstring[]{""}){}publicSRecognition(string[]fg)//创建关键词语列表{CultureInfomyCIintl=newCultureInfo("zh-CN");foreach(RecognizerInfoconfiginSpeechRecognitionEngine.InstalledRecognizers())//获取所有语音引擎{if(config.Culture.Equals(myCIintl)&&config.Id=="MS-2052-80-DESK"){Recognizer=newSpeechRecognitionEngine(config);Recognizer.SetInputToDefaultAudioDevice();//选择默认的音频输入设备break;}//选择中文的识别引擎}if(Recognizer!=null){InitializeSpeechRecognitionEngine(fg);//初始化语音识别引擎}else{MessageBox.Show("创建语音识别失败");}}//////初始化,加载关键词组//////关键词组privatevoidInitializeSpeechRecognitionEngine(string[]fg){GrammarcustomGrammar=CreateCustomGrammar(fg);//根据关键字数组建立语法Recognizer.UnloadAllGrammars();Recognizer.LoadGrammar(customGrammar);//加载语法}//////开始识别///publicvoidBeginRec(){TurnSpeechRecognitionOn();}//////停止语音识别引擎///publicvoidStopRec(){TurnSpeechRecognitionOff();}//////加载关键词组//////关键词组publicvoidChangeKeywords(string[]fg){InitializeSpeechRecognitionEngine(fg);System.Threading.Thread.Sleep(100);foreach(Grammarginthis.Recognizer.Grammars){Debug.WriteLine("正在听:"+g.Name);}}//////加载关键词组//////关键词组publicvoidChangeKeywords(stringprefix,string[]fg){GrammarBuildergrammarBuilder=newGrammarBuilder(prefix);stringwords=string.Empty;foreach(stringsinfg){words+="("+prefix+s+")";}grammarBuilder.Append(newChoices(fg));//根据关键字数组建立语法Recognizer.UnloadAllGrammars();Recognizer.LoadGrammar(newGrammar(grammarBuilder){Name=words});System.Threading.Thread.Sleep(100);foreach(Grammarginthis.Recognizer.Grammars){Debug.WriteLine("正在听:"+g.Name);}}//////创造自定义语法//////关键词组///publicvirtualGrammarCreateCustomGrammar(string[]fg){GrammarBuildergrammarBuilder=newGrammarBuilder();grammarBuilder.Append(newChoices(fg));stringwords=string.Empty;foreach(stringsinfg){words+="("+s+")";}returnnewGrammar(grammarBuilder){Name=words};}//////启动语音识别函数///privatevoidTurnSpeechRecognitionOn(){if(Recognizer!=null){Recognizer.RecognizeAsync(RecognizeMode.Multiple);//识别模式为连续识别}else{MessageBox.Show("创建语音识别失败");}}//////关闭语音识别函数///privatevoidTurnSpeechRecognitionOff(){if(Recognizer!=null){Recognizer.RecognizeAsyncCancel();}else{MessageBox.Show("创建语音识别失败");}}}}复制代码
主程序调用方法如下:
SRecognitionsr=newSRecognition();sr.Recognizer.SpeechRecognized+=newEventHandler(recognizer_SpeechRecognized);sr.BeginRec();识别出关键词之后的处理函数:
复制代码//////识别出关键字后的处理函数/////////privatevoidrecognizer_SpeechRecognized(objectsender,SpeechRecognizedEventArgse){//识别出的关键词stringtext=e.Result.Text;switch(text){case“欢迎使用中国移动”://根据关键词不同,按不同的按键serialPort1.Write(“atd,1,#; ”);//然后改变引擎所关注的关键词,进行下一步的识别sr.ChangeKeywords(newstring[]{“查询余额”});break;
case"查询余额":serialPort1.Write("atd,2,#; ");sr.ChangeKeywords(newstring[]{"xxx"});break;//以下过程涉及业务逻辑,故省略case"xxx":break;case"yyy":break;default:break;}}复制代码过程如下:
拨通电话
引擎开始识别关键词“欢迎使用中国移动”
"欢迎使用中国移动"识别出后,进行按键1键#号键引擎换关键词“查询服务”
“查询服务”识别出后,进行按键2键#号键
如此一直循环下去,都是按照1xx86的充值顺序进行,一直进行到输入充值卡密码,进行按键,将充值卡密码上送引擎换关键词“充值成功"和"充值失败”
根据识别出的关键词是"充值成功"还是"充值失败",进行记录,录入数据库.
最后挂机,完成.
智能电话机器人,使用Microsoft语音识别技术(Speech sdk)
智能电话机器人原委是这样的,有一个大佬,手里有好多好多,总之就是好多手机充x卡,他想把这些充x卡充值到不同的用户手机号里。有的朋友接触过的,会说“可以和移动去谈,然后搞到移动的接口,根据接口开发程序,然后把充x卡密码都弄进数据库里,用程序读取,之后调用移动接口完成充值。”说得好,漂亮!而且充x卡密码存到数据库里面这件事,大佬已经找人没日没夜加班干活全都录入到数据库里了。
但是事实很悲催,由于各种原因,不能通过移动的接口来做。只能通过1xx86语音电话来做。于是有了这个项目需求。
需求也不复杂,就是需要一个电话机器人,来模拟人工,拨打电话,根据对方说的内容,按对应按键进入指定菜单或者输入一些数据(例如:手机号码、充x卡密码),最后也是最关键的,需要识别出对方说的提示,是成功还是失败来确定操作是否成功,并将操作结果记录在数据库中。
需要做到以下目标:通过编程控制设备完成摘机,拨号等操作,直到拨通某服务电话(例如:1xx86)能够进行语音识别,识别出电话中对方所说的关键词(例如:普通话请按1)根据关键词(例如:普通话)执行不同的拨号操作,例如:按1正确输入所需数据,例如:手机号,和充x卡密码根据对方所说的语音,识别出操作是否成功(例如:充值成功)操作所需数据,以及操作产生的记录信息均存放在数据库中程序要健壮,能应对各种异常情况。例如:语音识别不出,或者不准确,有误判,电话线路质量不好,电话拨不通等等。实现方案根据上述的需求,我发现有两个问题是比较重要的:
采用什么设备来完成拨号,按键等等与1xx86的交互?用什么技术来实现语音识别1xx86那边所说的语音?针对这两个技术问题,我做了一下技术调查,问题1,用什么设备与1xx86交互?
最开始想到的是语音IVR,做了一些调查,但是发现这个东西不是我们需要的。IVR的主要功能是作为一个语音电话的"Server",也就是被叫方,用户拨号进来,IVR播放语音给用户听,然后根据用户的按键实现不同的操作。
也就是说IVR是作为被叫方,做应答的。这显然不是我们需要的,我们需要的是作为"Client",也就是主叫方,去主动拨打1xx86的,然后按键选择不同菜单,或者输入手机号等等信息,不需要播放语音,也不需要识别按键。我们需要的是能够拨号,能够进行按键操作。
综上所述,IVR被PASS。
之后,又想到了一种方案,那就是Modem!!!
什么?你想到了那个会吱吱乱叫的老式拨号56k猫?没错,不过我需要的是一个支持AT命令的可编程Modem.去网上搜了一下,还真有卖这种设备的,他们称之为工业Modem.
说做就做,果断找到销售,购买了一个工业Modem。东西很不起眼,一个铁盒子,上面插口不少:电源AC,串口RS232,话筒MIC,喇叭SPK,电话机PHONE,电话线LINE。
我需要的有串口RS232,喇叭SPK,电话线LINE.
用一根音频线连接Modem的喇叭SPK口和PC机的声卡线路输入LINEIN接口,(这里注意,一定是线路输入LINEIN,不能使用麦克风MIC接口,麦克风接口由于阻抗不匹配,导致接受到的音质非常差,不能使用)
用串口线连接Modem的串口和PC机的串口.
把电话线插在Modem的LINE口上.
接下来打开Modem的电源,用SecureCRT连接串口,敲入些AT命令,看看Modem能否执行.
好,做到这里硬件上的准备工作就算做完了.