知識(shí)
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價(jià)值,我們?cè)谧非笃湟曈X表現(xiàn)的同時(shí),更側(cè)重于功能的便捷,營(yíng)銷的便利,運(yùn)營(yíng)的高效,讓網(wǎng)站成為營(yíng)銷工具,讓軟件能切實(shí)提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序?yàn)楹笃谏?jí)提供便捷的支持!
您當(dāng)前位置>首頁 » 新聞資訊 » 小程序相關(guān) >
小程序?qū)崿F(xiàn)語音識(shí)別到底要填多少坑?
發(fā)表時(shí)間:2021-3-26
發(fā)布人:葵宇科技
瀏覽次數(shù):45
前不久寫了個(gè)工具型微信小程序(Find周邊),里面用到了語音識(shí)別技術(shù)。現(xiàn)將實(shí)現(xiàn)細(xì)節(jié)整理如下:
接口預(yù)覽
通過閱讀了解科大訊飛接口文檔、小程序接口開發(fā)文檔以及對(duì)后端ThinkPhp框架的學(xué)習(xí),我整理了如下開發(fā)步驟:
- 注冊(cè)科大訊飛賬號(hào)( 國(guó)人的驕傲,全球領(lǐng)先的語音識(shí)別技術(shù) )
- 進(jìn)入AIUI開放平臺(tái)在應(yīng)用管理創(chuàng)建應(yīng)用并記錄APPID和ApiKey
- 進(jìn)入應(yīng)用配置,配置符合自己的情景模式、識(shí)別方式和技能
- 進(jìn)行小程序開發(fā)錄制需要識(shí)別的音頻(下有詳述)
- 后端轉(zhuǎn)碼錄制的音頻(科大訊飛支持pcm、wav),提交給識(shí)別接口(下有詳述)
- 小程序接到識(shí)別結(jié)果進(jìn)行接下來業(yè)務(wù)
音頻錄制接口
- wx.startRecord()和wx.stopRecord()
wx.startRecord()和wx.stopRecord()接口也可以滿足需求,但從1.6.0 版本開始不再被微信團(tuán)隊(duì)維護(hù)。建議使用能力更強(qiáng)的 wx.getRecorderManager 接口。該接口獲取到的音頻格式為silk。
silk是webm格式通過base64編碼后的結(jié)果,我們解碼后需要將webm轉(zhuǎn)換成pcm、wav
- wx.getRecorderManager()
相對(duì)wx.startRecord()接口,該接口提供的能力更為強(qiáng)大(詳情),可以暫停錄音也可以繼續(xù)錄音,根據(jù)自己需求設(shè)置編碼碼率,錄音通道數(shù),采樣率。最讓人開心的是可以指定音頻格式,有效值 aac/mp3。不好的是wx.getRecorderManager()在1.6.0才開始被支持。當(dāng)然如果你要兼容低端微信用戶需要使用wx.startRecord()做兼容處理。
- 事件監(jiān)聽細(xì)節(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', //僅為示例,非真實(shí)的接口地址
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,當(dāng)然node、java、python等后端語言都可以,你根據(jù)自己的喜好和能力來。想做好音頻轉(zhuǎn)碼我們就要借助音視頻轉(zhuǎn)碼工具ffmpeg、avconv,它們都依賴于gcc。安裝過程大家可以自行百度,或者關(guān)注我后面的文章。
<?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'))){
//微信模擬器錄制的音頻文件可以直接存儲(chǔ)返回
file_put_contents($path, base64_decode($arr[1]));
$data['path'] = $path;
apiResponse("success","轉(zhuǎn)碼成功!",$data);
}else{
//手機(jī)錄音文件
$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ā)生未知錯(cuò)誤!");
}
//json數(shù)據(jù)返回方法封裝
function apiResponse($flag = 'error', $message = '',$data = https://www.wxapp-union.com/array()){
$result = array('flag'=>$flag,'message'=>$message,'data'=>$data);
print json_encode($result);exit;
}
}
調(diào)用識(shí)別接口
當(dāng)我們把文件準(zhǔn)備好之后,接下來我們就可以將base64編碼之后的音頻文件通過api接口請(qǐng)求傳輸過去。期間我們要注意嚴(yán)格按照文檔中所說的規(guī)范傳輸,否則將造成不可知的結(jié)果。
<?php
namespace Api\Controller;
use Think\Controller;
class IndexController extends Controller {
public function _initialize(){
}
//封裝數(shù)據(jù)請(qǐng)求方法
public function httpsRequest($url,$data = https://www.wxapp-union.com/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 = "";//開放平臺(tái)的appid
$Appkey = "";//開放平臺(tái)的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;
}
//請(qǐng)求接口數(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 = https://www.wxapp-union.com/"data="https://www.wxapp-union.com/.$d;
$res = $this->httpsRequest($url,$data,$xparam);
if(!empty($res) && $res['code'] == 00000){
apiResponse("success","識(shí)別成功!",$res);
}else{
apiResponse("error","識(shí)別失敗!");
}
}
//數(shù)據(jù)返回封裝
function apiResponse($flag = 'error', $message = '',$data = https://www.wxapp-union.com/array()){
$result = array('flag'=>$flag,'message'=>$message,'data'=>$data);
print json_encode($result);exit;
}
}
到這里基本就完成了。以上代碼是經(jīng)過整理之后的,并不一定能夠滿足各位的實(shí)際開發(fā)需求。如果發(fā)現(xiàn)不當(dāng)之處歡迎微信交流(xiaoqiang0672)。
相關(guān)案例查看更多
相關(guān)閱讀
- 網(wǎng)站建設(shè)價(jià)格
- 小程序被攻擊
- 云南網(wǎng)站建設(shè)快速優(yōu)化
- 云南小程序開發(fā)哪家好
- 報(bào)廢車回收管理系統(tǒng)
- 報(bào)廢車拆解回收管理系統(tǒng)
- 網(wǎng)站開發(fā)
- 云南網(wǎng)站建設(shè) 網(wǎng)絡(luò)服務(wù)
- 網(wǎng)站上首頁
- 云南軟件定制公司
- 表單
- 云南小程序開發(fā)制作公司
- web服務(wù)
- 小程序制作
- 云南做網(wǎng)站
- 汽車報(bào)廢拆解管理系統(tǒng)
- 云南軟件開發(fā)
- 云南網(wǎng)站建設(shè)報(bào)價(jià)
- 小程序開發(fā)公司
- 網(wǎng)站建設(shè)快速優(yōu)化
- 小程序生成海報(bào)
- 河南小程序制作
- 百度自然排名
- 怎么做網(wǎng)站
- 云南網(wǎng)站建設(shè)價(jià)格
- Web開發(fā)框架
- 網(wǎng)絡(luò)公司聯(lián)系方式
- 云南網(wǎng)站建設(shè)選
- 云南網(wǎng)站建設(shè)哪家強(qiáng)
- vue開發(fā)小程序