本篇讲解微信客户端向公众号发送语音的处理方式。
语音消息常见应用:
在线翻译,不同语言之间的翻译;
代替文本输入方式;
语音处理,比如变更声调、插入或剪辑语音片段等;
收集客户的语音教学或说书录音,打造自己的在线语音教学等等。
反正是能对语音做处理的,你都能做,只要你有足够的语音处理知识。
用户发送的图片,经微信服务器处理后,形成如下XML格式发到你的服务器:
1357290913 1234567890123456
上面信息中各个关键字解释如下:
注意,开通语音识别后,用户每次发送语音给公众号时,微信会在推送的语音消息XML数据包中,增加一个Recognition字段,内容是微信服务器对语音翻译后的文字(注:由于客户端缓存,开发者开启或者关闭语音识别功能,对新关注者立刻生效,对已关注用户需要24小时生效。开发者可以重新关注此帐号进行测试)。开启语音识别后的语音XML数据包如下:
微信公众号开通语音识别功能操作截图如下:
开启后微信服务器发送的xml消息格式如下:
在接收到微信服务器发来的内容之后,首先由指定的接口网页AccessWx.aspx对信息类型进行判别,然后交给指定的消息处理类处理和回应。在本系列文章第1篇介绍的AccessWx.aspx.cs中完善下面这一段,增加本篇给出的语音消息处理环节。
else if(MsgType == "voice")
{
//对用户发送的语音消息处理,使用QinMing.Weixin.MessageHandlerVoice命名空间下的VoiceMessageDeal类
VoiceMessageDeal imd = new VoiceMessageDeal();
Response.Write(imd.DealResult(weixinXML));
}
在命名空间QinMing.Weixin.MessageHandlerVoice下新建一个类VoiceMessageDeal,用来处理微信服务器发来的语音消息。记得类源码文件要放在App_Code目录下!
QinMingWeixinMessageHandlerVoice.cs文件内容如下:
using System;
using System.Web;
using System.Xml;
using System.Text;
using System.IO;
using System.Drawing;
using System.Drawing.Imaging;
using System.Net;
using QinMing.Config;
using QinMing.Weixin.ReturnContent;
using QinMing.WeixinContainer;
//using QinMing.WeixinSendTemplateMessage;
//using QinMing.Tools;
namespace QinMing.Weixin.MessageHandlerVoice
{
//图片消息处理
public class VoiceMessageDeal :System.Web.UI.Page
{
public string DealResult(string weixinXML)
{
string content = DealVoice(weixinXML);
return content;
}
public string DealVoice(string weixinXML)
{
XmlDocument doc = new XmlDocument();
doc.LoadXml(weixinXML);
XmlNodeList list = doc.GetElementsByTagName("xml");
XmlNode xn = list[0];
string FromUserName = xn.SelectSingleNode("//FromUserName").InnerText; //关注用户的加密后openid
string ToUserName = xn.SelectSingleNode("//ToUserName").InnerText; //公众微信号原始ID
string MsgType = xn.SelectSingleNode("//MsgType").InnerText;
string MediaId = xn.SelectSingleNode("//MediaId").InnerText.ToString().Trim();
string Format = xn.SelectSingleNode("//Format").InnerText.ToString().Trim();
string Recognition = xn.SelectSingleNode("//Recognition").InnerText.ToString().Trim();
string strresponse = "";
//保存用户发来的语音文件,并把发送记录写入数据库用于后期分析
DownloadFileByMediaId(FromUserName, MediaId, Format);
//引用QinMing.Weixin.ReturnContent命名空间下的ReturnMsg类来生成固定格式的回应消息
ReturnMsg rm = new ReturnMsg();
strresponse = rm.ReturnText(FromUserName, ToUserName, "您刚发的语音翻译后的文字为:" + Recognition);
//strresponse = rm.ReturnVoice(FromUserName, ToUserName, MediaId); //向微信用户发送其自己发的语音内容
//告知客服人员有新的留言,或者启动客服消息管理工单流程
//QinMingWeixinSendTemplateMessage SendTempMsg = new QinMingWeixinSendTemplateMessage();
//SendTempMsg.SendTempMsgRemind("管理员的openid", "客户发送语音内容:" + Recognition, "");
return strresponse;
}
//使用MediaId加基础access_token从微信服务器下载语音文件
public void DownloadFileByMediaId(string FromUserName, string MediaId, string Format)
{
//获取普通基础access_token
QinMingWeixinContainer wc = new QinMingWeixinContainer();
string access_token = wc.GetAccessToken();
string imgurl = "";
string TmpDir = "E:\web\Voice\Upload\";
string TmpFileName = FromUserName + DateTime.Now.Ticks.ToString() + "." + Format;
//从微信服务器下载语音文件到本地
string strUrl = "https://api.weixin.qq.com/cgi-bin/media/get?access_token=" + access_token + "&media_id=" + MediaId;
System.Net.WebClient webClient = new System.Net.WebClient();
webClient.DownloadFile(strUrl, TmpDir + TmpFileName);
//QinMingTools.WriteLog("用mediaid从微信服务器获取语音", strUrl);
//此处可以添加用户发送语音保存到数据库记录处理,用于对粉丝进行行为分析,以及使用客户发送的语音文件
}
}
}
演示结果如下:



