Vue+ElementUi实现录音播放上传及处理getUserMedia报错问题

1.Vue安装插件

npm install --registry=https://registry.npmmirror.com

2.Vue页面使用

<template><div class="app-container"><!-- header --><el-header class="procedureHeader" style="height: 20px;"><el-divider content-position="left"><h3><el-link type="primary" style="background-color: rgba(255, 255, 255, 0.5);">语音识别</el-link></h3></el-divider></el-header><el-row><!-- 左侧语音录制区域--><el-col :span="12"><div class="asr-left"><el-input v-model="asrName" placeholder="请输入内容" size="small"style="width: 192px;margin-left: 20px;margin-top: 20px;"></el-input><el-input type="textarea" :rows="34" placeholder="请开始录音" v-model="asrData" size="small" :readonly="true" style="margin-left: 20px;margin-top: 20px;width: 94%;"></el-input><div style="display: -webkit-box;"><div style="margin-left: 18px;margin-top: 20px;margin-bottom: 10px;width: 82%;"><span style="color: #303133;">时长:</span><span style="color: #303133;">{{convertSecondsToHMS(recorder.duration.toFixed(4))}}</span><span title="开始录音" class="asr-btn" style="margin-left: 67%;" v-if="startRecord" @click="handleStartRecord"><i class="el-icon-microphone"></i></span><span title="录音中" class="asr-btn" style="color: #1890ff;margin-left: 67%;"  v-if="recordIng" @click="handleRecordIng"><i class="el-icon-mic"></i></span><span title="播放录音" class="asr-btn" v-if="playRecord" @click="handlePlayRecord"><i class="el-icon-video-play"></i></span><span title="播放中" class="asr-btn" v-if="playRecordIng" @click="handlePlayRecordIng"><i class="el-icon-video-pause"></i></span><span title="结束录音" class="asr-btn" style="color: red;" @click="handleStopRecord"><i class="el-icon-switch-button" style="font-weight: 600;"></i></span></div><el-button type="primary" size="mini" style="margin-top: 17px;" @click="handleRecord">开始识别</el-button></div></div></el-col><!-- 右侧语音识别结果展示区域 --><el-col :span="12" class="asr-right"><el-form :model="queryParams" ref="queryForm" size="small" :inline="true" label-width="68px" style="margin-top: 20px;"><el-form-item label="标题" prop="title"><el-inputv-model="queryParams.title"placeholder="请输入标题"clearable@keyup.enter.native="handleQuery"/></el-form-item><el-form-item><el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button><el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button></el-form-item></el-form><el-table v-loading="loading" :data="asrList" height="675"><el-table-column label="名称" align="center" prop="title" width="340" /><el-table-column label="创建时间" align="center" prop="createTime" /><el-table-column label="状态" align="center" width="100" prop="flag" :formatter="flagFormat"/><el-table-column label="操作" align="center" width="100" class-name="small-padding fixed-width"><template slot-scope="scope"><el-buttonsize="mini"type="text"icon="el-icon-edit"v-if="scope.row.flag == 2"@click="handleOpen(scope.row)">查看</el-button></template></el-table-column></el-table><paginationv-show="total>0":total="total":page.sync="queryParams.pageNum":limit.sync="queryParams.pageSize"@pagination="getList"/><!-- 查看语音识别信息弹窗 --><el-dialog :title="title" :visible.sync="open" width="600px" append-to-body><el-input type="textarea" :rows="34" placeholder="" v-model="asrCallbackData" size="small" :readonly="true" ></el-input></el-dialog></el-col></el-row></div>
</template>
<script>
import { listAsr,upload,getAsr } from "@/api/mam/asr";
import Recorder from 'js-audio-recorder';
let recorder = new Recorder();export default {name: "asr",data() {return {recorder: new Recorder({sampleBits: 16, // 采样位数,支持 8 或 16,默认是16sampleRate: 16000, // 采样率,支持 11025、16000、22050、24000、44100、48000,根据浏览器默认值,我的chrome是48000numChannels: 1, // 声道,支持 1 或 2, 默认是1compiling: false  //(0.x版本中生效,1.x增加中) 是否边录边转换,默认是false}),// 语音识别任务名称asrName: "",// 语音识别结果asrData: "",// 录音时长recordTime: "00:00:00",// 开始录音startRecord: true,// 录音中recordIng: false,// 播放录音playRecord: true,// 播放中playRecordIng: false,// 倒计时播放countdownTimer: null,// 任务轮询定时器taskTimer: null,// 总条数total: 0,// 语音识别表格数据asrList: [],// 遮罩层loading: true,// 查询参数queryParams: {pageNum: 1,pageSize: 20,taskid: null,assetid: null,fileid: null,title: null,content: null,createtime: null,creator: null,flag: null},// 弹出层标题title: "",// 是否显示弹出层open: false,// 弹出层数据asrCallbackData: ""}},created() {this.asrName= this.getNowTime();      this.getList();},methods: {/** 查询语音识别列表 */getList() {this.loading = true;listAsr(this.queryParams).then(response => {this.asrList = response.rows;this.total = response.total;this.loading = false;});},// 表单重置reset() {this.form = {id: null,taskid: null,assetid: null,fileid: null,title: null,content: null,createtime: null,creator: null,flag: null};this.resetForm("form");},/** 搜索按钮操作 */handleQuery() {this.queryParams.pageNum = 1;this.getList();},/** 重置按钮操作 */resetQuery() {this.resetForm("queryForm");this.handleQuery();},//任务状态格式化flagFormat(row, column){if(row.flag == 0){return "未开始";}else if(row.flag == 1){return "进行中";}else if(row.flag == 2){return "已完成";}else if(row.flag == 3){return "出错";}else{return "未知状态";}},// 打开弹出层handleOpen(row){this.title = row.title;this.open = true;this.asrCallbackData = row.content;},// 开始录音 handleStartRecord(){Recorder.getPermission().then(() => {if(this.asrData == "正在转写中..."){this.$message.warning('正在转写中...');}else{//开始录音时关闭录音播放this.playRecordIng = false;this.playRecord = true;this.recorder.pausePlay();this.recorder.start();; // 开始录音this.startRecord = false;this.recordIng = true;this.asrData = "信息采集中..."; }      },(error) => {this.$message({message: "请先允许该网页使用麦克风",type: "info",});console.log(`${error.name} : ${error.message}`);});},// 录音中handleRecordIng(){// this.recordIng = false;// this.startRecord = true;},// 播放录音handlePlayRecord(){if(this.recordIng ){this.$message.warning('信息采集中,请先结束录音后,再播放录音!');}else{if(this.recorder.size > 0){this.playRecord = false;this.playRecordIng = true;this.recorder.play();this.asrData = "正在播放采集信息...";//倒计时播放自动关闭this.countdown(this.recorder.duration);}else{this.$message.warning('请先录制音频!');}}},// 播放中handlePlayRecordIng(){this.playRecordIng = false;this.playRecord = true;this.recorder.pausePlay();},// 结束录音handleStopRecord(){if(this.asrData == "正在转写中..."){this.$message.warning('正在转写中...');}else{this.recordIng = false;this.startRecord = true;this.asrData = "信息采集结束...";this.recorder.stop();}},// 开始识别handleRecord(){//关闭录音this.recordIng = false;this.startRecord = true;this.recorder.stop();//关闭录音播放this.playRecordIng = false;this.playRecord = true;this.recorder.pausePlay();//识别console.log(this.recorder.size);if(this.recorder.size > 0){// 获取 WAV 数据(Blob)let blob =this.recorder.getWAVBlob()console.log(blob);let formData = new FormData()formData.append('file', blob)formData.append("asrTitle",this.asrName)upload(formData).then(response => {if(response.code == 200){this.asrData = "正在转写中...";//销毁实例this.recorder.destroy();this.msgSuccess('任务创建成功');this.asrName= this.getNowTime();this.taskPolling(response.msg);}});}else{this.$message.warning('请先录制音频!');}    },// 任务轮询taskPolling(id){this.taskTimer = setInterval(() => {//任务列表listAsr(this.queryParams).then(response => {this.asrList = response.rows;this.total = response.total;});//列表详情getAsr(id).then(response => {if(response.code == 200){if(response.data.flag == 2){this.asrData = response.data.content;clearInterval(this.taskTimer);this.msgSuccess('任务已完成');}}});}, 1000);},// 获取当前时间getNowTime() {const now = new Date();const year = now.getFullYear();const month = this.padNumber(now.getMonth() + 1);const day = this.padNumber(now.getDate());const hours = this.padNumber(now.getHours());const minutes = this.padNumber(now.getMinutes());const seconds = this.padNumber(now.getSeconds());return "语音识别-"+`${year}${month}${day}${hours}${minutes}${seconds}`;},padNumber(num) {return num < 10 ? '0' + num : num;},//秒数转为时分秒convertSecondsToHMS(seconds) {var date = new Date(null);date.setSeconds(seconds);var timeString = date.toISOString().substr(11, 8);return timeString;},//倒计时播放countdown(currentSeconds) {this.countdownTimer = setInterval(() => {currentSeconds--; // 每次间隔1秒,将秒数减少1if (currentSeconds < 0) {clearInterval(this.countdownTimer); // 当秒数小于等于0时清除定时器// console.log("倒计时结束");this.playRecordIng = false;this.playRecord = true;this.asrData = "采集信息播放结束...";} else {// console.log(`还有 ${seconds} 秒`);}}, 1000); // 设置定时器间隔为1秒(1000毫秒)}}
}
</script>
<style scoped lang="less">
/* 左侧语音录制区域 */
.asr-left {/*border: 1px solid #ebebeb;*/margin-left: 20px;
}/* header */
::v-deep .el-divider__text {background-color: unset;
}/* 右侧语音识别结果展示区域 */
.asr-right {}
/* 按钮 */
.asr-btn {cursor: pointer;margin-left: 15px;font-size: 20px;
}
</style>

3.效果图

4.注意使用127.0.0.1或者localhost与线上地址用Ip或者域名访问时不一样,因为getUserMedia在高版本的chrome下需要使用https。若仍需要使用,按下面步骤使用。

浏览器地址栏输入:

chrome://flags/#unsafely-treat-insecure-origin-as-secure

5.详细参考博主地址

https://www.cnblogs.com/badaoliumangqizhi/p/16711777.html

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

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

相关文章

vue2 接口文档

const assetmanagementIndex (params) > getAction("/asset/assetmanagementsystem/page", params); //资产管理制度表分页列表 const assetmanagementPost (params) > postAction("/asset/assetmanagementsystem", params); //资产管理制度表新增…

维护Nginx千字经验总结

Hello , 我是恒 。 维护putty和nginx两个项目好久了&#xff0c;用面向底层的思路去接触 在nginx社区的收获不少&#xff0c;在这里谈谈我的感悟 Nginx的夺冠不是偶然 高速:一方面&#xff0c;在正常情况下&#xff0c;单次请求会得到更快的响应&#xff1b;另一方面&#xff0…

从零开始学量化~Ptrade使用教程——安装与登录

PTrade交易系统是一款高净值和机构投资者专业投资软件&#xff0c;为用户提供普通交易、篮子交易、日内回转交易、算法交易、量化投研/回测/实盘等各种交易工具&#xff0c;满足用户的各种交易需求和交易场景&#xff0c;帮助用户提高交易效率。 运行环境及安装 操作系统&…

昇思25天学习打卡营第3天 | 数据集 Dataset

数据是深度学习的基础&#xff0c;高质量的数据输入将在整个深度神经网络中起到积极作用。MindSpore提供基于Pipeline的数据引擎&#xff0c;通过数据集&#xff08;Dataset&#xff09;和数据变换&#xff08;Transforms&#xff09;实现高效的数据预处理。其中Dataset是Pipel…

将数据切分成N份,采用NCCL异步通信,让all_gather+matmul尽量Overlap

将数据切分成N份,采用NCCL异步通信,让all_gathermatmul尽量Overlap 一.测试数据二.测试环境三.普通实现四.分块实现 本文演示了如何将数据切分成N份,采用NCCL异步通信,让all_gathermatmul尽量Overlap 一.测试数据 1.测试规模:8192*8192 world_size22.单算子:all_gather:0.035…

代理IP的10大误区:区分事实与虚构

在当今的数字时代&#xff0c;代理已成为在线环境不可或缺的一部分。它们的用途广泛&#xff0c;从增强在线隐私到绕过地理限制。然而&#xff0c;尽管代理无处不在&#xff0c;但仍存在许多围绕代理的误解。在本博客中&#xff0c;我们将探讨和消除一些最常见的代理误解&#…

人脑网络的多层建模与分析

摘要 了解人类大脑的结构及其与功能的关系&#xff0c;对于各种应用至关重要&#xff0c;包括但不限于预防、处理和治疗脑部疾病(如阿尔茨海默病或帕金森病)&#xff0c;以及精神疾病(如精神分裂症)的新方法。结构和功能神经影像学方面的最新进展&#xff0c;以及计算机科学等…

OBS 免费的录屏软件

一、下载 obs 【OBS】OBS Studio 的安装、参数设置和录屏、摄像头使用教程-CSDN博客 二、使用 obs & 输出无黑屏 【OBS任意指定区域录屏的方法-哔哩哔哩】 https://b23.tv/aM0hj8A OBS任意指定区域录屏的方法_哔哩哔哩_bilibili 步骤&#xff1a; 1&#xff09;获取区域…

012-GeoGebra基础篇-构造圆的切线

前边文章对于基础内容已经悉数覆盖了&#xff0c;这一篇我就不放具体的细节&#xff0c;若有需要可以复刻一下 目录 一、成品展示二、算式内容三、正确性检查五、文章最后 一、成品展示 二、算式内容 A(0,0) B(3,0) c: Circle(A,B) C(5,4) sSegment(A,C) DMidpoint(s) d: Circ…

k8s部署单节点redis

一、configmap # cat redis-configmap.yaml apiVersion: v1 kind: ConfigMap metadata:name: redis-single-confignamespace: redis data:redis.conf: |daemonize nobind 0.0.0.0port 6379tcp-backlog 511timeout 0tcp-keepalive 300pidfile /data/redis-server.pidlogfile /d…

全网小视频去水印接口使用说明

一、请求地址&#xff1a; https://www.lytcreate.com/api/qsy/ 二、请求方式&#xff1a;POST 三、请求体&#xff1a;JSON body {"token": "个人中心的token","url": "视频分享地址"} token获取地址&#xff0c;访问&#xff…

uniapp微信小程序使用xr加载模型

1.在根目录与pages同级创建如下目录结构和文件&#xff1a; // index.js Component({properties: {modelPath: { // vue页面传过来的模型type: String,value: }},data: {},methods: {} }) { // index.json"component": true,"renderer": "xr-frame&q…

软降工程学系统实现

一、程序编码 程序编码是设计的继续&#xff0c;将软件设计的结果翻译成用某种程序设计语言描述的源代码。 程序编码涉及到方法、工具和过程。 程序设计风格和程序设计语言的特性会深刻地影响软件的质量和可维护性。 要求源程序具有良好的结构性和设计风格。 程序设计风格…

【web3】分享一个web入门学习平台-HackQuest

前言 一直想进入web3行业&#xff0c;但是没有什么途径&#xff0c;偶然在电鸭平台看到HackQuest的共学营&#xff0c;发现真的不错&#xff0c;并且还接触到了黑客松这种形式。 链接地址&#xff1a;HackQuest 平台功能 学习路径&#xff1a;平台有完整的学习路径&#xff…

【聊聊原子性,中断,以及nodejs中的具体示例】

什么是原子性 从一个例子说起&#xff0c; x &#xff0c;读和写 &#xff0c; 如图假设多线程&#xff0c;线程1和线程2同时操作变量x&#xff0c;进行x的操作&#xff0c;那么由于写的过程中&#xff0c;都会先读一份x数据到cpu的寄存器中&#xff0c;所以这个时候cpu1 和 c…

MyBatis-plus(下)

目录 静态工具 逻辑删除 枚举处理器 ​编辑​编辑JSON处理器 分页插件 案例 静态工具 只有save与update不需要传class字节码 UserController: MyServiceImpl: 改造根据id批量查询用户的接口&#xff0c;查询用户的同时&#xff0c;查询出用户对应的所有地址 Overrid…

容器内存

一、容器内存概述 容器本质上还是一个进程&#xff0c;是一个被隔离和限制的进程。因此容器内存和进程内存在表现形式上其实是一样的&#xff0c;这块主要涉及三部分内容&#xff1a;RSS&#xff0c;page cache和swap这三部分&#xff0c;容器基于memory Cgroup对内存进行限制…

Linux驱动开发实战宝典:设备模型、模块编程、I2C/SPI/USB外设精讲

摘要: 本文将带你走进 Linux 驱动开发的世界,从设备驱动模型、内核模块开发基础开始,逐步深入 I2C、SPI、USB 等常用外设的驱动编写,结合实际案例,助你掌握 Linux 驱动开发技能。 关键词: Linux 驱动,设备驱动模型,内核模块,I2C,SPI,USB 一、Linux 设备驱动模型 Li…

2024 COMMUNITY DAY User Group 社区嘉年华 云计算与 AI 技术交融盛会共筑多元智慧未来

亚马逊云科技User Group&#xff0c;深圳 Community Day 活动流程抢先知道&#xff01; ⏰ 7月7日 &#x1f3e0; 深圳南山区香港中文大学 &#x1f4e3;主论坛国际大咖云集&#xff0c;共襄科技盛宴&#xff01; &#x1f389;三大主题论坛&#xff1a;人工智能、大数据、动…

MyBatis系列三: XxxMapper.xml-SQL映射文件

XxxMapper.xml-SQL映射文件 官方文档基本介绍详细说明基本使用parameterType(输入参数类型)传入HashMapresultMap(结果集映射) 官方文档 文档地址: https://mybatis.org/mybatis-3/zh_CN/sqlmap-xml.html 基本介绍 1.MyBatis的真正强大在于它的语句映射(在XxxMapper.xml配置…