小程序语音识别实现方法经验全面分享与总结

why 124 2024-10-08 09:11:51

之前写了个工具型微信小程序(find周边),里面用到了语音识别技术。本文就主要和大家分享小程序实现语音识别经验,希望能帮助到大家。

接口预览  

通过阅读了解科大讯飞接口文档、小程序接口开发文档以及对后端ThinkPhp框架的学习,我整理了如下开发步骤:

  • 注册科大讯飞账号(国人的骄傲,全球领先的语音识别技术)

  • 进入AIUI开放平台在应用管理创建应用并记录APPID和ApiKey

  • 进入应用配置,配置符合自己的情景模式、识别方式和技能

  • 进行小程序开发录制需要识别的音频(下有详述)

  • 后端转码录制的音频(科大讯飞支持pcm、wav),提交给识别接口(下有详述)

  • 小程序接到识别结果进行接下来业务

音频录制接口

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

wx.startRecord()和wx.stopRecord()接口也可以满足需求,但从1.6.0 版本开始不再被微信团队维护。建议使用能力更强的 wx.getRecorderManager 接口。该接口获取到的音频格式为silk。  silk是webm格式通过base64编码后的结果,我们解码后需要将webm转换成pcm、wav
  • wx.getRecorderManager()

相对wx.startRecord()接口,该接口提供的能力更为强大(详情),可以暂停录音也可以继续录音,根据自己需求设置编码码率,录音通道数,采样率。最让人开心的是可以指定音频格式,有效值 aac/mp3。不好的是wx.getRecorderManager()在1.6.0才开始被支持。当然如果你要兼容低端微信用户需要使用wx.startRecord()做兼容处理。
  • 事件监听细节

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

// 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>

    <text>{{text}}</text></view>

音频转换

我这边后端使用php的开源框架thinkphp,当然node、java、python等后端语言都可以,你根据自己的喜好和能力来。想做好音频转码我们就要借助音视频转码工具ffmpeg、avconv,它们都依赖于gcc。安装过程大家可以自行百度,或者关注底部的文章链接。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

<?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'=&gt;$message,'data'=&gt;$data);

        print json_encode($result);exit;

    }

}

调用识别接口

当我们把文件准备好之后,接下来我们就可以将base64编码之后的音频文件通过api接口请求传输过去。期间我们要注意严格按照文档中所说的规范传输,否则将造成不可知的结果。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

<?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'=&gt;'user_0001',"auf"=&gt;"16k","aue"=&gt;"raw","spx_fsize"=&gt;"60" )));

        $data "data=".$d;

        $res $this-&gt;httpsRequest($url,$data,$xparam);

        if(!empty($res) &amp;&amp; $res['code'] == 00000){

            apiResponse("success","识别成功!",$res);

        }else{

            apiResponse("error","识别失败!");

        }

    }

    //数据返回封装

    function apiResponse($flag 'error'$message '',$data array()){

        $result array('flag'=&gt;$flag,'message'=&gt;$message,'data'=&gt;$data);

        print json_encode($result);exit;

    }

}

到这里基本就完成了。以上代码是经过整理之后的,并不一定能够满足各位的实际开发需求。如果发现不当之处欢迎微信交流(xiaoqiang0672)。

想看实际案例的可以微信扫码
-
image.png



版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:微信小程序圆形进度条实现实例详细分享与解析
下一篇:微信小程序媒体组件实例详细分析与解读
相关文章