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.pswp.cn/diannao/39486.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/39486.shtml
英文地址,請注明出處:http://en.pswp.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…

Element-plus點擊當前行之后獲取數據顯示跟隨行數據

要實現點擊當前行后&#xff0c;在當前行的下方顯示數據&#xff0c;可以通過以下步驟來實現&#xff1a; 在表格的行點擊事件中獲取當前點擊行的位置信息。根據位置信息動態計算并設置需要顯示數據區域的位置。 下面是一個更新后的示例代碼&#xff0c;演示如何在 Element-P…

Unity 引擎收費模式變革:游戲開發者的挑戰與機遇

Unity 引擎作為游戲開發領域中的重要工具&#xff0c;近日宣布將在 2024 年 1 月 1 日起根據游戲安裝量對開發者進行收費。這一決定引起了業界的廣泛關注和討論。據 Unity 技術博客發布的《Unity 收費模式和配套服務更新》一文&#xff0c;他們選擇這種計費方式是基于每次游戲被…

PHP和phpSpider:如何應對網站變動導致的數據爬取失敗?

php和phpspider&#xff1a;如何應對網站變動導致的數據爬取失敗&#xff1f; 導語&#xff1a; 網絡爬蟲是一種自動化程序&#xff0c;用于從網站上獲取數據并進行處理。PHP是一種廣泛使用的編程語言&#xff0c;而phpSpider是一個基于PHP的開源網絡爬蟲框架。然而&#xff0…

軟降工程學系統實現

一、程序編碼 程序編碼是設計的繼續&#xff0c;將軟件設計的結果翻譯成用某種程序設計語言描述的源代碼。 程序編碼涉及到方法、工具和過程。 程序設計風格和程序設計語言的特性會深刻地影響軟件的質量和可維護性。 要求源程序具有良好的結構性和設計風格。 程序設計風格…

開啟IT世界的探索之旅——致有志于踏入IT領域的高考少年們

高考已成過去&#xff0c;而前方是無限可能的未來。對于那些有志于進入IT領域的高考生來說&#xff0c;這個暑假是你們開啟探索IT世界的絕佳時機。作為一名從事C#軟件開發的專業人員&#xff0c;我希望能通過這篇文章&#xff0c;分享一些學習路線圖和經驗心得&#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…