【前端 vue 或者麥克風,智能語音識別和播放功能】

前端 vue 或者麥克風,智能語音識別和播放功能

1. 終端安裝
npm install recordrtc
2.引入
import RecordRTC from 'recordrtc'
3.html(根據自己業務更改)
<div class="Page"><el-form ref="mainFormRef" class="mainForm" :model="main_form" label-width="100px" label-position="top"><el-form-item :label="'熱詞設置:\n(一行一個關鍵字,空格隔開權重,如將1號屏和3號屏調換 20)'"><el-input type="textarea" v-model="main_form.hotWords" placeholder="請輸入熱詞":autosize="{ minRows: 5, maxRows: 15 }"></el-input></el-form-item><el-form-item label="語音識別結果顯示:"><div :class="resultDetails && resultDetails.status <= 0 ? 'result_content r_h_input_red' : 'result_content'">{{main_form.result }}</div></el-form-item><el-form-item label="聲紋采集:" prop="file"><div class="voiceGather_btn"><el-select :disabled="voiceStatus" style="width: 100%" v-model="main_form.chooseMicDeviceId"placeholder="請選擇麥克風"><el-option v-for="item in Mic" :key="item.deviceId" :label="item.label" :value="item.deviceId"></el-option></el-select><div class="voiceGather" v-if="main_form.chooseMicDeviceId != ''"><el-button style="margin-left: 20px" @click="voiceInput" :loading="startLoading">{{ voiceStatus ? "取消錄音" :"開始錄音" }}</el-button></div></div><div class="voiceGather_btn"><audio controls v-if="recordedBlob" :src="recordedBlob"></audio></div></el-form-item></el-form></div>
4.data初始化數據
data() {return {recorder: '',voiceStatus: false, // 是否正在錄音main_form: {chooseMicDeviceId: '', // 選擇的麥克風idhotWords: '', // 熱詞result: '', // 語音識別結果},Mic: [], // 可選擇的麥克風RMSList: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0,],audioURL: null,file: null,resultDetails: {},//語音識別結果startLoading: false,recordedBlob: null, // Blob對象存儲錄制內容};},
5.mounted獲取getMic
mounted() {this.getMic()
}
6.methods中開始錄音和結束之后上傳到后臺服務器
methods() {getMic() {let that = this;if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {// 彈框獲取麥克風navigator.mediaDevices.getUserMedia({ audio: true }).then((stream) => {navigator.mediaDevices.enumerateDevices().then(function (devices) {devices.forEach(function (device) {if (device.kind === 'audioinput') { // 麥克風if (device.deviceId != 'default' && device.deviceId != 'communications') {that.Mic.push(device)}}that.main_form.chooseMicDeviceId = that.Mic[0] ? that.Mic[0].deviceId : ''});})stream.getTracks().forEach(track => track.stop());})}},// 語音輸入點擊按鈕事件voiceInput() {// 正在語音輸入if (this.voiceStatus) {this.stopRecord() // 停止輸入} else { // 開啟語音輸入this.resultDetails ={}this.main_form.result = ''this.recordedBlob = nullthis.startRecord()}},// 開始錄音startRecord() {console.log('startRecord:鼠標摁下------------------------------')var that = thisthis.voiceStatus = true// mediaDevices可提供對相機和麥克風等媒體輸入設備的連接訪問window.navigator.mediaDevices.getUserMedia({ audio: { deviceId: this.main_form.chooseMicDeviceId } }).then((stream) => {this.stream = stream;this.getVoice()this.recorder = RecordRTC(stream, {type: 'audio',// 音頻 或者videomimeType: 'audio/wav',recorderType: RecordRTC.StereoAudioRecorder,desiredSampRate: 16000,numberOfAudioChannels: 1, // 單聲道timeSlice: 1000,// bufferSize: 4096, // 緩存大小ondataavailable: this.sendData,});this.recorder.startRecording();}).catch(function (err) {alert('當前瀏覽器不支持開啟麥克風!');that.voiceStatus = false});},// 獲取到文件流(沒用到這個函數內容,可以忽略)sendData(blob) {return//var BB = new Blob([blob], { 'type': 'audio/wav; codecs=opus' })// var audioURL = window.URL.createObjectURL(BB)// 播放// const audio = document.createElement('audio')// audio.controls = true // 音頻是否顯示控件// audio.src = audioURL// audio.play()// 下載// let a = document.createElement("a");// a.href = audioURL;// a.download = '測試';// a.click();// // 釋放這個臨時的對象url// window.URL.revokeObjectURL(audioURL);// let file = new window.File([BB], '測試.wav')// this.file = file// console.log('錄音已停止,文件已保存---------------------', this.file);},// 結束錄音stopRecord() {console.log('stopRecord:鼠標放開------------------------------')if (this.recorder != null) {this.startLoading = truelet recorder = this.recorder// 處理停止事件recorder.stopRecording(() => {const blob = this.recorder.getBlob(); // 獲取Blob對象this.recordedBlob = URL.createObjectURL(blob);// 創建URL對象,用于<audio>標簽播放// console.log('錄音已停止,文件已保存---------------------', this.recordedBlob);var BB = new Blob([blob], { 'type': 'audio/wav; codecs=opus' })let file = new window.File([BB], '測試.wav')this.file = fileconsole.log('獲取到文件流上傳到后臺---------------------', this.file);this.uploadSubmit();});let stream = this.stream;clearInterval(this.timer1);stream.getAudioTracks().forEach(track => track.stop());}},// 上傳到后臺服務器uploadSubmit() {uploadAudio(this.file, this.main_form.hotWords).then(res => {this.resultDetails = res.data.data || {}this.main_form.result = res.data.data.result || ''this.voiceStatus = falsethis.startLoading = false}).catch(err => {this.voiceStatus = falsethis.startLoading = false})},// 獲取音量值大小getVoice() {const audioContext = new (window.AudioContext || window.webkitAudioContext)()// 將麥克風的聲音輸入這個對象const mediaStreamSource = audioContext.createMediaStreamSource(this.stream)// 創建分析節點const analyserNode = audioContext.createAnalyser()// 連接節點mediaStreamSource.connect(analyserNode)// 可以實時聽到麥克風采集的聲音// analyserNode.connect(audioContext.destination)// 獲取音量數據const dataArray = new Uint8Array(analyserNode.frequencyBinCount);function getVolume() {analyserNode.getByteFrequencyData(dataArray);let sum = 0;for (let i = 0; i < dataArray.length; i++) {sum += dataArray[i];}// 計算平均音量const averageVolume = sum / dataArray.length;return averageVolume;}// 每隔一段時間獲取一次音量this.timer1 = setInterval(() => {const volume = getVolume();console.log('音量:', Math.round(volume));// this.RMSList.value.unshift(Math.round(volume));// this.RMSList.value.pop();// 在這里可以根據需要進行相應的處理}, 1000);},
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/898733.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/898733.shtml
英文地址,請注明出處:http://en.pswp.cn/news/898733.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

bootstrap 表格插件bootstrap table 的使用經驗談!

最近在開發一個物業管理軟件&#xff0c;其中用到bootstrap 的模態框。同時需要獲取表格數據。用傳統的方法&#xff0c;本人不想用&#xff0c;考慮到bootstrap應該有獲取表格數據的方法&#xff0c;結果發現要想實現獲取表格數據功能&#xff0c;需要通過bootstrap的插件實現…

HTML 圖像與多媒體元素:拓展學習邊界的進度記錄(一)

開篇&#xff1a;學習啟程 在前端開發的廣袤領域中&#xff0c;HTML 作為構建網頁的基石&#xff0c;其重要性不言而喻。而 HTML 圖像與多媒體元素&#xff0c;就像是為這座基石添上了絢麗的色彩與靈動的音符&#xff0c;賦予網頁更加豐富的表現力和交互性。作為一名熱衷于探索…

循環不變量原則——螺旋矩陣

題目&#xff1a;螺旋矩陣 本題相較于螺旋矩陣II的不同之處是&#xff1a;螺旋矩陣II的矩陣是n行n列的方陣&#xff0c;而本題的矩陣并不一定是方陣。所以在遵循循環不變量原則遍歷完矩陣后&#xff0c;還會有一行或者一列沒有遍歷。 1、行多列少&#xff08;多一列沒遍歷&am…

【前端】Visual Studio Code安裝配置教程:下載、漢化、常用組件、基本操作

文章目錄 一、Visual Studio Code下載二、漢化三、常用組件1、Auto Rename Tag2、view-in-browser3、Live Server 四、基本操作五、感謝觀看&#xff01; 一、Visual Studio Code下載 下載官網&#xff1a;https://code.visualstudio.com/ 進入官網后點擊右上角的Download &…

Java對象的hashcode

在 Java 中&#xff0c;hashcode 和 equals 方法是 Object 類的兩個重要方法&#xff0c;它們在處理對象比較和哈希集合&#xff08;如 HashMap、HashSet&#xff09;時起著關鍵作用。對于equals大部分Java程序員都不陌生&#xff0c;它通常是比較兩個對象的內容(值)是否相等(雙…

Ubuntu22.04通過DKMS包安裝Intel WiFi系列適配器(網卡驅動)

下載驅動包 訪問 backport-iwlwifi-dkmshttps://launchpad.net/ubuntu/source/backport-iwlwifi-dkms 網站&#xff0c;找到適用于Ubuntu 22.04的update版本&#xff08;如backport-iwlwifi-dkms_xxxx_all.deb&#xff09;&#xff0c;下載至本地。 安裝驅動 在下載目錄中執行以…

深度學習--概率

1 基本概率論 1.1 假設我們擲骰子&#xff0c;想知道1而不是看到另一個數字的概率&#xff0c;如果骰子是公司&#xff0c;那么所有6個結果(1..6),都有相同的可能發生&#xff0c;因此&#xff0c;我們可以說1發生的概率為1/6. 然而現實生活中&#xff0c;對于我們從工廠收到的…

kaggle上經典泰坦尼克項目數據分析探索

之前了解在kaggle上這個項目很火&#xff0c;最近想要加強一下python數據分析&#xff0c;所以在kaggle上找到這個項目進行學習探索&#xff0c;下面是將一些學習資料以及過程整理出來。 一、首先我們了解一下項目背景以及如何找到這個項目。 kaggle項目地址: https://www.k…

《深度剖析:鴻蒙系統不同終端設備的UI自適應布局策略》

在萬物互聯的時代&#xff0c;鴻蒙系統以其獨特的分布式理念和強大的技術架構&#xff0c;迅速在智能終端領域嶄露頭角。隨著鴻蒙生態的不斷壯大&#xff0c;越來越多的開發者投身其中&#xff0c;致力于為用戶打造豐富多樣的應用體驗。然而&#xff0c;如何讓應用在不同終端設…

計算機網絡的軟件、硬件和組成

&#xff11;.計算機網絡的組成 計算機網絡是一個十分復雜的系統&#xff0c;在邏輯上可以分為完成數據通信的通信子網和進行數據處理的資源子網兩個部分。 通信子網 通信子網提供網絡通信的功能&#xff0c;可以完成網絡主機之間的數據傳輸、交換、通信控制和信號變換等通信…

告別低效人工統計!自動計算計劃進度

實時監控任務進度一直是項目管理中的一項巨大挑戰。 人工統計方式不僅耗時耗力&#xff0c;而且往往由于信息傳遞的延遲和人為誤差&#xff0c;導致無法實時獲得準確的項目進展信息。 這種不準確性可能掩蓋潛在的風險點&#xff0c;從而影響項目的整體進度和成果。 Ganttable …

樓宇自控系統的結構密碼:總線與分布式結構方式的差異與應用

在現代建筑中&#xff0c;為了實現高效、智能的管理&#xff0c;樓宇自控系統變得越來越重要。它就像建筑的 智能管家&#xff0c;可自動控制照明、空調、通風等各種機電設備&#xff0c;讓建筑運行更順暢&#xff0c;還能節省能源成本。而在樓宇自控系統里&#xff0c;有兩種關…

OpenWrt開發第4篇:設置開發板的IP-基于Raspberry Pi 4B開發板

文/指尖動聽知識庫-谷谷 文章為付費內容,商業行為,禁止私自轉載及抄襲,違者必究!!! 文章專欄:Openwrt開發-基于Raspberry Pi 4B開發板 有時候開發過程中經常會使用其他路由器,很多時候固件燒上去之后板子IP基本都是192.168.1.1,這時就需要修改板子的IP,下面介紹一下板…

Node.js系列(4)--微服務架構實踐

Node.js微服務架構實踐 &#x1f504; 引言 微服務架構已成為構建大規模Node.js應用的主流選擇。本文將深入探討Node.js微服務架構的設計與實現&#xff0c;包括服務拆分、服務治理、通信機制等方面&#xff0c;幫助開發者構建可擴展的微服務系統。 微服務架構概述 Node.js…

Docker逃逸

判斷是否再docker中 1.ls -a / (查看c根目錄查看是否有docker配置文件) 2.查看進程 如果在要逃逸到真實環境中&#xff1a; 特權模式進行docker逃逸&#xff1a;管理員執行eddocker run--privileg&#xff0c;如何判斷是否是特權模式&#xff08;&#xff09; 特權模式以…

Vite管理的Vue3項目中monaco editer的使用以及組件封裝

文章目錄 背景環境說明安裝流程以及組件封裝引入依賴封裝組件 外部使用實現效果 v-model實現原理 背景 做oj系統的時候,需要使用代碼編輯器,決定使用Monaco Editor&#xff0c;但是因為自身能力問題&#xff0c;讀不懂官網文檔&#xff0c;最終結合ai和網友的帖子成功引入&…

pdf文件分頁按需查看

pdf預覽本來打算粗暴點&#xff0c;一次性查看全部&#xff0c;但是一個pdf四五百頁導致手機端查看超出內存直接崩掉&#xff0c;崩掉會導致頁面瘋狂刷新&#xff0c;所以不得不進行優化 解決思路大致如下&#xff1a; canvas轉為blob格式以圖片的形式加載在頁面&#xff08;B…

算力100問?第92問:為什么各地熱衷建設算力中心?

目錄 1、宏觀分析 2、政府角度分析 3、投資者角度分析 在數字化浪潮中,各地對算力中心建設的熱情高漲,這一現象背后潛藏著諸多深層次的原因,涵蓋了經濟、科技、社會等多個維度,且彼此交織,共同驅動著這一發展趨勢。 1、宏觀分析 從經濟結構轉型的底層邏輯來看,全球經…

Redis 內存管理

Redis 內存管理 1. Redis 給緩存數據設置過期時間的作用 給緩存數據設置過期時間&#xff08;TTL, Time-To-Live&#xff09;有以下幾個重要作用&#xff1a; (1) 自動釋放內存 避免緩存數據無限增長&#xff0c;導致 Redis 內存溢出。例如&#xff0c;在 會話管理、短連接…

PyCharm中使用pip安裝PyTorch(從0開始僅需兩步)

無需 anaconda&#xff0c;只使用 pip 也可以在 PyCharm 集成環境中配置深度學習 PyTorch。 本文全部信息及示范來自 PyTorch 官網。 以防你是super小白&#xff1a; PyCharm 中的命令是在 Python Console 中運行&#xff0c;界面左下角豎排圖標第一個。 1. 安裝前置包 numpy …