微信小程序使用百度语音识别成功后,小程序端cancel了请求

突发奇想小程序尝试着集成语音识别功能,对号入座般首选方案为百度语音识别nodejs REST API。

其流程如图所示:

小程序端录制语音代码 如下所示:

<view class="page">
<view class="page__bd page__bd_spacing">
  <swiper indicator-dots="{{indicatorDots}}"
  autoplay="{{autoplay}}" interval="{{interval}}" duration="{{duration}}">
    <block wx:for="{{imgUrls}}">
      <swiper-item>
        <image src="{{item}}" class="slide-image" style=‘width:100%;‘ height="150"/>
      </swiper-item>
    </block>
  </swiper>

    <button class="weui-btn" type="primary" plain="true" bindtouchstart=‘startRecordAudio‘ bindtouchend=‘stopRecordAudio‘  bindtouchcancel=‘stopRecordAudio‘ >{{audioState}}</button>
  </view>

</view>

//index.js

//录制音频参数
const options = {
  duration: 60000,
  sampleRate: 44100,
  numberOfChannels: 1,
  encodeBitRate: 192000,
  format: ‘mp3‘,
  frameSize: 50
};
//语音录制管理器
const recorderManager = wx.getRecorderManager();

/**
   * 开始录制语音
   *
   */
  startRecordAudio:function()
  {

    recorderManager.onStart(() => {
      this.setData({ audioState: "语音录制中.." });
    });
    recorderManager.onResume(() => {
      console.log(‘recorder resume‘)
    });
    recorderManager.onPause(() => {
      this.setData({ audioState: "语音暂停录制" });
    });
    recorderManager.onStop((res) => {
      console.log(‘recorder stop‘, res);
      if (res.duration < 1000) {

        this.setData({ audioState: "开始录制" });

        wx.showToast({
          title: ‘录音不能小于1秒钟‘,
        });

        return;
      };

      var that = this;
      wx.saveFile({
        tempFilePath: res.tempFilePath,
        success: function (res) {
          var savedFilePath = res.savedFilePath;
          that.setData({ tempAudioFilePath: savedFilePath });
          that.uploadRecordAudio();
        }
      })
    });
    recorderManager.onFrameRecorded((res) => {
      const { frameBuffer } = res
      console.log(‘frameBuffer.byteLength‘, frameBuffer.byteLength)
    });
    recorderManager.onError((res) => {
      const { error } = res;
      console.log("record error is " + error);
    });

    recorderManager.start(options);
  },

  /**
   * 结束录制语音
   *
   */
  stopRecordAudio: function () {
    this.setData({ audioState: "语音录制完成,上传中.." });
    recorderManager.stop();
  },

  /**
     * 上传录制语音
     *
     */
  uploadRecordAudio: function () {

    wx.showLoading({
      title: ‘音频上传中..‘,
    })

    this.setData({ audioState: this.data.tempAudioFilePath });
    var that = this;
    const uploadTask = wx.uploadFile({
      url: ‘http://10.129.83.13:3000/aip‘,
      // url: ‘http://aip.butterfly.mopaasapp.com/aip‘,
      filePath: that.data.tempAudioFilePath,
      name: ‘file‘,
      header: {
        ‘content-type‘: ‘multipart/form-data‘
      },
      formData: {
        ‘user‘: ‘test‘
      },
      success: function (res) {
        //do something
        console.log("res" + JSON.stringify(res));
        wx.hideLoading();
        that.echoRecordAudioContent(res.data);
      }
    });

    uploadTask.onProgressUpdate((res) => {

      this.setData({ audioState: "语音录制完成,上传中" + res.progress+".." });
      console.log(‘上传进度‘, res.progress)
      console.log(‘已经上传的数据长度‘, res.totalBytesSent)
      console.log(‘预期需要上传的数据总长度‘, res.totalBytesExpectedToSend)
    });

    // uploadTask.abort() // 取消上传任务

  },

  /**
     * 回显录制语音转化成的文字
     *
     */
    echoRecordAudioContent: function (obj) {
      console.log("文字回显" + JSON.stringify(obj));

        var title = obj.result[0];
        wx.showToast({
          title: obj.result,
        })
  }

后端代码实现采用的Nodejs+express解决方案(因为涉及到音频格式的转码 需要在本地部署ffmpeg进行音频格式的转化)

aip.js代码如下

var express = require(‘express‘);
var router = express.Router();
var fs = require(‘fs‘);
var formidable = require("formidable");
var ffmpeg = require(‘fluent-ffmpeg‘);  

var AipSpeechClient = require("baidu-aip-sdk").speech;

// 设置APPID/AK/SK
var APP_ID = "******************";
var API_KEY = "******************";
var SECRET_KEY = "******************";
// 新建一个对象,建议只保存一个对象调用服务接口
var client = new AipSpeechClient(APP_ID, API_KEY, SECRET_KEY);

router.post(‘/‘, function(req, res, next) {

    var tmp_path = null;
    var target_path = null;

    var form = new formidable.IncomingForm();
    form.uploadDir = ‘./uploads/tmp/‘;
    form.maxFieldsSize = 20 * 1024 * 1024;
    form.timeout =
    form.parse(req,function(error,fields,files){

        if(!error)
        {
            tmp_path = files.file.path;
            // 指定文件上传后的目录 - 示例为"audio"目录。
            target_path = ‘./uploads/audio/‘ + files.file.name;
        }
        else
        {
            res.status(200).send("{‘err_msg‘:‘语音上传失败‘}");
        }
    });
    form.on(‘error‘, function(error) {
        console.log(‘********************error‘+error);
    });
    form.on(‘aborted‘, function() {
    });
    form.on(‘end‘, function() {

        if(fs.existsSync(tmp_path))
        {
            // 移动文件
            fs.rename(tmp_path, target_path, function(rename_err) {
                if (rename_err) throw rename_err;

                //使用ffmpeg 进行音频转换
                convertAudioType(target_path).then((data) => {
                    if(data != undefined)
                    {
                        res.send(data);
                    }
                    else
                    {
                        res.status(200).send("{‘err_msg‘:‘语音上传失败‘}");
                    }
                });
            });
        }

    });
});

//使用ffmpeg 进行音频转换 已经知道上传格式为aac
function convertAudioType(path)
{
    return new Promise((resolve,reject) => {

        //文件名称
        var filename = path.substr(path.lastIndexOf(‘/‘)+1);
        filename = filename.slice(0,filename.lastIndexOf(‘.‘));

        //输出文件路径
        var outputPath = ‘./assets/convert/audio/‘+filename+‘.wav‘;

        const extractAudio = require(‘ffmpeg-extract-audio‘);
            extractAudio({
                input: path,
                output: outputPath,
                format:‘wav‘,
                transform: (cmd) => {
                cmd.audioFilters([
                    {
                        filter: ‘volume‘,
                        options: ‘0.5‘
                    }
                ]);
                cmd.on(‘error‘, function(err) {
                    if(err) return reject({"err_msg":"语音格式转换失败"});
                });
                cmd.on(‘end‘, function() {

                    var obj = convertToText(path).then((data) => {
                        console.log("******************"+JSON.stringify(data));
                        return JSON.stringify(data);
                    }).catch((error) => {

                    });

                    return resolve(obj);
                });
            }
        });

    });

}

//使用百度语音识别
function convertToText(path)
{
    return new Promise((resolve,reject) => {

        // setTimeout(function(){return resolve({"err_msg":"语音识别失败"});},1000);
        var voice = fs.readFileSync(path);
        var voiceBuffer = new Buffer(voice);

        // 识别本地文件
        client.recognize(voiceBuffer, ‘wav‘, 16000).then(function (result) {
            var data = result;
            if(data.err_no == 0)
            {
                //{"corpus_no":"6543498202833665207","err_msg":"success.","err_no":0,"result":["欢迎使用百度语音合成,"],"sn":"321835246031523526898"}
                return resolve({"err_msg":"success","result":data.result[0]}); //小程序端直接cancel了请求
            }
            else
            {
                //{"err_msg":"speech quality error.","err_no":3301,"sn":"725439393781523526861"}
                return resolve({"err_msg":"语音识别失败"}); //小程序端可以接收到 response
            }
        }, function(err)
        {
            console.log(err);
            if(err) return reject({"err_msg":"语音识别失败"});
        });
    });

}

module.exports = router;

问题来了,红色标注如下图:

问题在持续跟踪中,也给百度反馈了,等待百度给出合理的解释。。。

原文地址:http://blog.51cto.com/l0086/2103015

时间: 2024-08-28 22:03:03

微信小程序使用百度语音识别成功后,小程序端cancel了请求的相关文章

C++Qt5+win10+MSVC2015 64bit构建程序,Release编译成功后使用windeployqt.exe发布程序使用于win7出现缺少MSVCP140.dll!!!

在Windows/system32中找到MSVCP140.dll,放置发布的文件夹中,会出现 这表明程序运行缺少必要的dll,网上搜索解决方法,一般会推荐使用一些软件进行打包,但我使用windeployqt.exe进行软件发布!一样出现上述问题!一度怀疑是不是 win10下开发的软件在win7下不能运行,将源码包换到win7下构建发布一样的问题!!! 那么说明win7/10Release的软件都是可以运行的!但发布的程序到其他的电脑(均为64bit)点击SerialPort.exe,出现上图情况

在程序中点击home键后将程序通知显示到状态栏中

当程序处于后台运作的时候,Activity处于onStop状态,so只要在onStop方法中将程序运行状态显示在状态栏即可 //在状态栏显示程序通知    private void showNotification() {        // 创建一个NotificationManager的引用        NotificationManager notificationManager = (NotificationManager) this                .getSystem

过滤器总结 微信小程序和百度智能小程序和vue过滤器

因为最近写了微信小程序和百度小程序,用到了过滤器,感觉还挺好用的,所以就来总结一下,希望能帮到你们. 1. 微信小程序过滤器: 1.1:首先建一个单独的wxs后缀的文件,一般放在utils文件夹里面.这里我命名为imgFilter.wxs(因为我项目里是用来处理图片的,哈哈) 1.2:写代码,为了方便理解,下面是一个简单的返回一个字符串拼接,当然里面的函数你想怎么处理都行,这里主要介绍思路和基本实现. var bar = function (x) { return 'hello'+ x; } m

微信小程序-视频教程-百度云-下载

微信小程序-视频教程-百度云-下载 什么是微信小程序?小程序是一种不需要下载安装即可使用的应用,它实现了应用「触手可及」的梦想,用户扫一扫或搜一下即可打开应用.也体现了「用完即走」的理念,用户不用关心是否安装太多应用的问题.应用将无处不在,随时可用,但又无需安装卸载. 为什么要学微信小程序?比 NativeApp 简单.比 WebApp 性能稳定.未来商业价值高.如果你是一名前端,那么未来小程序会是你另一个战场:如果你不是BAT,善用微信小程序开发将给你带来流量和用户:如果你是业内大V,新的研究

基于百度语音识别API的Python语音识别小程序

一.功能概述 实现语音为文字,可以扩展到多种场景进行工作,这里只实现其基本的语言接收及转换功能. 在语言录入时,根据语言内容的多少与停顿时间,自动截取音频进行转换. 工作示例: 二.软件环境 操作系统:win10 语言:Python 版本:3.6.0 Python库:AipSpeech(百度语音识别SDK客户端),wave,PyAudio,paInt16 Python库安装:除百度为:pip install baidu-aip,其他直接 pip install *(库名) 即可. 三.原理概述

百度智能小程序_百度小程序怎么申请?开发?

申请百度智能小程序帐号 使用百度帐号(没有百度帐号会自动创建)登录百度 智能小程序开发者后台. 登录成功后,选择类型.填写信息并提交相应的资料. 提交完资料,等待审核.审核通过后,就可以拥有自己的智能小程序帐号. 审核通过后,登录 智能小程序开发者后台 . 打开"智能小程序首页"-"设置"-"开发设置", 查看百度小程序的 AppID . 安装百度开发者工具 下载百度开发者工具. Windows 内测下载地址 | Mac 内测下载地址. 你的第一

微信小程序时代来临,极限工坊小程序助力亿万级市场|淘小咖

微信小程序逐渐成了移动互联网营销不可或缺的一种工具,成为撬动移动互联网千亿市场红利的一个契机,对用户来说,能够在最短时间内获取服务,无需下载软件. 对商家来说,可以从线上引流,直接触达用户,扩大营销渠道,实现用户沉淀和裂变营销,而不用再被平台绑架. 小程序轻松解决了这两个痛点,为用户带去便利,为商家带来盈利,这也就使得微信小程序越来越受欢迎. 可以说,伴随微信小程序的快速发展,我们正迎来微信小程序的时代. 小程序对于企业运营优势在哪儿呢? 小程序简单点说,它相当于一个展示网站或网上商城,包含在线

微信小程序——创建自己的第一个小程序【一】

注册 微信小程序注册 https://mp.weixin.qq.com/wxopen/waregister?action=step1 填写账号信息 作为登录帐号,请填写未被微信公众平台注册,未被微信开放平台注册,未被个人微信号绑定的邮箱 ,每个邮箱只能申请一个小程序. 邮箱激活 注册成功后会向注册的邮箱发送一个邮件,点击链接激活即可 填写个人信息 网络太差明天再写 原文地址:https://www.cnblogs.com/wangyang0210/p/10212040.html

加一度解析百度搜索困局,小程序将开启搜索流量新机遇

近期,不知大家在使用百度APP时,有没有发现其搜索结果内智能小程序的出现增多了? 这实际上是百度针对智能小程序开发者在搜索流量上开放的一个重要动作,这也意味着在百度的搜索场景中,智能小程序可以获得更多的流量. 从开放生态的建立,到面向开发者推出"布道师计划",再到如今全面开放搜索流量,百度正在通过更多维度的生态构建来为智能小程序行业带来更多可能.搜索+全域流量的释放小程序,虽然名字带个小字,却引来了各路豪杰集聚. 除最早入局的微信以外,百度.支付宝.QQ以及今日头条,国内互联网主流玩家