C#开发微信门户及应用(12)-使用语音处理

原文:C#开发微信门户及应用(12)-使用语音处理

我们知道,微信最开始就是做语音聊天而使得其更加流行的,因此语音的识别处理自然也就成为微信交流的一个重要途径,微信的开发接口,也提供了对语音的消息请求处理。本文主要介绍如何利用语音的识别,对C#开发的微信门户应用的整个事件链的处理操作,使得在我们的微信账号里面,更加方便和多元化对用户的输入进行处理。

1、微信语音接口的定义0

微信的API这么定义语音的识别的:开通语音识别功能,用户每次发送语音给公众号时,微信会在推送的语音消息XML数据包中,增加一个Recongnition字段

语音的消息格式如下所示。

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1357290913</CreateTime>
<MsgType><![CDATA[voice]]></MsgType>
<MediaId><![CDATA[media_id]]></MediaId>
<Format><![CDATA[Format]]></Format>
<MsgId>1234567890123456</MsgId>
</xml>
参数 描述
ToUserName 开发者微信号
FromUserName 发送方帐号(一个OpenID)
CreateTime 消息创建时间 (整型)
MsgType 语音为voice
MediaId 语音消息媒体id,可以调用多媒体文件下载接口拉取数据。
Format 语音格式,如amr,speex等
MsgID 消息id,64位整型

根据以上微信接口的定义,我们可以定义一个实体类来对消息的传递进行处理,如下所示。

    /// <summary>
    /// 接收的语音消息
    /// </summary>
    [System.Xml.Serialization.XmlRoot(ElementName = "xml")]
    public class RequestVoice : BaseMessage
    {
        public RequestVoice()
        {
            this.MsgType = RequestMsgType.Voice.ToString().ToLower();
        }

        /// <summary>
        /// 语音格式,如amr,speex等
        /// </summary>
        public string Format { get; set; }

        /// <summary>
        /// 语音消息媒体id,可以调用多媒体文件下载接口拉取数据。
        /// </summary>
        public string MediaId { get; set; }

        /// <summary>
        /// 消息ID
        /// </summary>
        public Int64 MsgId { get; set; }

        /// <summary>
        /// 语音识别结果,UTF8编码
        /// </summary>
        public string Recognition  { get; set; }

    }

我们看到,这里我们最感兴趣的是语音的识别结果,也就是Recognition的字段,这个就是微信服务器自动根据用户的语音转换过来的内容,我测试过,识别率还是非常高的。

这个实体类,在整个微信应用的消息传递中的关系如下所示:

2、语音的处理操作

明确了上面的语音对象实体,我们就可以看看它们之间是如何处理的。

微信消息的处理逻辑如下图所示。

其中我们来看看语音的处理操作,我的代码处理逻辑如下所示。

        /// <summary>
        /// 对语音请求信息进行处理
        /// </summary>
        /// <param name="info">语音请求信息实体</param>
        /// <returns></returns>
        public string HandleVoice(Entity.RequestVoice info)
        {
            string xml = "";
            // 开通语音识别功能,用户每次发送语音给公众号时,
            // 微信会在推送的语音消息XML数据包中,增加一个Recongnition字段。
            if (!string.IsNullOrEmpty(info.Recognition))
            {
                TextDispatch dispatch = new TextDispatch();
                xml = dispatch.HandleVoiceText(info, info.Recognition);
            }
            else
            {
                xml = "";
            }

            return xml;
        }

在这里,我先看看,是否获得了微信的语音识别结果,如果获得,那么这个时候,就是和处理用户文本输入的操作差不多了,因此把它转给TextDispatch的处理类进行处理。

其中这里面的处理逻辑如下所示。

首先我根据识别结果,寻找是否用户读出了微信门户的菜单名称,如果根据语音结果找到对应的菜单记录,那么我们执行菜单事件(如果是URL的View类型菜单,我们没办法重定向到指定的链接,因此给出一个链接文本提示,给用户单击进入;如果没有找到菜单记录,那么我们就把语音识别结果作为一般的事件进行处理,如果事件逻辑没有处理,那么我们最后给出一个默认的语音应答提示结果就可以了。

具体的处理代码如下所示。

        /// <summary>
        /// 如果用户用语音读出菜单的内容,那么我们应该先根据菜单对应的事件触发,最后再交给普通事件处理
        /// </summary>
        /// <param name="info"></param>
        /// <returns></returns>
        public string HandleVoiceText(BaseMessage info, string voiceText)
        {
            string xml = "";
            MenuInfo menuInfo = BLLFactory<Menu>.Instance.FindByName(voiceText);
            if (menuInfo != null)
            {
                #region 如果找到菜单对象的处理
                if (menuInfo.Type == "click")
                {
                    //模拟单击事件
                    RequestEventClick eventInfo = new RequestEventClick();
                    eventInfo.CreateTime = info.CreateTime;
                    eventInfo.EventKey = menuInfo.Key;
                    eventInfo.FromUserName = info.FromUserName;
                    eventInfo.ToUserName = info.ToUserName;

                    xml = base.DealEvent(eventInfo, eventInfo.EventKey);
                }
                else
                {
                    //由于无法自动切换到连接,
                    //转换为连接文本供用户进入
                    string content = string.Format("请单击链接进入<a href=\"{0}\">{1}</a> ", menuInfo.Url, menuInfo.Name);

                    ResponseText textInfo = new ResponseText(info);
                    textInfo.Content = content;

                    xml = textInfo.ToXml();
                }
                #endregion
            }
            else
            {
                //交给事件机制处理
                if (string.IsNullOrEmpty(xml))
                {
                    xml = HandleText(info, voiceText);
                }
            }

            //最后如果没有处理到,那么提示用户的语音内容
            if (string.IsNullOrEmpty(xml))
            {
                ResponseText textInfo = new ResponseText(info);
                textInfo.Content = string.Format("非常抱歉,您输入的语音内容没有找到对应的处理方式。您的语音内容为:{0}", voiceText);
                xml = textInfo.ToXml();
            }

            return xml;
        }

微信门户测试界面效果如下所示。

                    

 

为了方便对客户会话的记录,我的微信门户后台,会记录用户的语音输入内容,如下所示。

 当然,微信后台的管理界面,也能够查到相应的语音记录,界面如下所示。

以上就是我对微信语音的消息定义和事件处理的逻辑,其实语音是一个重要的输入,如果正确的识别内容,比手工输入的效果更好,给用户提供另外一种高效的输入和事件处理操作。

这样的处理模式,能够使得我们整个微信门户框架,不管是对于用户的语音输入,还是文本输入,还是菜单事件的处理,都可以融为一体,实现更加完美的衔接。

如果对这个《C#开发微信门户及应用》系列感兴趣,可以关注我的其他文章,系列随笔如下所示:

C#开发微信门户及应用(20)-微信企业号的菜单管理

C#开发微信门户及应用(19)-微信企业号的消息发送(文本、图片、文件、语音、视频、图文消息等)

C#开发微信门户及应用(18)-微信企业号的通讯录管理开发之成员管理

C#开发微信门户及应用(17)-微信企业号的通讯录管理开发之部门管理

C#开发微信门户及应用(16)-微信企业号的配置和使用

C#开发微信门户及应用(15)-微信菜单增加扫一扫、发图片、发地理位置功能

 C#开发微信门户及应用(14)-在微信菜单中采用重定向获取用户数据

C#开发微信门户及应用(13)-使用地理位置扩展相关应用

C#开发微信门户及应用(12)-使用语音处理

C#开发微信门户及应用(11)--微信菜单的多种表现方式介绍

C#开发微信门户及应用(10)--在管理系统中同步微信用户分组信息

C#开发微信门户及应用(9)-微信门户菜单管理及提交到微信服务器

C#开发微信门户及应用(8)-微信门户应用管理系统功能介绍

C#开发微信门户及应用(7)-微信多客服功能及开发集成

C#开发微信门户及应用(6)--微信门户菜单的管理操作

C#开发微信门户及应用(5)--用户分组信息管理

C#开发微信门户及应用(4)--关注用户列表及详细信息管理

C#开发微信门户及应用(3)--文本消息和图文消息的应答

C#开发微信门户及应用(2)--微信消息的处理和应答

C#开发微信门户及应用(1)--开始使用微信接口

 

时间: 2025-01-29 15:47:57

C#开发微信门户及应用(12)-使用语音处理的相关文章

C#开发微信门户及应用(1)--开始使用微信接口

原文:C#开发微信门户及应用(1)--开始使用微信接口 微信应用如火如荼,很多公司都希望搭上信息快车,这个是一个商机,也是一个技术的方向,因此,有空研究下.学习下微信的相关开发,也就成为日常计划的重要事情之一了.本系列文章希望从一个循序渐进的角度上,全面介绍微信的相关开发过程和相关经验总结,希望给大家了解一下相关的开发历程.本随笔主要针对微信开发过程的前期准备和一些初始的工作的介绍. 在写下本文的之前一周时间里,我主要就是参考一些介绍文章以及微信公众平台的相关接口说明,并结合C#的代码开发,整理

C#开发微信门户及应用(26)-公众号微信素材管理

原文:C#开发微信门户及应用(26)-公众号微信素材管理 微信公众号最新修改了素材的管理模式,提供了两类素材的管理:临时素材和永久素材的管理,原先的素材管理就是临时素材管理,永久素材可以永久保留在微信服务器上,微信素材可以在上传后,进行图片文件或者图文消息的发送,关注的公众号可以在素材有效期内查看相关的资源,对于永久素材,那就不会存在过期的问题,只是纯粹数量上限的限制.本文综合两方面进行介绍素材管理的各种接口和实现. 1.素材类型和功能点 关于素材的官方说明: 临时素材: 公众号经常有需要用到一

C#开发微信门户及应用(27)-公众号模板消息管理

原文:C#开发微信门户及应用(27)-公众号模板消息管理 通过模板消息接口,公众号能向关注其账号的用户发送预设模板的消息.模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,如信用卡刷卡通知,商品购买成功通知等.不支持广告等营销类消息以及其它所有可能对用户造成骚扰的消息.本文主要介绍基于C#开发实现公众号模板消息的管理功能. "模板消息功能的推出,将极大地增强服务号的服务通知能力",在一些一直期待微信模板消息功能开放的公众号运营者看来,微信一对一沟通的社交属性

C#开发微信门户及应用(17)-微信企业号的通讯录管理开发之部门管理

原文:C#开发微信门户及应用(17)-微信企业号的通讯录管理开发之部门管理  前面一篇随笔企业号的一些基础信息,以及介绍如何配置企业号的回调方式实现和企业号服务器进行沟通的桥梁.本篇主要还是继续介绍企业号的开发工作的开展,介绍微信企业号通讯录管理开发功能,介绍其中组织机构里面如何获取和管理部门的信息等内容.  1.企业组织的创建和配置 首先我们可以在企业号的管理后台里面创建一个组织机构,里面创建一些部门和人员列表,方便我们开发和使用. 例如创建一个广州爱奇迪的根结构,然后在其中在创建一些组织机构

C#开发微信门户及应用(25)-微信企业号的客户端管理功能

原文:C#开发微信门户及应用(25)-微信企业号的客户端管理功能 我们知道,微信公众号和企业号都提供了一个官方的Web后台,方便我们对微信账号的配置,以及相关数据的管理功能,对于微信企业号来说,有通讯录中的组织架构管理.标签管理.人员管理.以及消息的发送等功能,其中微信企业号的组织架构和标签可以添加相应的人员,消息发送可以包含文本.图片.语音.视频.图文.文件等内容.对于企业号来说,官方的接口几乎可以无限的发送消息,因此构建一个管理后台,管理企业号的人员,以及用来给企业成员发送消息就是一个很好的

C#开发微信门户及应用(8)-微信门户应用管理系统功能介绍

原文:C#开发微信门户及应用(8)-微信门户应用管理系统功能介绍 最近对微信接口进行深入的研究,通过把底层接口一步步进行封装后,逐步升级到自动化配置.自动化应答,以及后台处理界面的优化和完善上,力求搭建一个较为完善.适用的微信门户应用管理系统. 微信门户应用管理系统,采用基于MVC+EasyUI的路线,由于多数域名服务器上都只能支持.NET4.0,所以以MVC3,C#4.0作为开发基础,基本上能够部署在任何.NET服务器上. 在微信门户系统里面,实现下面这些功能操作: 1)实现菜单的动态配置及更

C#开发微信门户及应用(19)-微信企业号的消息发送(文本、图片、文件、语音、视频、图文消息等)

原文:C#开发微信门户及应用(19)-微信企业号的消息发送(文本.图片.文件.语音.视频.图文消息等)  我们知道,企业号主要是面向企业需求而生的,因此内部消息的交流显得非常重要,而且发送.回复消息数量应该很可观,对于大企业尤其如此,因此可以结合企业号实现内部消息的交流.企业号具有关注安全.消息无限制等特点,很适合企业内部的环境.本文主要介绍如何利用企业号实现文本.图片.文件.语音.视频.图文消息等消息的发送操作. 1.企业号特点 对于企业号,有以下一些特点: 1)关注更安全 –只有企业通讯录的

C#开发微信门户及应用(10)--在管理系统中同步微信用户分组信息

原文:C#开发微信门户及应用(10)--在管理系统中同步微信用户分组信息 在前面几篇文章中,逐步从原有微信的API封装的基础上过渡到微信应用平台管理系统里面,逐步介绍管理系统中的微信数据的界面设计,以及相关的处理操作过程的逻辑和代码,希望从更高一个层次,向大家介绍微信的应用开发过程.本篇主要介绍在管理系统中,如何实现微信用户分组信息的同步操作. 其实微信能够风风火火的原因,主要就是因为有用户信息,所以同步并管理好微信账号的关注用户数据是非常重要的.有了微信用户的数据,你可以和你任何应用系统对接,

C#开发微信门户及应用(3)--文本消息和图文消息的应答

原文:C#开发微信门户及应用(3)--文本消息和图文消息的应答 微信应用如火如荼,很多公司都希望搭上信息快车,这个是一个商机,也是一个技术的方向,因此,有空研究下.学习下微信的相关开发,也就成为计划的安排事情之一了.本系列文章希望从一个循序渐进的角度上,全面介绍微信的相关开发过程和相关经验总结,希望给大家了解一下相关的开发历程. 在前面两篇两篇随笔<C#开发微信门户及应用(1)--开始使用微信接口>和<C#开发微信门户及应用(2)--微信消息的处理和应答>里面,大致介绍了我微信应用