C#開發(fā)微信門戶及應(yīng)用(12)-使用語(yǔ)音處理

我們知道谬擦,微信最開始就是做語(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>
Paste_Image.png

根據(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)注我的其他文章

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末吊骤,一起剝皮案震驚了整個(gè)濱河市缎岗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌水援,老刑警劉巖密强,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蜗元,居然都是意外死亡或渤,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門奕扣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)薪鹦,“玉大人,你說(shuō)我怎么就攤上這事惯豆〕卮牛” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵楷兽,是天一觀的道長(zhǎng)地熄。 經(jīng)常有香客問(wèn)我,道長(zhǎng)芯杀,這世上最難降的妖魔是什么端考? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任雅潭,我火速辦了婚禮,結(jié)果婚禮上却特,老公的妹妹穿的比我還像新娘扶供。我一直安慰自己,他們只是感情好裂明,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布椿浓。 她就那樣靜靜地躺著,像睡著了一般闽晦。 火紅的嫁衣襯著肌膚如雪扳碍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天尼荆,我揣著相機(jī)與錄音左腔,去河邊找鬼唧垦。 笑死捅儒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的振亮。 我是一名探鬼主播巧还,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼坊秸!你這毒婦竟也來(lái)了麸祷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤褒搔,失蹤者是張志新(化名)和其女友劉穎阶牍,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體星瘾,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡走孽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了琳状。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片磕瓷。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖念逞,靈堂內(nèi)的尸體忽然破棺而出困食,到底是詐尸還是另有隱情,我是刑警寧澤翎承,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布硕盹,位于F島的核電站,受9級(jí)特大地震影響叨咖,放射性物質(zhì)發(fā)生泄漏瘩例。R本人自食惡果不足惜待讳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望仰剿。 院中可真熱鬧创淡,春花似錦、人聲如沸南吮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)部凑。三九已至露乏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間涂邀,已是汗流浹背瘟仿。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留比勉,地道東北人劳较。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像浩聋,于是被迫代替她去往敵國(guó)和親观蜗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容