vue 移动端语音输入教程

news/2024/7/10 2:41:51 标签: vue

网上查了半天,全是复制粘贴的博客,实在忍不住,自己开章!
教程vue移动端语音输入!

1、首先你得有https协议的网站域名
因为语音输入需要已经安全验证的网站,才可以获取手机的语音权限!
如果你拥有,就把项目放在这个https域名下。

2、安装vue录音插件

cnpm i js-audio-recorder --s

输入上面命令进行安装插件,安装完成后,在你需要使用录音的页面引入:

3、代码部分:


import Recorder from "js-audio-recorder";
const lamejs = require("lamejs");
const recorder = new Recorder({
  sampleBits: 16, // 采样位数,支持 8 或 16,默认是16
  sampleRate: 48000, // 采样率,支持 11025、16000、22050、24000、44100、48000,根据浏览器默认值,我的chrome是48000
  numChannels: 1, // 声道,支持 1 或 2, 默认是1
  // compiling: false,(0.x版本中生效,1.x增加中)  // 是否边录边转换,默认是false
});

在这里插入图片描述
methods:{}里录音函数,根据你的需要进行事件点击监听:

 // 录音
    startMp3() {
      this.showSound = true;
      recorder.start().then(
        (res) => {},
        (error) => {
          // 出错了
          console.log(`${error.name} : ${error.message}`);
        }
      );
    },
    // 结束录音
    stopRecorder() {
      this.showSound = false;
      recorder.stop();
      recorder.destroy().then(function () {});
    },
    // 录音播放
    playRecorder() {
      // recorder.play();
      let wav = recorder.getWAVBlob(); //获取 WAV 数据
      this.showSound = false;
      const mp3Blob = this.convertToMp3(recorder.getWAV());
      console.log("录音", mp3Blob);
      this.uploadVoice(mp3Blob);
    },
    //转wav为MP3格式
    convertToMp3(wavDataView) {
      // 获取wav头信息
      const wav = lamejs.WavHeader.readHeader(wavDataView); // 此处其实可以不用去读wav头信息,毕竟有对应的config配置
      const { channels, sampleRate } = wav;
      const mp3enc = new lamejs.Mp3Encoder(channels, sampleRate, 128);
      // 获取左右通道数据
      const result = recorder.getChannelData();
      const buffer = [];

      const leftData =
        result.left &&
        new Int16Array(result.left.buffer, 0, result.left.byteLength / 2);
      const rightData =
        result.right &&
        new Int16Array(result.right.buffer, 0, result.right.byteLength / 2);
      const remaining = leftData.length + (rightData ? rightData.length : 0);

      const maxSamples = 1152;
      for (let i = 0; i < remaining; i += maxSamples) {
        const left = leftData.subarray(i, i + maxSamples);
        let right = null;
        let mp3buf = null;

        if (channels === 2) {
          right = rightData.subarray(i, i + maxSamples);
          mp3buf = mp3enc.encodeBuffer(left, right);
        } else {
          mp3buf = mp3enc.encodeBuffer(left);
        }

        if (mp3buf.length > 0) {
          buffer.push(mp3buf);
        }
      }

      const enc = mp3enc.flush();

      if (enc.length > 0) {
        buffer.push(enc);
      }

      return new Blob(buffer, { type: "audio/mp3" });
    },

4、语音上传到服务器:

    //上传音频
    uploadVoice(params) {
      let that = this;
      let url = api.apiUrl.uploadFile + "?token=" + localStorage.token;
      var param = new FormData();
      param.append("file", params);
      upload(this.ROOT + url, param).then((res) => {
        console.log("上传", res.data.data);
        if (res.data.code == "0") {
          let data = {
            voice: res.data.data,
            userId: that.$route.query.userId,
            anchorId: localStorage.anchorId,
          };
          ajaxReq("POST", that.ROOT + api.apiUrl.sengMsg, data).then((res) => {
            if (res.code == "0") {
              that.records.push(res.data);
              that.content = "";
              that.scrollToBottom();
              that.showMoreOpratin = false;
            } else {
              that.$toast(res.msg);
            }
          });
        } else {
          that.$toast(res.msg);
        }
      });
    },

重点是这个,方便后台以表单的形式接收文件数据:
在这里插入图片描述
提示:如果你是复制粘贴的,很多函数都没有的哦,没有的可以删掉,核心是录音教程,比如你得自己封装upload()上传文件的函数哦!

vue录音插件详细介绍:vue录音插件
有帮到你就点个赞吧!


http://www.niftyadmin.cn/n/1301852.html

相关文章

每天10道,前端面试题目 【1】

有些面试题目的答案太牛皮了&#xff0c;所以想记录下来&#xff01; 题1、 已知如下数组&#xff1a; var arr [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10]; 编写一个程序将数组扁平化去并除其中重复部分数据&#xff0c;最终得到一个升序…

每天10道,前端面试题目 【2】

题1、 介绍 HTTPS 握手过程 答&#xff1a; 1、客户端使用https的url访问web服务器,要求与服务器建立ssl连接 2、web服务器收到客户端请求后, 会将网站的证书(包含公钥)传送一份给客户端 3、客户端收到网站证书后会检查证书的颁发机构以及过期时间, 如果没有问题就随机产生一…

如何用URL Scheme H5链接,直接打开微信小程序

今天接到需求&#xff01;&#xff01;&#xff01;想要从浏览器&#xff0c;QQ等场景&#xff0c;用H5链接打开微信小程序&#xff01;&#xff01;&#xff01; 如何实现的&#xff0c;一番查阅后&#xff0c;让我带你实现吧&#xff01; ps&#xff1a;适用于非个人主体&…

微信小程序封装request

众所周知&#xff0c;微信的请求方式是通过wx.request()请求的&#xff0c;所以需要数据的页面都用到他&#xff0c;所以我们把他封装起来&#xff01;&#xff01;&#xff01; 1、首先我们新建个request.js&#xff0c;把下面代码输入进去 function request(url, data {}, …

微信小程序,使用AES加密、解密

搜索了一早上&#xff0c;发现都没有小程序的AES加密、解密的完美教程&#xff0c;全是复制粘贴别人的一半一半代码&#xff0c;有头没尾&#xff01; 不多说&#xff0c;直接开撸&#xff01; 一、在你的小程序目录下的utils文件夹里新建个aes_util.js文件&#xff0c;把下面复…

vue history模式下,与Nginx的配置

需求&#xff1a;想在http://h5.xxxxxxx.cn域名下&#xff0c;h5的目录里放上我们的项目&#xff01; 达到这种地址效果http://h5.xxxxxxx.cn/h5/market?sourcexmb-h5-yx 解决方案&#xff1a; 第一步&#xff1a;在你的项目&#xff0c;路由router里&#xff0c;加入你需要的…

搞了个理财小程序,大家来瞧一瞧看一看啦

要致富&#xff0c;先理财&#xff01; 日常消费中&#xff0c;一会用支付宝&#xff0c;一会又用微信支付。花的钱都不知道多少。所以自己搞了个记录每一笔消费的小程序。 没搞服务器&#xff0c;所以数据存在你的手机本地&#xff0c;所以删除小程序数据会全部消失哦&#…

git 创建分支,切换分支,合并分支,删除本地分支,删除远程分支

创建一个新分支并选择创建好的分支 git checkout -b dev Switched to a new branch "dev" //查看本地分支 git branch //把本地的分支推动到远程仓库 git status git add .git commit -m add branch devgit push --set-upstream origin dev这个时候在你的git仓库就…