我們知道,微信最開始就是做語音聊天而使得其更加流行的,因此語音的識別處理自然也就成為微信交流的一個重要途徑,微信的開發(fā)接口,也提供了對語音的消息請求處理。本文主要介紹如何利用語音的識別,對C#開發(fā)的微信門戶應(yīng)用的整個事件鏈的處理操作,使得在我們的微信帳號裡面,更加方便和多元化對用戶的輸入進行處理。
1、微信語音介面的定義0
微信的API這麼定義語音的辨識的:開通語音辨識功能,用戶每次發(fā)送語音給公眾號時,微信會在推送的語音訊息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>
參數(shù) | 描述 |
---|---|
ToUserName | OpenID) |
訊息創(chuàng)建時間(整數(shù)) | |
語音為voice | |
語音訊息媒體id,可呼叫多媒體檔案下載介面拉取資料。 | |
語音格式,如amr,speex等 | |
訊息id,64位元整型 | MsgID |
MsgID | 訊息id,64位元整型 |
根據(jù)以上微信接口的定義,我們可以定義一個實體類來對消息的傳遞進行處理,如下所示。
????///?<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,可以調(diào)用多媒體文件下載接口拉取數(shù)據(jù)。????????///?</summary> ????????public?string?MediaId?{?get;?set;?}?? ????????///?<summary> ????????///?消息ID????????///?</summary> ????????public?Int64?MsgId?{?get;?set;?}????????///?<summary> ????????///?語音識別結(jié)果,UTF8編碼????????///?</summary> ????????public?string?Recognition??{?get;?set;?} ????}
我們看到,這里我們最感興趣的是語音的識別結(jié)果,也就是Recognition的字段,這個就是微信服務(wù)器自動根據(jù)用戶的語音轉(zhuǎn)換過來的內(nèi)容,我測試過,識別率還是非常高的。
這個實體類,在整個微信應(yīng)用的消息傳遞中的關(guān)系如下所示:
2、語音的處理操作
明確了上面的語音對象實體,我們就可以看看它們之間是如何處理的。
微信消息的處理邏輯如下圖所示。
其中我們來看看語音的處理操作,我的代碼處理邏輯如下所示。
????????///?<summary> ????????///?對語音請求信息進行處理????????///?</summary> ????????///?<param name="info">語音請求信息實體</param> ????????///?<returns></returns> ????????public?string?HandleVoice(Entity.RequestVoice?info) ????????{????????????string?xml?=?"";????????????//?開通語音識別功能,用戶每次發(fā)送語音給公眾號時,????????????//?微信會在推送的語音消息XML數(shù)據(jù)包中,增加一個Recongnition字段。 ????????????if?(!string.IsNullOrEmpty(info.Recognition)) ????????????{ ????????????????TextDispatch?dispatch?=?new?TextDispatch(); ????????????????xml?=?dispatch.HandleVoiceText(info,?info.Recognition); ????????????}????????????else ????????????{ ????????????????xml?=?""; ????????????}????????????return?xml; ????????}
在這里,我先看看,是否獲得了微信的語音識別結(jié)果,如果獲得,那么這個時候,就是和處理用戶文本輸入的操作差不多了,因此把它轉(zhuǎn)給TextDispatch的處理類進行處理。
其中這里面的處理邏輯如下所示。
首先我根據(jù)識別結(jié)果,尋找是否用戶讀出了微信門戶的菜單名稱,如果根據(jù)語音結(jié)果找到對應(yīng)的菜單記錄,那么我們執(zhí)行菜單事件(如果是URL的View類型菜單,我們沒辦法重定向到指定的鏈接,因此給出一個鏈接文本提示,給用戶單擊進入;如果沒有找到菜單記錄,那么我們就把語音識別結(jié)果作為一般的事件進行處理,如果事件邏輯沒有處理,那么我們最后給出一個默認的語音應(yīng)答提示結(jié)果就可以了。
具體的處理代碼如下所示。
????????///?<summary> ????????///?如果用戶用語音讀出菜單的內(nèi)容,那么我們應(yīng)該先根據(jù)菜單對應(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?如果找到菜單對象的處理????????????????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 ????????????????{????????????????????//由于無法自動切換到連接,????????????????????//轉(zhuǎn)換為連接文本供用戶進入 ????????????????????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); ????????????????} ????????????}????????????//最后如果沒有處理到,那么提示用戶的語音內(nèi)容 ????????????if?(string.IsNullOrEmpty(xml)) ????????????{ ????????????????ResponseText?textInfo?=?new?ResponseText(info); ????????????????textInfo.Content?=?string.Format("非常抱歉,您輸入的語音內(nèi)容沒有找到對應(yīng)的處理方式。您的語音內(nèi)容為:{0}",?voiceText);????????????????xml?=?textInfo.ToXml(); ????????????}????????????return?xml; ????????}
微信門戶測試界面效果如下所示。
? ? ? ? ? ? ? ? ?
? ?
?
為了方便對客戶會話的記錄,我的微信門戶后臺,會記錄用戶的語音輸入內(nèi)容,如下所示。
?當然,微信后臺的管理界面,也能夠查到相應(yīng)的語音記錄,界面如下所示。
以上就是我對微信語音的消息定義和事件處理的邏輯,其實語音是一個重要的輸入,如果正確的識別內(nèi)容,比手工輸入的效果更好,給用戶提供另外一種高效的輸入和事件處理操作。
這樣的處理模式,能夠使得我們整個微信門戶框架,不管是對于用戶的語音輸入,還是文本輸入,還是菜單事件的處理,都可以融為一體,實現(xiàn)更加完美的銜接。
更多C#開發(fā)微信門戶及應(yīng)用-使用語音處理?相關(guān)文章請關(guān)注PHP中文網(wǎng)!

熱AI工具

Undress AI Tool
免費脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)