J'ai déjà écrit une applet WeChat de type outil (Rechercher un périphérique), qui utilisait la technologie de reconnaissance vocale. Cet article partage principalement avec vous l'expérience de mise en œuvre de la reconnaissance vocale dans de petits programmes, en espérant aider tout le monde.
Aperçu de l'interface
En lisant et en comprenant les documents d'interface iFlytek, les documents de développement d'interface de mini-programme et en apprenant le framework back-end ThinkPhp, j'ai compilé les étapes de développement suivantes :
Enregistrez un compte iFlytek (La fierté du peuple chinois, la première technologie de reconnaissance vocale au monde)
Entrez AIUI open La plateforme crée une application dans la gestion des applications et enregistre l'APPID et l'ApiKey
Entrez la configuration de l'application, configurez le mode de situation, la méthode d'identification et les compétences qui vous conviennent
Développer de petits programmes pour enregistrer l'audio qui doit être reconnu (détaillé ci-dessous)
Le back-end transcode l'audio enregistré (iflytek prend en charge pcm, wav) et le soumet à l'interface de reconnaissance (ci-dessous) Description détaillée)
L'applet reçoit le résultat de la reconnaissance et passe à l'activité suivante
Interface d'enregistrement audio
wx.startRecord() et wx.stopRecord()
wx.startRecord() et wx Les interfaces .stopRecord() peuvent également répondre aux besoins, mais à partir de la version 1.6.0, elles ne sont plus maintenues par l'équipe WeChat. Il est recommandé d'utiliser l'interface wx.getRecorderManager, plus performante. Le format audio obtenu par cette interface est la soie.
silk est le résultat de l'encodage base64 du format webm. Après décodage, nous devons convertir webm en pcm, wav
wx.getRecorderManager()
Par rapport à l'interface wx.startRecord(), cette interface offre des fonctionnalités plus puissantes (détails). Vous pouvez mettre en pause ou continuer l'enregistrement, et définir le débit binaire d'encodage et le nombre de canaux d'enregistrement en fonction. à vos besoins. Le plus agréable est que vous pouvez spécifier le format audio, la valeur valide est aac/mp3. Le problème est que wx.getRecorderManager() n'était pris en charge que dans la version 1.6.0. Bien sûr, si vous souhaitez être compatible avec les utilisateurs WeChat bas de gamme, vous devez utiliser wx.startRecord() pour le traitement de compatibilité.
Détails de la surveillance des événements
// 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>
Conversion audio
J'utilise le backend ici PHP Le framework open source thinkphp, bien sûr node, java, python et d'autres langages back-end sont disponibles, vous pouvez choisir en fonction de vos propres préférences et capacités. Pour effectuer le transcodage audio, nous devons utiliser les outils de transcodage audio et vidéo ffmpeg et avconv, qui reposent tous sur gcc. Vous pouvez Baidu vous-même pendant le processus d'installation ou suivez le lien de l'article en bas.
<?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; } }
Appelez l'interface de reconnaissance
Après avoir préparé le fichier, nous pouvons ensuite demander et transférer le fichier audio encodé en base64 via l'interface API. Pendant cette période, nous devons veiller à transmettre en stricte conformité avec les spécifications indiquées dans le document, sinon des résultats inconnus se produiront.
<?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; } }
C'est essentiellement fait. Le code ci-dessus a été compilé et ne répond pas nécessairement à vos besoins réels de développement. Si vous trouvez quelque chose d'inapproprié, n'hésitez pas à communiquer via WeChat (xiaoqiang0672).
Si vous souhaitez voir des cas réels, vous pouvez scanner le code WeChat
-
Recommandations associées :
.Développement net de l'analyse du code de reconnaissance vocale de la plateforme publique WeChat
À propos de l'appel des résultats de reconnaissance vocale de la plateforme publique WeChat
Écriture de balises de reconnaissance vocale HTML5 avec des images _compétences du didacticiel HTML5
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!