저는 이전에 음성인식 기술을 활용한 도구형 위챗 애플릿(주변기기 찾기)을 작성했습니다. 이 기사에서는 모든 사람에게 도움이 되기를 바라며 주로 소규모 프로그램에서 음성 인식을 구현한 경험을 공유합니다.
인터페이스 미리보기
iFlytek 인터페이스 문서, 애플릿 인터페이스 개발 문서를 읽고 이해하고 백엔드 ThinkPhp 프레임워크에 대해 학습하면서 다음 개발 단계를 정리했습니다.
iFlytek 계정 등록(國人The 세계 최고의 음성인식 기술의 자부심)
AIUI 오픈 플랫폼에 들어가 애플리케이션 관리에서 애플리케이션을 생성하고 APPID와 ApiKey를 기록하세요
애플리케이션 구성에 들어가서 상황 모드, 인식 방법 및 자신에게 맞는 기술
인식해야 하는 오디오를 녹음하는 작은 프로그램을 개발하세요(자세한 내용은 아래 참조)
백엔드는 녹음된 오디오를 트랜스코딩하고(iFlytek은 pcm, wav 지원) 인식 인터페이스(자세한 내용은 아래 참조)
애플릿은 인식 결과를 받아 다음 작업을 진행합니다
오디오 녹음 인터페이스
wx.startRecord() 및 wx.stopRecord()
wx.startRecord() 및 wx.stopRecord() ) 인터페이스도 요구 사항을 충족할 수 있지만 버전 1.6.0부터 WeChat 팀에서 더 이상 유지 관리하지 않습니다. 보다 유능한 wx.getRecorderManager 인터페이스를 사용하는 것이 좋습니다. 이 인터페이스에서 얻은 오디오 형식은 실크입니다.
silk는 webm 형식을 base64로 인코딩한 결과입니다. 디코딩 후 wx.startRecord() 인터페이스와 관련하여 webm을 pcm 및 wav
wx.getRecorderManager()
로 변환해야 합니다. 더욱 강력한 기능(세부 사항)을 제공하며, 녹음을 일시 중지하거나 계속할 수 있으며 필요에 따라 인코딩 비트율, 녹음 채널 수, 샘플링 속도를 설정할 수 있습니다. 가장 즐거운 점은 오디오 형식을 지정할 수 있다는 것입니다. 유효한 값은 aac/mp3입니다. 나쁜 점은 wx.getRecorderManager()가 1.6.0에서만 지원된다는 것입니다. 물론, 저사양 위챗 사용자들과의 호환성을 원한다면 호환성 처리를 위해 wx.startRecord()를 사용해야 합니다.
이벤트 모니터링 세부사항
// wxjs: const recorderManager = wx.getRecorderManager() recorderManager.onStart(() => { //开始录制的回调方法 }) //录音停止函数 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("结束") //触发录音停止 recorderManager.stop() } }) //wxml: <view bindtouchstart='startHandel' bindtouchend='endHandle' class="tapview"> <text>{{text}}</text> </view>
오디오 변환
백엔드에는 PHP의 오픈소스 프레임워크인 thinkphp를 사용합니다. 물론 node, java, python 및 기타 백엔드 언어도 가능합니다. 자신의 취향과 능력에 따라 오십시오. 오디오 트랜스코딩을 수행하려면 모두 gcc에 의존하는 오디오 및 비디오 트랜스코딩 도구인 ffmpeg 및 avconv를 사용해야 합니다. 설치 과정에서 Baidu를 직접 수행하거나 하단의 기사 링크를 따라갈 수 있습니다.
<?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","转码成功!",$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","转码成功!",$data); } } apiResponse("error","发生未知错误!"); } //json数据返回方法封装 function apiResponse($flag = 'error', $message = '',$data = array()){ $result = array('flag'=>$flag,'message'=>$message,'data'=>$data); print json_encode($result);exit; } }
인식 인터페이스 호출
파일을 준비한 후 API 인터페이스를 통해 base64로 인코딩된 오디오 파일을 요청하고 전송할 수 있습니다. 이 기간 동안 문서에 명시된 사양을 엄격히 준수하여 전송하도록 주의를 기울여야 합니다. 그렇지 않으면 알 수 없는 결과가 발생합니다.
<?php namespace Api\Controller; use Think\Controller; class IndexController extends Controller { public function _initialize(){ } //封装数据请求方法 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; } //请求接口数据处理 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","识别失败!"); } } //数据返回封装 function apiResponse($flag = 'error', $message = '',$data = array()){ $result = array('flag'=>$flag,'message'=>$message,'data'=>$data); print json_encode($result);exit; } }
이것은 기본적으로 완료되었습니다. 위의 코드는 컴파일되었으며 실제 개발 요구 사항을 반드시 충족하지 못할 수도 있습니다. 부적절한 내용을 발견하시면 WeChat(xiaoqiang0672)을 통해 언제든지 연락주시기 바랍니다.
실제 사례를 보고 싶다면 WeChat에서 코드를 스캔하세요
-
관련 권장 사항:
.Net 개발 WeChat 공개 플랫폼 음성 인식 코드 분석
사진을 이용한 HTML5 음성 인식 태그 작성 방법_html5 튜토리얼 기술
위 내용은 미니 프로그램으로 음성인식 경험 공유 실현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!