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

接上文

  现在,硬件上的准备工作做完了.

  下一步,先打开Modem的电源,用SecureCRT连接串口,敲入些AT命令,看看Modem能否执行.

  这里简单说一下AT命令:

    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("创建语音识别失败");
}

  然后进行初始化,加载关键词

/// <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();
}

  上述简单介绍了识别引擎的使用过程,我将此过程封装为一个类,方便主程序调用

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
    {
        /// <summary>
        /// 语音识别引擎
        /// </summary>
        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<SpeechRecognizedEventArgs>(recognizer_SpeechRecognized);
sr.BeginRec();

  识别出关键词之后的处理函数:

/// <summary>
/// 识别出关键字后的处理函数
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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的充值顺序进行,一直进行到输入充值卡密码,进行按键,将充值卡密码上送 引擎换关键词 "充值成功"和"充值失败"

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

  最后挂机,完成.

  

时间: 2024-10-13 17:27:33

智能电话机器人,使用Microsoft语音识别技术(Speech sdk)(下)的相关文章

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

最近公司接手到了一个有挑战的项目,很有意思,拿出来和大家分享下,交流下开发过程中的一些收获和感悟. 智能电话机器人 原委是这样的,有一个大佬,手里有好多好多,总之就是好多手机充x卡,他想把这些充x卡充值到不同的用户手机号里.有的朋友接触过的,会说“可以和移动去谈,然后搞到移动的接口,根据接口开发程序,然后把充x卡密码都弄进数据库里,用程序读取,之后调用移动接口完成充值.” 说得好,漂亮!而且充x卡密码存到数据库里面这件事,大佬已经找人没日没夜加班干活全都录入到数据库里了. 但是事实很悲催,由于各

Microsoft Speech SDK开发包 使用

下载开发包.我们首先从微软的官网上面下载开发包,下载地址如下: http://www.microsoft.com/en-us/download/details.aspx?id=10121我们主要下载三个关键的程序:SpeechSDK51.exe . msttss22L.exe.SpeechSDK51LangPack.exe,将这三个下载下来即可.   安装sdk.分别将下载的三个安装包解压安装就可以了(记住安装目录).   环境配置.这里我们需要将您安装的Microsoft Speech SDK

百度语音识别开放平台SDK使用方法

百度Android语音识别SDK分在线与离线两种,这篇文章介绍在线SDK的使用方法. 在线SDK是以JAR包和动态链接库形式发布和使用,可以从百度开放云平台网站中下载SDK及使用说明文档. http://developer.baidu.com/wiki/index.php?title=docs/cplat/media/voice 完成语音SDK的集成分以下几步,本文将一步步介绍SDK集成方法. 1.注册开放开放平台 点击管理控制台,选择移动应用管理 选择创建应用,填写应用名称     可以看到右

语音识别技术

通过谷歌语音接口的实现语音识别 最近在项目中有需要实现语音识别的功能.折腾了几天才搞好.刚开始做的时候没点头绪 ,网上找的资料都是乱七八糟的,要不就是非常古老的实现方法,一些简单的代码片段.所以我决定把我的经验分享给大家. 要在IOS中实现语音识别流程如下: 录音->pcm格式->转换wav->转换flac->向谷歌发送请求->等待返回的json数据->解析数据; 首先如果你要使用谷歌的接口实现语音识别必须知道下面着几点: 1.如何发送POST请求.(可以使用开源库AS

语音识别技术简介

在人际交往中,言语是最自然并且最直接的方式之一.随着技术的进步,越来越多的人们也期望计算机能够具备与人进行言语沟通的能力,因此,语音识别这一技术也越来越受到关注.尤其,随着深度学习技术应用在语音识别技术中,使得语音识别的性能得到了显著提升,也使得语音识别技术的普及成为了现实. 以上是废话,下面开始正文. 自动语音识别技术,简单来说其实就是利用计算机将语音信号自动转换为文本的一项技术.这项技术同时也是机器理解人类言语的第一个也是很重要的一个过程. 为了进一步解释计算机如何实现语音到文字的转换这一过

开发人工智能电话机器人必须掌握的语言,Python

要说近几年科技圈什么最火热,无疑就是人工智能,各大科技公司纷纷投入这个浪潮之中,很多从事的是毫不相关的行业的企业也投入到了人工智能的开发与应用中,也想在里面分得一勺半羹.------------------提及人工智能,就不得不说到和他息息相关的开发工具,python就是最接近AI的预言之一.总所周知,机器学习和深度学习是开发人工智能两个非常重要的模块,而 Python拥有keras.Numpy.matplotlib.sklearn.等大量的库,像matplotlib.sklearn.panda

基于DNN-HMM的语音识别技术

基于DNN-HMM的语音识别声学模型结构如下图所示,与传统的基于GMM-HMM的声学模型相比,唯一不同点在于用DNN替换了GMM来对输入语音信号的观察概率进行建模.DNN与GMM相比具有如下优点: DNN不需要对声学特征所服从的分布进行假设: DNN的输入可以采用连续的拼接帧,因而可以更好地利用上下文的信息: DNN的训练过程可以采用随机优化算法来实现,而不是采用传统的批优化算法,因此当训练数据规模较大时也能进行非常高效的训练,显然,训练数据规模越大,所得到的声学模型就越精确,也就越有利于提高语

【转】常用 Microsoft .NET Framework 各版本下載網址列表

研究] 常用 Microsoft .NET Framework 各版本下載網址列表 2014-05-23 僅列常用的 (IA64, Beta, hotfix, ... 不列) Microsoft .NET Framework 1.0 Microsoft .NET Framework Redistributable 1.0 - 中文(繁體)(20.5 MB)http://www.microsoft.com/zh-tw/download/details.aspx?id=96支援 Windows 98

Microsoft speech sdk 5.1 text to speech

//用于将文字转化成的语音保存成本地的pcm文件 long CPlugin14Ctrl::OnSpeak(LPCTSTR uContents, long uVolume) { // TODO: Add your dispatch handler code here CString cStr=uContents ; //AfxMessageBox(cStr); //COM初始化: CComPtr<ISpVoice> m_cpVoice; HRESULT hr = m_cpVoice.CoCrea