Сколько ям нужно заполнить небольшим программам, чтобы реализовать распознавание речи?

задняя часть внешний интерфейс WeChat FFmpeg
Сколько ям нужно заполнить небольшим программам, чтобы реализовать распознавание речи?

Не так давно написал небольшой микроканальной программы типа инструмента (поиск периферийных устройств), которая использует технологию распознавания речи. Теперь подробности реализации будут обобщены следующим образом:

Предварительный просмотр интерфейса

Учитесь, читаяДокументация по интерфейсу iFLYTEK,Документация по разработке мини-интерфейса программыПомимо изучения серверной среды ThinkPhp, я организовал следующие этапы разработки:

  • Зарегистрируйте учетную запись iFLYTEK (Гордость китайцев, лидирующие в мире технологии распознавания голоса)
  • Войдите на открытую платформу AIUI, чтобы создать приложение в управлении приложениями и записать APPID и ApiKey.
  • Войдите в конфигурацию приложения, настройте режим сцены, метод распознавания и навыки, которые соответствуют вашим собственным
  • Для разработки апплета запишите звук, который необходимо распознать (подробнее см. ниже).
  • Аудио, записанное с помощью внутреннего транскодирования (iFLYTEK поддерживает форматы pcm и wav), и отправьте его в интерфейс идентификации (подробности ниже)
  • Апплет получает результат распознавания и выполняет следующее дело

Интерфейс записи звука

  • wx.startRecord() и wx.stopRecord()

Интерфейсы wx.startRecord() и wx.stopRecord() также могут соответствовать требованиям, но они больше не поддерживаются командой WeChat, начиная с версии 1.6.0. Рекомендуется использовать более функциональный интерфейс wx.getRecorderManager. Аудиоформат, полученный этим интерфейсом, — шелк.
Шелк - это результат кодирования base64 в формат webm.После декодирования нам нужно преобразовать webm в pcm, wav

  • wx.getRecorderManager()

По сравнению с интерфейсом wx.startRecord() этот интерфейс предоставляет более мощные возможности (Подробности), вы можете приостановить или продолжить запись, а также установить битрейт кодирования, количество каналов записи и частоту дискретизации в соответствии с вашими потребностями. Самое приятное, что можно указать формат аудио, допустимые значения - aac/mp3. Плохо то, что wx.getRecorderManager() поддерживался только в версии 1.6.0. Конечно, если вы хотите быть совместимым с неопытными пользователями WeChat, вам нужно использовать 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, вы можете выбрать в соответствии со своими предпочтениями и способностями. Чтобы выполнить транскодирование аудио, нам нужно использовать инструменты транскодирования аудио и видео ffmpeg и avconv, которые все зависят от gcc. В процессе установки вы можете самостоятельно использовать 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;
    }
}

интерфейс идентификации вызова

Когда у нас будет готов файл, мы можем передать аудиофайл в кодировке base64 через запрос интерфейса API. В этот период мы должны обратить внимание на передачу в строгом соответствии со спецификациями, указанными в документе, иначе это приведет к неизвестным результатам.

<?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.

小程序码

Об установке gcc
Об установке FFmpeg
Об установке ffmpeg/avconv