Recorder 实现语音录制并上传到后端(兼容PC和移动端)

这篇具有很好参考价值的文章主要介绍了Recorder 实现语音录制并上传到后端(兼容PC和移动端)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Recorder 首页:https://github.com/xiangyuecn/Recorder

一、安装

npm install recorder-core

二、代码部分

1. HTML页面

<template>
  <div>
    <el-input
      v-model="ttsText"
      type="textarea"
      placeholder="请输入内容"
    ></el-input>
    <el-button type="success" @click="recStart()">开始录音</el-button>
    <el-button type="success" @click="recStop()">结束录音</el-button>
    <el-button type="success" @click="recPlay()">本地试听</el-button>
    <div style="padding-top: 5px">
      <!-- 波形绘制区域 -->
      <div
        style="
          border: 1px solid #ccc;
          display: inline-block;
          vertical-align: bottom;
        "
      >
        <div style="height: 100px; width: 300px" ref="recwave"></div>
      </div>
    </div>
  </div>
</template>

2. 引入插件

// 上传语音文件用
import axios from "axios";
// Recorder核心文件
import Recorder from "recorder-core";
// 引入mp3格式支持文件,如果需要多个格式支持,把这些格式的编码引擎js文件放到后面统统引入进来即可
import "recorder-core/src/engine/mp3";
import "recorder-core/src/engine/mp3-engine";
// 录制wav格式的用这一句就行
import "recorder-core/src/engine/wav";

// 可选的插件支持项,这个是波形可视化插件
import "recorder-core/src/extensions/waveview";
//ts import 提示:npm包内已自带了.d.ts声明文件(不过是any类型)

3. 方法

// 转文字的内容
var ttsText = ref("");
// 录音Recorder对象
let rec: any;
// 录音文件对象
let recBlob: any;
let wave: any;
const recwave = ref(null);

// 打开录音(请求权限)
function recOpen() {
  //创建录音对象
  rec = Recorder({
    type: "wav", //录音格式,可以换成mp3等其他格式
    sampleRate: 16000, //录音的采样率,越大细节越丰富越细腻
    bitRate: 16, //录音的比特率,越大音质越好
    onProcess: (
      buffers: any,
      powerLevel: any,
      bufferDuration: any,
      bufferSampleRate: any,
      newBufferIdx: any,
      asyncEnd: any
    ) => {
      //录音实时回调,大约1秒调用12次本回调
      //可实时绘制波形,实时上传(发送)数据
      if (wave) {
        wave.input(buffers[buffers.length - 1], powerLevel, bufferSampleRate);
      }
    },
  });
  if (!rec) {
    alert("当前浏览器不支持录音功能!");
    return;
  }
  // 打开录音,获得权限
  rec.open(
    () => {
      console.log("录音已打开");
      //创建音频可视化图形绘制对象
      if (recwave.value) {
        wave = Recorder.WaveView({ elem: recwave.value });
      }
    },
    (msg: any, isUserNotAllow: any) => {
      //用户拒绝了录音权限,或者浏览器不支持录音
      console.log((isUserNotAllow ? "UserNotAllow," : "") + "无法录音:" + msg);
    }
  );
}
// 开始录音
function recStart() {
  if (!rec) {
    console.error("未打开录音");
    return;
  }
  rec.start();
  console.log("已开始录音");
}
// 结束录音
function recStop() {
  if (!rec) {
    console.error("未打开录音");
    return;
  }
  rec.stop(
    (blob: any, duration: any) => {
      //blob就是我们要的录音文件对象,可以上传,或者本地播放
      recBlob = blob;
      //简单利用URL生成本地文件地址,此地址只能本地使用,比如赋值给audio.src进行播放,赋值给a.href然后a.click()进行下载(a需提供download="xxx.mp3"属性)
      const localUrl = (window.URL || window.webkitURL).createObjectURL(blob);
      console.log("录音成功", blob, localUrl, "时长:" + duration + "ms");
      upload(blob); //把blob文件上传到服务器
      //   rec.close(); //关闭录音,释放录音资源,当然可以不释放,后面可以连续调用start,关闭的话则需要重新打开录音
      //   rec = null;
    },
    (err: any) => {
      console.error("结束录音出错:" + err);
      rec.close(); //关闭录音,释放录音资源,当然可以不释放,后面可以连续调用start
      rec = null;
    }
  );
}
// 上传录音
function upload(blob: any) {
  console.log("视频上传服务器:");
  //blob格式转换为base64格式
  blobToDataURI(blob, function (result) {
    axios({
      method: "POST",
      url: `https://xxxxx/api/xxxxx/xxxxx`,		// 这里是后端的接口地址,我这边后端用的是百度语音识别(百度文档里面写的,必须后端进行交互,前端无法直接交互,因为前端无法访问百度语音识别的域名)
      headers: {
        "Content-Type": "application/json",
      },
      // 在请求之前对data传参进行格式转换
      transformRequest: [
        function (data) {
          data = JSON.stringify(data);
          return data;
        },
      ],
      params: {},
      // 这里是传递的参数
      data: {
        file: result.split(",")[1],
        format: "wav",
        len: atob(result.split(",")[1]).length,
      },
    })
      .then((res) => {
        let resp = res.data;
        if (resp.err_msg == "success.") {
          ttsText.value = resp.result[0];
          console.log("返回文字内容:", ttsText.value);
        }
      })
      .catch((req) => {
        console.log(req);
      });
  });
}
// 本地播放录音
function recPlay() {
  //本地播放录音试听,可以直接用URL把blob转换成本地播放地址,用audio进行播放
  const localUrl = URL.createObjectURL(recBlob);
  const audio = document.createElement("audio");
  audio.controls = true;
  document.body.appendChild(audio);
  audio.src = localUrl;
  audio.play(); //这样就能播放了
  //注意不用了时需要revokeObjectURL,否则霸占内存
  setTimeout(function () {
    URL.revokeObjectURL(audio.src);
  }, 5000);
}

// blob 转 base64
function blobToDataURI(blob, callback) {
  var reader = new FileReader();
  reader.readAsDataURL(blob);
  reader.onload = function (e) {
    callback(e.target.result);
  };
}
  1. 使用
onMounted(async () => {
  // 开启麦克风权限
  recOpen();
});
  1. 示例
    Recorder 实现语音录制并上传到后端(兼容PC和移动端),web前端,前端

备注: 如果本地开发的时候,浏览器提示录音open失败:浏览器禁止不安全页面录音。可通过开启https解决问题

本文参考文章(做了部分修改):https://blog.csdn.net/IAIPython/article/details/134611674文章来源地址https://www.toymoban.com/news/detail-833464.html

到了这里,关于Recorder 实现语音录制并上传到后端(兼容PC和移动端)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java MultipartFile+vue+element 批量上传文件、图片,与普通数据同时提交保存才上传到后端

    文件上传项目可参考:点击预览 1.最简单也是最普遍的做法是form表单提交,其实前端提交到后端也是难以离开form表单提交, 一般有两种方式来处理文件、图片上传: 先上传,获取返回路径,再整个表单提交后端保存; 普通数据与文件图片同时提交后端,由后端处理 优点比

    2024年02月03日
    浏览(53)
  • vue3实现H5网页录音并上传(mp3、wav)兼容Android、iOS和PC端

    使用 Recorder插件 可以在HTML5网页中进行录音,录音完成后得到blob文件对象,然后将blob上传到服务器;项目使用的vue3.0版本(这个插件同时支持vue2.0、也支持uniapp,很强!!),录音过程中会显示可视化波形,同时能够做到兼容PC端、Android、和iOS,一次编码 到处运行,哈哈

    2024年02月08日
    浏览(52)
  • uni-file-picker上传图片到后端服务器并存入数据库

    最近在做一个需求,使用uniapp上传用户头像。后端会有一个处理上传图片返回图像链接的接口。在uniapp官网关于上传的组件有两个: (1)uni.uploadFile(object) (2)uni-file-picker 如果使用uni.uploadFile,前端的代码大致可以这样写: 这是官网给出的范例。对应的HTML: 然后就是 自

    2024年02月12日
    浏览(44)
  • uniapp在微信小程序端调用摄像头拍照并且把拍下的图片上传到后端

    需要注意的是我在代码片段中用到 _this,因为我怕函数改变了this的指向所有我在方法的开头就写了 let _this = this

    2024年02月08日
    浏览(65)
  • 使用Jmeter自带recorder代理服务器录制接口脚本

    脚本录制 配置线程组 添加代理服务器 端口 和 录制脚本放置位置可根据需要设置 启动录制 点击启动后 弹出创建证书提示,点击OK 这个证书后续需要使用到 然后可见 一个弹窗。 Recorder . 本质是代理服务+录制交易控制 可设置对应数据 方便录制脚本的查看 证书配置 Jmeter 证书

    2024年02月12日
    浏览(44)
  • Recorder.js:一款简单的Web音频录制库

    Recorder.js 是一个轻量级的JavaScript库,它允许你在浏览器中轻松地录制、处理和保存音频数据。借助Recorder.js,你可以构建各种有趣的Web应用程序,如语音备忘录、在线录音室或教育工具。 使用Recorder.js,您可以实现以下功能: 录音:在Web页面上为用户提供简单的录音体验。

    2024年04月29日
    浏览(26)
  • vue3 - 使用element-plus组件库el-upload上传超大mp4视频分片上传,Upload上传大文件mp4视频进行切片分段上传到后端服务器教程,vue3如何上传很大的视频(详细示例代码

    在vue3+elementPlus中,使用el-upload组件\\\"切片分段\\\"上传mp4大视频到服务器,支持任意大视频、大文档、大压缩包等超大文件,通用方法将其拆分成多个小段进行逐个逐条上传到后端(支持断点续传、下载预览)。 详细大文件分片功能源码,可只拿前端源码或只拿springboot(Java)后

    2024年03月16日
    浏览(79)
  • 【P4】JMeter 原生录制方式——HTTP代理服务器(HTTP(S) Test Script Recorder)

    HTTP代理服务器允许JMeter在使用常规浏览器,浏览Web应用程序时拦截并记录操作。JMeter将创建测试样本对象,并将其直接存储到的测试计划中。录制脚本时,最好使用无痕浏览模式,这可以确保浏览器没有存储的Cookie信息,并防止保存某些更改。例如:Firefox不允许永久保存证

    2024年02月11日
    浏览(39)
  • Unity+chatgpt+webgl实现声音录制+语音识别

            AI二次元女友这个项目持续更新,在window端的语音识别和语音合成的功能,在上一篇博文里已经详细说明了微软Azure语音服务的代码实现。也是为了实现一次代码,多端复用这样的诉求,所以全部的代码实现都改成了web api的方式。然而在实测发布到webgl的时候,就发现

    2024年02月16日
    浏览(45)
  • post请求:前端传递数组到后端,后端顺利接受数组

      可能需要解释的地方:deletePicture是一个数组。 后端采用@requestBody注解+JSONArray来接受前端数组(测试过了,确实可以接收)  ①前端采用JSON.string将对象转化为字符串 ②后端采用@requestbody注解+JSONArray类(hutool工具类里面的一个类)来接受前端传递过来的数组 一些废话:本

    2024年02月14日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包