Не так давно написал небольшой микроканальной программы типа инструмента (поиск периферийных устройств), которая использует технологию распознавания речи. Теперь подробности реализации будут обобщены следующим образом:
Предварительный просмотр интерфейса
Учитесь, читаяДокументация по интерфейсу 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