10分鍾教你打造一個微信語音點歌系統


    最近在做一個微信項目,接觸到了微信公眾平台。通過公眾平台可以很方便的搭建一個功能完善的移動應用。昨天發現:開發者可使用手機號來申請接口測試帳號,體驗高級接口。

   這篇文章的應用將使用到高級接口中的語音識別,以及音樂回復接口。通過這兩個接口,讓大家體驗一下語音點歌的魅力。

   這個應用簡單的來說:就是你向微信公眾平台報一首歌名,微信公眾平台返回這首歌曲給你聽。本文將一步一步教你如何實現這個看似復雜的移動應用。

  下面是我申請的測試賬號的二維碼,大家可以關注一下測試一下效果,不過測試賬號的有效期只有一年,最多只能有20個關注者。

另外一個是我個人的訂閱號,有更多的功能,沒有人數限制,但是不能識別語音。說了這么多,不如自己動動手吧。

首先申請測試賬號和百度的bae雲平台:

微信公眾平台測試賬號具體見:http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

百度bae見:http://developer.baidu.com/bae/

相關配置:

申請完成之后,進行相關的配置:

1、在bae上創建應用並申請域名

2、下載公眾平台的php演示代碼,並上傳到bae上

3、調整php代碼,並配置接口

然后准備一下音樂的api:

在網上找到了百度的一個私有的音樂api。具體見:

http://blog.csdn.net/leixiaohua1020/article/details/12927707

接着開始編碼:

1、我們先了解一下用到的微信語音識別接口

 

 

我們將語音發送給微信服務器,微信服務器會將語音轉換成文字。我們拿到文字之后調用音樂api獲取音樂,然后通過微信的被動回復中的回復音樂消息將音樂返回給客戶端。

代碼如下:(此代碼可以直接上傳到你的百度bae平台,只需要修改token就可以了

<?php

    define("TOKEN", "yourtoken");
    $wechatObj = new wechatCallbackapiTest();
   // $wechatObj->valid();
    $wechatObj->responseMsg();
    class wechatCallbackapiTest
    {
        public function valid()
        {
            $echoStr = $_GET["echostr"];
            //valid signature , option
            if($this->checkSignature()){
                echo $echoStr;
                exit;
            }
        }

        public function responseMsg()
        {
            //獲取post數據
            $postStr =    $GLOBALS["HTTP_RAW_POST_DATA"];
            //解析post數據
            if (!empty($postStr)){

                $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
                $type= $postObj->MsgType;
                switch($type)
                {

                    case "voice";
                        $resultStr=  $this->getMusicContent($postObj);   
                        echo   $resultStr;
                        exit;  
                        break;
                }
            }
     
        }

        private function checkSignature()
        {
            $signature = $_GET["signature"];
            $timestamp = $_GET["timestamp"];
            $nonce = $_GET["nonce"];    

            $token = TOKEN;
            $tmpArr = array($token, $timestamp, $nonce);
            sort($tmpArr);
            $tmpStr = implode( $tmpArr );
            $tmpStr = sha1( $tmpStr );

            if( $tmpStr == $signature ){
                return true;
            }else{
                return false;
            }
        }
        
       public  function getMusicContent($postObj)
        {        
            $ret=   "<xml>
            <ToUserName><![CDATA[%s]]></ToUserName>
            <FromUserName><![CDATA[%s]]></FromUserName>
            <CreateTime>%s</CreateTime>
            <MsgType><![CDATA[music]]></MsgType>
            <Music>
            <Title><![CDATA[%s]]></Title>
            <Description><![CDATA[]]></Description>
            <MusicUrl><![CDATA[%s]]></MusicUrl>
            <HQMusicUrl><![CDATA[%s]]></HQMusicUrl>
            <FuncFlag><![CDATA[1]]></FuncFlag>
            </Music>    
            </xml>";
            $recognition=$postObj->Recognition;  
            $keywordc= urlencode($recognition); 
            $musicapi =  "http://box.zhangmen.baidu.com/x?op=12&count=1&title={$keywordc}\$\$";  
            $simstr=file_get_contents($musicapi);
            $musicobj=simplexml_load_string($simstr);
            $i=0;
            $musicurl;
            foreach($musicobj->url as $itemobj)
            {
                $encode = $itemobj->encode;
                //處理decode ,發現微信在處理音樂的時候有個問題,所以這里刪除一個參數
                $decode = $itemobj->decode;   
                $removedecode = end(explode('&', $decode));
                if($removedecode<>"")
                {
                    $removedecode="&".$removedecode;    
                }
                $decode = str_replace($removedecode,"", $decode);
                $musicurl= str_replace(end(explode('/', $encode))   ,$decode,$encode);
                break;
            }

            $resultStr = sprintf($ret, $postObj->FromUserName, $postObj->ToUserName,time(), $recognition,$musicurl,$musicurl);
            return $resultStr;

        }     
     
   

    }

?>

 

總結:微信的語音識別非常的強大,我的普通話,不算標准,但是每次都能識別出來,另外百度音樂api的音樂應有盡有。

從上面描述可以看到,我只是簡單的配置和寫了幾句簡單的php代碼,就實現了一個復雜的語音點歌系統。

 

體驗:

 

 

另外,歡迎大家關注一下我的個人訂閱號:

 

 




 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM