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

news2024/12/28 5:49:01

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. 示例
    在这里插入图片描述

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

本文参考文章(做了部分修改):https://blog.csdn.net/IAIPython/article/details/134611674

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1460408.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java后端底座从无到有的搭建(随笔)

文章目录 开发模式的演变草创时期1.0时期&#xff08;基座时期&#xff09;1.1时期&#xff08;低代码时期&#xff09;2.0时期&#xff08;无代码时期&#xff09; 前言&#xff1a;本文是笔者在初创公司&#xff0c;一年多来Java后端服务底座搭建过程的总结&#xff0c;如有不…

2024三掌柜赠书活动第十一期:精通区块链开发技术(第2版)

目录 前言关于区块链开发技术关于《精通区块链开发技术(第2版)》编辑推荐内容简介作者简介图书目录书中前言/序言《精通区块链开发技术(第2版)》全书速览结束语 前言 作为开发者经常在技术圈活动&#xff0c;会接触各种前沿技术&#xff0c;比如区块链技术的崛起引发了全球范…

报Error:java: 无效的目标发行版: 11的解决方法

step1. 打开文件下的Project Structure 如下图&#xff1a; 把红色框中的改为你目前的jdk版本&#xff0c;我现在为jdk8,所以改为1.8 step2. 继续打开 Modules 模块修改每个项目中的 language level.切记是每个项目 step3. 打开文件下的settings&#xff0c;继续修改如…

华媒舍:10种小红书推广品牌形象打造出的方式

小红书已成为我国最热门的购物推荐平台之一。不单单是用户数量众多&#xff0c;小红书也算得上是一个优质的品牌品牌形象打造平台。下面我们就详细介绍10种小红书推广渠道品牌形象打造出方式&#xff0c;帮助品牌在小红书上取得更好的营销效果。 1.掌握产品在小红书上进行宣传以…

基于Java SSM框架实现网上拍卖系统项目【项目源码】计算机毕业设计

基于java的SSM框架实现网上拍卖系统演示 JSP技术介绍 JSP技术本身是一种脚本语言&#xff0c;但它的功能是十分强大的&#xff0c;因为它可以使用所有的JAVA类。当它与JavaBeans 类进行结合时&#xff0c;它可以使显示逻辑和内容分开&#xff0c;这就极大的方便了用户的需求。…

Spring面试(一)

现在基本上企业开发标配都是Spring5Springboot2Jdk7 1.Spring的优点 IOC和DI的支持&#xff1a;Spring的核心是一个工厂容器&#xff0c;可以维护所有对象的创建和依赖关系&#xff0c;Spring工厂用于生成bean&#xff0c;并且管理Bean的生命周期&#xff0c; 实现高内聚低耦…

2024年黑龙江省考公告出来了,招7768人,速速查收报名流程!

✔️报名时间&#xff1a;2024年2月19日9:00至2月23日17:00 ✔️资格审查时间&#xff1a;至2024年2月23日17:00 ✔️缴费时间&#xff1a;至2024年2月25日09&#xff1a;00 ✔️打印准考证时间&#xff1a;2024年3月12日9&#xff1a;00至3月17日9&#xff1a;00 ✔️公共科目…

Android 面试问题 2024 版(其一)

Android 面试问题 2024 版&#xff08;其一&#xff09; 一、Java 和 Kotlin二、安卓组件三、用户界面 (UI) 开发四、安卓应用架构五、网络和数据持久性 一、Java 和 Kotlin Java 中的抽象类和接口有什么区别&#xff1f; 答&#xff1a;抽象类是不能实例化的类&#xff0c;它…

使用AndroidStudio调试Framework

1.前言 最近在工作过程中&#xff0c;涉及到FW的一些修改&#xff0c;比如PhoneWindowManager&#xff0c;只能通过加日志看打印的方式查看一些内容&#xff0c;比较低效&#xff0c;所以想了解一下FW的调试方式&#xff0c;后来发现AS就可以调试FW.我平时都是在Docker服务器编…

NodeJs 第二十四章 CSRF攻击和防御

Cross Site Request Forgery(CSRF) 跨站请求伪造是一种攻击&#xff0c;它迫使最终用户在其当前经过身份验证的 Web 应用程序上执行不需要的操作&#xff0c;例如转移资金、更改电子邮件地址等。 例如&#xff0c;这些非预期请求可能是通过在跳转链接后的 URL 中加入恶意参数来…

Spring Bean 的生命周期了解么?

Spring Bean 的生命周期基本流程 一个Spring的Bean从出生到销毁的全过程就是他的整个生命周期, 整个生命周期可以大致分为3个大的阶段 : 创建 使用 销毁 还可以分为5个小步骤 : 实例化(Bean的创建) , 初始化赋值, 注册Destruction回调 , Bean的正常使用 以及 Bean的销毁 …

人工智能_CPU安装运行ChatGLM大模型_安装清华开源人工智能AI大模型ChatGlm-6B_004---人工智能工作笔记0099

上一节003节我们安装到最后,本来大模型都可以回答问题了,结果, 5分钟后给出提示,需要GPU,我去..继续看官网,如何配置CPU运行 没办法继续看: https://github.com/THUDM/ChatGLM-6B 这里是官网可以看到 需要gcc的版本是11.3.0,这里我们先没有去安装,直接试试再说 yum instal…

jenkins配置ssh的时候测试连接出现Algorithm negotiation fail

背景&#xff1a;当jenkins升级后&#xff0c;同时ssh插件也升级&#xff0c;测试ssh连接的时候 出现的问题&#xff1a; com.jcraft.jsch.JSchAlgoNegoFailException: Algorithm negotiation fail: algorithmName"server_host_key" jschProposal"ecdsa-sha2-n…

Linux环境搭建Jenkins(详细图文)

目录 简介Jenkins 特点 一、环境准备 1.jdk环境准备 2.maven环境准备 3.git环境准备 二、安装部署Jenkins&#xff08;采用war包方式&#xff09; 1.下载Jenkins ​2.启动war包 1&#xff09;将下载好的Jenkins的war包上传到服务器上 2&#xff09;编辑启动脚本,方便…

Go语言的100个错误使用场景(48-54)|错误管理

前言 大家好&#xff0c;这里是白泽。**《Go语言的100个错误以及如何避免》**是最近朋友推荐我阅读的书籍&#xff0c;我初步浏览之后&#xff0c;大为惊喜。就像这书中第一章的标题说到的&#xff1a;“Go: Simple to learn but hard to master”&#xff0c;整本书通过分析1…

SpringBoot项目如何打包成docker镜像?

将Spring Boot项目打包成Docker镜像的过程可以分为以下几个步骤&#xff1a; 1. 创建Dockerfile 首先&#xff0c;你需要在Spring Boot项目的根目录下创建一个Dockerfile。这个文件包含了Docker镜像构建的所有指令。一个基本的Dockerfile可能看起来像这样&#xff1a; # 使用…

flink sql 实战实例 及延伸问题:聚合/数据倾斜/DAU/Hive流批一体 等

flink sql 实战实例 及延伸问题 Flink SQL 计算用户分布Flink SQL 计算 DAU多topic 数据更新mysql topic接入mysql引入 upsert-kafka-connector 以1.14.4版本为例 数据倾斜问题&#xff1a;让你使用用户心跳日志&#xff08;20s 上报一次&#xff09;计算同时在线用户、DAU 指标…

Github代码仓库SSH配置流程

作者&#xff1a; Herman Ye Auromix 测试环境&#xff1a; Ubuntu20.04 更新日期&#xff1a; 2024/02/21 注1&#xff1a; Auromix 是一个机器人爱好者开源组织。 注2&#xff1a; 由于笔者水平有限&#xff0c;以下内容可能存在事实性错误。 相关背景 在为Github代码仓库配…

秦岭天台山隧道群荣获交通运输部科技示范工程,恒星科通群载波应急广播与无线调度系统产品应用其中

2023年9月12日&#xff0c;全国交通运输科技示范工程现场推进会在河南省平顶山市召开&#xff0c;会上为全国已通过验收的10项科技示范工程进行了授牌&#xff0c;其中由陕西交控集团负责实施的“秦岭天台山超长隧道群安全绿色科技示范工程”名列其中。 该科技示范工程为陕西省…

2024牛客寒假算法基础集训营4(视频讲解题目)

2024牛客寒假算法基础集训营4&#xff08;视频讲解题目&#xff09; 视频链接ABCDEFG、H&#xff08;下面是hard版本的代码两个都可以过&#xff09; 视频链接 2024牛客寒假算法基础集训营4&#xff08;视频讲解题目&#xff09; A #include<bits/stdc.h> #define en…