我們知道谬擦,微信最開始就是做語(yǔ)音聊天而使得其更加流行的讼育,因此語(yǔ)音的識(shí)別處理自然也就成為微信交流的一個(gè)重要途徑苍碟,微信的開發(fā)接口牺蹄,也提供了對(duì)語(yǔ)音的消息請(qǐng)求處理掐隐。本文主要介紹如何利用語(yǔ)音的識(shí)別,對(duì)C#開發(fā)的微信門戶應(yīng)用的整個(gè)事件鏈的處理操作钞馁,使得在我們的微信賬號(hào)里面虑省,更加方便和多元化對(duì)用戶的輸入進(jìn)行處理。
1僧凰、微信語(yǔ)音接口的定義
微信的API這么定義語(yǔ)音的識(shí)別的:開通語(yǔ)音識(shí)別功能探颈,用戶每次發(fā)送語(yǔ)音給公眾號(hào)時(shí),微信會(huì)在推送的語(yǔ)音消息XML數(shù)據(jù)包中训措,增加一個(gè)Recongnition字段伪节。
語(yǔ)音的消息格式如下所示。
<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>
根據(jù)以上微信接口的定義绩鸣,我們可以定義一個(gè)實(shí)體類來(lái)對(duì)消息的傳遞進(jìn)行處理怀大,如下所示。
/// <summary>
/// 接收的語(yǔ)音消息
/// </summary>
[System.Xml.Serialization.XmlRoot(ElementName = "xml")]
public class RequestVoice : BaseMessage
{
public RequestVoice()
{
this.MsgType = RequestMsgType.Voice.ToString().ToLower();
}
/// <summary>
/// 語(yǔ)音格式呀闻,如amr化借,speex等
/// </summary>
public string Format { get; set; }
/// <summary>
/// 語(yǔ)音消息媒體id,可以調(diào)用多媒體文件下載接口拉取數(shù)據(jù)捡多。
/// </summary>
public string MediaId { get; set; }
/// <summary>
/// 消息ID
/// </summary>
public Int64 MsgId { get; set; }
/// <summary>
/// 語(yǔ)音識(shí)別結(jié)果蓖康,UTF8編碼
/// </summary>
public string Recognition { get; set; }
}
我們看到,這里我們最感興趣的是語(yǔ)音的識(shí)別結(jié)果垒手,也就是Recognition的字段蒜焊,這個(gè)就是微信服務(wù)器自動(dòng)根據(jù)用戶的語(yǔ)音轉(zhuǎn)換過(guò)來(lái)的內(nèi)容,我測(cè)試過(guò)科贬,識(shí)別率還是非常高的泳梆。
這個(gè)實(shí)體類,在整個(gè)微信應(yīng)用的消息傳遞中的關(guān)系如下所示:
2、語(yǔ)音的處理操作
明確了上面的語(yǔ)音對(duì)象實(shí)體优妙,我們就可以看看它們之間是如何處理的乘综。
微信消息的處理邏輯如下圖所示。
其中我們來(lái)看看語(yǔ)音的處理操作鳞溉,我的代碼處理邏輯如下所示瘾带。
/// <summary>
/// 對(duì)語(yǔ)音請(qǐng)求信息進(jìn)行處理
/// </summary>
/// <param name="info">語(yǔ)音請(qǐng)求信息實(shí)體</param>
/// <returns></returns>
public string HandleVoice(Entity.RequestVoice info)
{
string xml = "";
// 開通語(yǔ)音識(shí)別功能鼠哥,用戶每次發(fā)送語(yǔ)音給公眾號(hào)時(shí)熟菲,
// 微信會(huì)在推送的語(yǔ)音消息XML數(shù)據(jù)包中,增加一個(gè)Recongnition字段朴恳。
if (!string.IsNullOrEmpty(info.Recognition))
{
TextDispatch dispatch = new TextDispatch();
xml = dispatch.HandleVoiceText(info, info.Recognition);
}
else
{
xml = "";
}
return xml;
}
在這里抄罕,我先看看,是否獲得了微信的語(yǔ)音識(shí)別結(jié)果于颖,如果獲得呆贿,那么這個(gè)時(shí)候,就是和處理用戶文本輸入的操作差不多了森渐,因此把它轉(zhuǎn)給TextDispatch的處理類進(jìn)行處理做入。
其中這里面的處理邏輯如下所示。
首先我根據(jù)識(shí)別結(jié)果同衣,尋找是否用戶讀出了微信門戶的菜單名稱竟块,如果根據(jù)語(yǔ)音結(jié)果找到對(duì)應(yīng)的菜單記錄,那么我們執(zhí)行菜單事件(如果是URL的View類型菜單耐齐,我們沒辦法重定向到指定的鏈接浪秘,因此給出一個(gè)鏈接文本提示,給用戶單擊進(jìn)入埠况;如果沒有找到菜單記錄耸携,那么我們就把語(yǔ)音識(shí)別結(jié)果作為一般的事件進(jìn)行處理,如果事件邏輯沒有處理辕翰,那么我們最后給出一個(gè)默認(rèn)的語(yǔ)音應(yīng)答提示結(jié)果就可以了夺衍。
具體的處理代碼如下所示。
/// <summary>
/// 如果用戶用語(yǔ)音讀出菜單的內(nèi)容喜命,那么我們應(yīng)該先根據(jù)菜單對(duì)應(yīng)的事件觸發(fā)刷后,最后再交給普通事件處理
/// </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 如果找到菜單對(duì)象的處理
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
{
//由于無(wú)法自動(dòng)切換到連接,
//轉(zhuǎn)換為連接文本供用戶進(jìn)入
string content = string.Format("請(qǐng)單擊鏈接進(jìn)入<a href=\"{0}\">{1}</a> ", menuInfo.Url, menuInfo.Name);
ResponseText textInfo = new ResponseText(info);
textInfo.Content = content;
xml = textInfo.ToXml();
}
#endregion
}
else
{
//交給事件機(jī)制處理
if (string.IsNullOrEmpty(xml))
{
xml = HandleText(info, voiceText);
}
}
//最后如果沒有處理到渊抄,那么提示用戶的語(yǔ)音內(nèi)容
if (string.IsNullOrEmpty(xml))
{
ResponseText textInfo = new ResponseText(info);
textInfo.Content = string.Format("非常抱歉尝胆,您輸入的語(yǔ)音內(nèi)容沒有找到對(duì)應(yīng)的處理方式。您的語(yǔ)音內(nèi)容為:{0}", voiceText);
xml = textInfo.ToXml();
}
return xml;
}
微信門戶測(cè)試界面效果如下所示护桦。
為了方便對(duì)客戶會(huì)話的記錄含衔,我的微信門戶后臺(tái),會(huì)記錄用戶的語(yǔ)音輸入內(nèi)容,如下所示贪染。
當(dāng)然缓呛,微信后臺(tái)的管理界面,也能夠查到相應(yīng)的語(yǔ)音記錄杭隙,界面如下所示哟绊。
以上就是我對(duì)微信語(yǔ)音的消息定義和事件處理的邏輯,其實(shí)語(yǔ)音是一個(gè)重要的輸入痰憎,如果正確的識(shí)別內(nèi)容票髓,比手工輸入的效果更好,給用戶提供另外一種高效的輸入和事件處理操作铣耘。
這樣的處理模式洽沟,能夠使得我們整個(gè)微信門戶框架,不管是對(duì)于用戶的語(yǔ)音輸入蜗细,還是文本輸入裆操,還是菜單事件的處理,都可以融為一體炉媒,實(shí)現(xiàn)更加完美的銜接踪区。
如果對(duì)這個(gè)《C#開發(fā)微信門戶及應(yīng)用》系列感興趣,可以關(guān)注我的其他文章