溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

小程序怎樣實現(xiàn)語音識別

發(fā)布時間:2021-01-27 11:03:58 來源:億速云 閱讀:172 作者:小新 欄目:移動開發(fā)

小編給大家分享一下小程序怎樣實現(xiàn)語音識別,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

接口預覽  

通過閱讀了解科大訊飛接口文檔、小程序接口開發(fā)文檔以及對后端ThinkPhp框架的學習,我整理了如下開發(fā)步驟:

  • 注冊科大訊飛賬號(國人的驕傲,全球領先的語音識別技術)

  • 進入AIUI開放平臺在應用管理創(chuàng)建應用并記錄APPID和ApiKey

  • 進入應用配置,配置符合自己的情景模式、識別方式和技能

  • 進行小程序開發(fā)錄制需要識別的音頻(下有詳述)

  • 后端轉(zhuǎn)碼錄制的音頻(科大訊飛支持pcm、wav),提交給識別接口(下有詳述)

  • 小程序接到識別結(jié)果進行接下來業(yè)務

音頻錄制接口

  • wx.startRecord()和wx.stopRecord()

wx.startRecord()和wx.stopRecord()接口也可以滿足需求,但從1.6.0 版本開始不再被微信團隊維護。建議使用能力更強的 wx.getRecorderManager 接口。該接口獲取到的音頻格式為silk。  
silk是webm格式通過base64編碼后的結(jié)果,我們解碼后需要將webm轉(zhuǎn)換成pcm、wav
  • wx.getRecorderManager()

相對wx.startRecord()接口,該接口提供的能力更為強大(詳情),可以暫停錄音也可以繼續(xù)錄音,根據(jù)自己需求設置編碼碼率,錄音通道數(shù),采樣率。最讓人開心的是可以指定音頻格式,有效值 aac/mp3。不好的是wx.getRecorderManager()在1.6.0才開始被支持。當然如果你要兼容低端微信用戶需要使用wx.startRecord()做兼容處理。
  • 事件監(jiān)聽細節(jié)

// wxjs:

const recorderManager = wx.getRecorderManager()
recorderManager.onStart(() => {
    //開始錄制的回調(diào)方法
})
//錄音停止函數(shù)
recorderManager.onStop((res) => {
  const { tempFilePath } = res;
  //上傳錄制的音頻
  wx.uploadFile({
    url: app.d.hostUrl + '/Api/Index/wxupload', //僅為示例,非真實的接口地址
    filePath: tempFilePath,
    name: 'viceo',
    success: function (res) {
        console.log(res);
    }
  })
})

Page({
    //按下按鈕--錄音
  startHandel: function () {
    console.log("開始")
    recorderManager.start({
      duration: 10000
    })
  },
  //松開按鈕
  endHandle: function () {
    console.log("結(jié)束")
    //觸發(fā)錄音停止
    recorderManager.stop()
  }
})

//wxml:
<view bindtouchstart='startHandel' bindtouchend='endHandle' class="tapview">
    <text>{{text}}</text>
</view>

音頻轉(zhuǎn)換

我這邊后端使用php的開源框架thinkphp,當然node、java、python等后端語言都可以,你根據(jù)自己的喜好和能力來。想做好音頻轉(zhuǎn)碼我們就要借助音視頻轉(zhuǎn)碼工具ffmpeg、avconv,它們都依賴于gcc。安裝過程大家可以自行百度,或者關注底部的文章鏈接。

<?php
namespace Api\Controller;
use Think\Controller;
class IndexController extends Controller {
    
    //音頻上傳編解碼
    public function wxupload(){
        $upload_res=$_FILES['viceo'];
        $tempfile = file_get_contents($upload_res['tmp_name']);
        $wavname = substr($upload_res['name'],0,strripos($upload_res['name'],".")).".wav";
        $arr = explode(",", $tempfile);
        $path = 'Aduio/'.$upload_res['name'];
        
        if ($arr && !empty(strstr($tempfile,'base64'))){
            //微信模擬器錄制的音頻文件可以直接存儲返回
            file_put_contents($path, base64_decode($arr[1]));
            $data['path'] = $path;
            apiResponse("success","轉(zhuǎn)碼成功!",$data);
        }else{
            //手機錄音文件
            $path = 'Aduio/'.$upload_res['name'];
            $newpath = 'Aduio/'.$wavname;
            file_put_contents($path, $tempfile);
            chmod($path, 0777);
            $exec1 = "avconv -i /home/wwwroot/mapxcx.kanziqiang.top/$path -vn -f wav /home/wwwroot/mapxcx.kanziqiang.top/$newpath";
            exec($exec1,$info,$status);
            chmod($newpath, 0777);
            if ( !empty($tempfile) && $status == 0 ) {
                $data['path'] = $newpath;
                apiResponse("success","轉(zhuǎn)碼成功!",$data);
            }
        }
        apiResponse("error","發(fā)生未知錯誤!");
    }
    //json數(shù)據(jù)返回方法封裝
    function apiResponse($flag = 'error', $message = '',$data = array()){
        $result = array('flag'=>$flag,'message'=>$message,'data'=>$data);
        print json_encode($result);exit;
    }
}

調(diào)用識別接口

當我們把文件準備好之后,接下來我們就可以將base64編碼之后的音頻文件通過api接口請求傳輸過去。期間我們要注意嚴格按照文檔中所說的規(guī)范傳輸,否則將造成不可知的結(jié)果。

<?php
namespace Api\Controller;
use Think\Controller;
class IndexController extends Controller {
    public function _initialize(){
    }
    //封裝數(shù)據(jù)請求方法
    public function httpsRequest($url,$data = null,$xparam){
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
        curl_setopt($curl, CURLOPT_HEADER, 0);
        $Appid = "";//開放平臺的appid
        $Appkey = "";//開放平臺的Appkey
        $curtime = time();
        $CheckSum = md5($Appkey.$curtime.$xparam.$data);
        $headers = array(
            'X-Appid:'.$Appid,
            'X-CurTime:'.$curtime,
            'X-CheckSum:'.$CheckSum,
            'X-Param:'.$xparam,
            'Content-Type:'.'application/x-www-form-urlencoded; charset=utf-8'
            );
        curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
        if (!empty($data)){
            curl_setopt($curl, CURLOPT_POST, 1);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
        }
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        $output = curl_exec($curl);
        curl_close($curl);
        return $output;
    }
    //請求接口數(shù)據(jù)處理
    public function getVoice($path){
        $d = base64_encode($path);
        $url = "https://api.xfyun.cn/v1/aiui/v1/voice_semantic";
        $xparam = base64_encode( json_encode(array('scene' => 'main','userid'=>'user_0001',"auf"=>"16k","aue"=>"raw","spx_fsize"=>"60" )));
        $data = "data=".$d;
        $res = $this->httpsRequest($url,$data,$xparam);
        if(!empty($res) && $res['code'] == 00000){
            apiResponse("success","識別成功!",$res);
        }else{
            apiResponse("error","識別失敗!");
        }
    }
    //數(shù)據(jù)返回封裝
    function apiResponse($flag = 'error', $message = '',$data = array()){
        $result = array('flag'=>$flag,'message'=>$message,'data'=>$data);
        print json_encode($result);exit;
    }
}

以上是“小程序怎樣實現(xiàn)語音識別”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI