智能电话机器人,使用Microsoft语音识别技术(Speech sdk)

196 篇文章 2 订阅
184 篇文章 1 订阅

AT命令有两种解释一种是调制解调器命令语言,简单来说就是一些固定格式的字符串,我们通过串口向Modem发送AT命令的字符串,Modem就会按照

命令去执行不同的操作.AT命令的百度百科请看这里,具体的命令格式和使用方法请自行百度.

我们先来试试拨号

向串口发送命令 : atdt10086;\r

不出意外的话Modem就会摘机,并发出拨号音,然后就会听到10086的语音了.

然后是按键交互

比如我要按 1键 然后按 #号键则

按键命令 : atd,1,#;\r

逗号的作用是延时,让多个按键之间有些间隔,防止对方识别不清

然后是挂机

挂机的命令是 : ath;\r

发送这个命令,Modem就执行挂机动作了.

这些基本动作都可以完成之后,下面就进入第二个问题了:

用什么技术来实现语音识别1xx86那边所说的语音?

这里我经过一段时间的技术调查,最终决定使用微软Windows 7 自带的语音识别引擎

这个引擎有两种识别模式,第一种是自由识别,这种方式每当引擎识别出任意一段文字之后便会触发识别事件SpeechRecognized

另一种方式是关键词识别,这种方式只有引擎识别出的文字符合关键词,才会触发识别事件SpeechRecognized

我们采用关键词模式进行识别,根据1xx86语音播报的不同关键词,来按不同的按键,完成功能.

这个功能在控制面板里可以看到 控制面板 -> 轻松访问 -> 语音识别

.Net 有对应的类库可以调用,命名空间如下:

using System.Speech.Recognition;
using System.Speech.Synthesis;

引擎使用方法:

首先,创建语音识别引擎,设置音频输入设备

复制代码
CultureInfo myCIintl = new CultureInfo(“zh-CN”);
foreach (RecognizerInfo config in SpeechRecognitionEngine.InstalledRecognizers())//获取所有语音引擎
{
if (config.Culture.Equals(myCIintl) && config.Id == “MS-2052-80-DESK”)
{
Recognizer = new SpeechRecognitionEngine(config);
Recognizer.SetInputToDefaultAudioDevice();//选择默认的音频输入设备
break;
}//选择中文的识别引擎
}
if (Recognizer != null)
{
InitializeSpeechRecognitionEngine(fg);//初始化语音识别引擎
}
else
{
MessageBox.Show(“创建语音识别失败”);
}
复制代码
  然后进行初始化,加载关键词

复制代码
///
/// 初始化,加载关键词组
///
/// 关键词组
private void InitializeSpeechRecognitionEngine(string[] fg)
{
Grammar customGrammar = CreateCustomGrammar(fg);
//根据关键字数组建立语法
Recognizer.UnloadAllGrammars();
Recognizer.LoadGrammar(customGrammar);
//加载语法
}
复制代码
  然后开始识别

复制代码
///
/// 开始识别
///
public void BeginRec()
{
TurnSpeechRecognitionOn();
}
复制代码
  上述简单介绍了识别引擎的使用过程,我将此过程封装为一个类,方便主程序调用

复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Speech;
using System.Speech.Recognition;
using System.Globalization;
using System.Windows.Forms;

using System.Speech.Synthesis;
using System.Diagnostics;

namespace Sp10086
{
public class SRecognition
{
///
/// 语音识别引擎
///
public SpeechRecognitionEngine Recognizer { get; set; }

    //重载构造函数
    public SRecognition() : this(new string[]{" "})
    {
        
    }
    public SRecognition(string[] fg) //创建关键词语列表
    {
        CultureInfo myCIintl = new CultureInfo("zh-CN");
        foreach (RecognizerInfo config in SpeechRecognitionEngine.InstalledRecognizers())//获取所有语音引擎
        {
            if (config.Culture.Equals(myCIintl) && config.Id == "MS-2052-80-DESK")
            {
                Recognizer = new SpeechRecognitionEngine(config);
                Recognizer.SetInputToDefaultAudioDevice();//选择默认的音频输入设备
                break;
            }//选择中文的识别引擎
        }
        if (Recognizer != null)
        {
            InitializeSpeechRecognitionEngine(fg);//初始化语音识别引擎
        }
        else
        {
            MessageBox.Show("创建语音识别失败");
        }
    }
    /// <summary>
    /// 初始化,加载关键词组
    /// </summary>
    /// <param name="fg">关键词组</param>
    private void InitializeSpeechRecognitionEngine(string[] fg)
    {
        Grammar customGrammar = CreateCustomGrammar(fg);
        //根据关键字数组建立语法
        Recognizer.UnloadAllGrammars();
        Recognizer.LoadGrammar(customGrammar);
        //加载语法
    }
    /// <summary>
    /// 开始识别
    /// </summary>
    public void BeginRec()
    {
        TurnSpeechRecognitionOn();
    }
    /// <summary>
    /// 停止语音识别引擎
    /// </summary>
    public void StopRec()
    {
        TurnSpeechRecognitionOff();
    }
    /// <summary>
    /// 加载关键词组
    /// </summary>
    /// <param name="fg">关键词组</param>
    public void ChangeKeywords(string[] fg)
    {
        InitializeSpeechRecognitionEngine(fg);

        System.Threading.Thread.Sleep(100);

        foreach(Grammar g in this.Recognizer.Grammars)
        {
            Debug.WriteLine("正在听:" + g.Name);
        }
    }
    /// <summary>
    /// 加载关键词组
    /// </summary>
    /// <param name="fg">关键词组</param>
    public void ChangeKeywords(string prefix, string[] fg)
    {
        GrammarBuilder grammarBuilder = new GrammarBuilder(prefix);
        string words = string.Empty;
        foreach (string s in fg)
        {
            words += "(" + prefix + s + ")";
        }
        grammarBuilder.Append(new Choices(fg));
        //根据关键字数组建立语法
        Recognizer.UnloadAllGrammars();
        Recognizer.LoadGrammar(new Grammar(grammarBuilder) { Name = words });

        System.Threading.Thread.Sleep(100);
        foreach (Grammar g in this.Recognizer.Grammars)
        {
            Debug.WriteLine("正在听:" + g.Name);
        }
    }
    /// <summary>
    /// 创造自定义语法
    /// </summary>
    /// <param name="fg">关键词组</param>
    /// <returns></returns>
    public virtual Grammar CreateCustomGrammar(string[] fg)
    {
        GrammarBuilder grammarBuilder = new GrammarBuilder();
        grammarBuilder.Append(new Choices(fg));

        string words = string.Empty;
        foreach (string s in fg)
        {
            words += "("+s+")";
        }
        return new Grammar(grammarBuilder) { Name = words };
    }
    /// <summary>
    /// 启动语音识别函数
    /// </summary>
    private void TurnSpeechRecognitionOn()
    {
        if (Recognizer != null)
        {
            Recognizer.RecognizeAsync(RecognizeMode.Multiple); 
            //识别模式为连续识别
        }
        else
        {
            MessageBox.Show("创建语音识别失败");
        }
    }
    /// <summary>
    /// 关闭语音识别函数
    /// </summary>
    private void TurnSpeechRecognitionOff()
    {
        if (Recognizer != null)
        {
            Recognizer.RecognizeAsyncCancel();
        }
        else
        {
            MessageBox.Show("创建语音识别失败");
        }
    }
    
}


}
复制代码

主程序调用方法如下:

SRecognition sr = new SRecognition();
sr.Recognizer.SpeechRecognized += new EventHandler(recognizer_SpeechRecognized);
sr.BeginRec();
  识别出关键词之后的处理函数:

复制代码
///
/// 识别出关键字后的处理函数
///
///
///
private void recognizer_SpeechRecognized(object sender, SpeechRecognizedEventArgs e)
{
//识别出的关键词
string text = e.Result.Text;
switch (text)
{
case “欢迎使用中国移动”:
//根据关键词不同,按不同的按键
serialPort1.Write(“atd,1,#;\r”);
//然后改变引擎所关注的关键词,进行下一步的识别
sr.ChangeKeywords(new string[] { “查询余额” });
break;

    case "查询余额":
        serialPort1.Write("atd,2,#;\r");
        sr.ChangeKeywords(new string[] { "xxx" });
        break;
    //以下过程涉及业务逻辑,故省略
    case "xxx":
        break;
    case "yyy":
        break;
    default:
        break;
}
  过程如下:

拨通电话

引擎开始识别 关键词 “欢迎使用中国移动”

"欢迎使用中国移动"识别出后,进行按键 1键 #号键 引擎换关键词 “查询服务”

“查询服务” 识别出后,进行按键 2键 #号键

如此一直循环下去,都是按照1xx86的充值顺序进行,一直进行到输入充值卡密码,进行按键,将充值卡密码上送 引擎换关键词 “充值成功"和"充值失败”

根据识别出的关键词 是"充值成功"还是"充值失败",进行记录,录入数据库.

最后挂机,完成.
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值