Un mini programme réalise le partage d'expériences de reconnaissance vocale

小云云
Libérer: 2018-02-08 16:02:03
original
6641 Les gens l'ont consulté

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=&#39;startHandel&#39; bindtouchend=&#39;endHandle&#39; class="tapview">
    <text>{{text}}</text>
</view>
Copier après la connexion

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[&#39;viceo&#39;];
        $tempfile = file_get_contents($upload_res[&#39;tmp_name&#39;]);
        $wavname = substr($upload_res[&#39;name&#39;],0,strripos($upload_res[&#39;name&#39;],".")).".wav";
        $arr = explode(",", $tempfile);
        $path = &#39;Aduio/&#39;.$upload_res[&#39;name&#39;];
        
        if ($arr && !empty(strstr($tempfile,&#39;base64&#39;))){
            //微信模拟器录制的音频文件可以直接存储返回
            file_put_contents($path, base64_decode($arr[1]));
            $data[&#39;path&#39;] = $path;
            apiResponse("success","转码成功!",$data);
        }else{
            //手机录音文件
            $path = &#39;Aduio/&#39;.$upload_res[&#39;name&#39;];
            $newpath = &#39;Aduio/&#39;.$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[&#39;path&#39;] = $newpath;
                apiResponse("success","转码成功!",$data);
            }
        }
        apiResponse("error","发生未知错误!");
    }
    //json数据返回方法封装
    function apiResponse($flag = &#39;error&#39;, $message = &#39;&#39;,$data = array()){
        $result = array(&#39;flag&#39;=>$flag,'message'=>$message,'data'=>$data);
        print json_encode($result);exit;
    }
}
Copier après la connexion

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(
            &#39;X-Appid:&#39;.$Appid,
            &#39;X-CurTime:&#39;.$curtime,
            &#39;X-CheckSum:&#39;.$CheckSum,
            &#39;X-Param:&#39;.$xparam,
            &#39;Content-Type:&#39;.&#39;application/x-www-form-urlencoded; charset=utf-8&#39;
            );
        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(&#39;scene&#39; => '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;
    }
}
Copier après la connexion

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
-
Un mini programme réalise le partage d'expériences de reconnaissance vocale

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!