update,添加语音转文字测试

This commit is contained in:
hzz 2024-01-05 16:25:49 +08:00
parent 2fd416dc34
commit e266ea8e52
6 changed files with 235 additions and 1 deletions

View File

@ -18,6 +18,7 @@
"echarts-liquidfill": "^3.1.0", "echarts-liquidfill": "^3.1.0",
"element-plus": "^2.3.0", "element-plus": "^2.3.0",
"pinia": "^2.0.30", "pinia": "^2.0.30",
"recorder-core": "^1.3.23122400",
"register-service-worker": "^1.7.2", "register-service-worker": "^1.7.2",
"swiper": "^9.0.5", "swiper": "^9.0.5",
"three": "^0.150.1", "three": "^0.150.1",

View File

@ -0,0 +1,6 @@
import {get,post,} from "@/utils/http"
//url
export function postwavUpload(data:any){
return get('/screen/voice2Text/getFileText',data)
}

View File

@ -7,7 +7,7 @@
* *
* 版权信息 : 2023 by ${}, All Rights Reserved. * 版权信息 : 2023 by ${}, All Rights Reserved.
*/ */
import {get,post} from "@/utils/http" import {get,post,postupLoad} from "@/utils/http"
//报警数据 //报警数据
export function getAlarmListData(data:any){ export function getAlarmListData(data:any){
@ -17,3 +17,8 @@ export function getAlarmListData(data:any){
export function getAlarmListHistoryData(data:any){ export function getAlarmListHistoryData(data:any){
return get('/screen/alarm/getAlarmListHistory',data) return get('/screen/alarm/getAlarmListHistory',data)
} }
//文件上传
export function upload(data:any){
return postupLoad('/common/upload',data)
}

View File

@ -304,6 +304,11 @@ const routes: Array<RouteRecordRaw> = [
name: "Elevator", name: "Elevator",
component: () => import("../views/Elevator/index.vue"), component: () => import("../views/Elevator/index.vue"),
}, },
{
path: "/Recorder",
name: "Recorder",
component: () => import("../views/Recorder/index.vue"),
},

View File

@ -175,3 +175,34 @@ export function post(staurl: string, data: any = "", method: string = "POST") {
} }
export function postupLoad(staurl: string, data: any = "", method: string = "POST") {
let _url = url + staurl //+ "?" + strData;
let METHOD = method || "POST"
let header = { //请求头设置
"Content-Type": "multipart/form-data"
}
return new Promise((resolve, rejects) => {
let params: any = {}
// 处理表单结果中文件的操作
axios({
url: _url,
method: METHOD,
data: data,
headers: header
}).then(function (res) {
// console.log(val) // axios会对我们请求来的结果进行再一次的封装 让安全性提高
resolve(res.data)
}).catch(function (err) {
// console.log(err)
rejects(err)
})
})
}

View File

@ -0,0 +1,186 @@
<template>
<div class="container">
<div>
<div > <!-- 按钮 -->
<!-- <button @click="recOpen">打开录音,请求权限</button> -->
| <el-button type="success" size="large" @click="recOpen">开始录音</el-button>
<el-button type="warning" size="large" @click="recStop">结束录音</el-button>
| <el-button type="primary" size="large" @click="recPlay">本地试听</el-button>
</div>
<div style="padding-top:5px"> <!-- 波形绘制区域 -->
<div style="border:1px solid #ccc;display:inline-block;vertical-align:bottom">
<div style="height:300px;width:600px;" ref="recwave"></div>
</div>
<div class="text">{{ text }}</div>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue'
//
import Recorder from 'recorder-core'
//wavjs
import 'recorder-core/src/engine/wav'
// import 'recorder-core/src/engine/wav-engine'
//wav
//import 'recorder-core/src/engine/wav'
//
import 'recorder-core/src/extensions/waveview'
import { postwavUpload } from '@/http/Recorder'
import { upload as fileUpload } from '@/http/index'
let rec: any = null;
let wave: any = null;
let recwave = ref(null);
let recBlob: any = null
let text = ref('')
//
function recOpen() {
//
rec = Recorder({
type: "wav" //wav
, sampleRate: 16000 //
, bitRate: 16 //
, onProcess: (buffers: any, powerLevel: any, bufferDuration: any, bufferSampleRate: any, newBufferIdx: any, asyncEnd: any) => {
//112
//
if (wave) wave.input(buffers[buffers.length - 1], powerLevel, bufferSampleRate);
}
});
//
rec.open(() => {
console.log("录音已打开");
if (recwave.value) {//
wave = Recorder.WaveView({ elem: recwave.value });
}
rec.start();
console.log("已开始录音");
}, (msg: any, isUserNotAllow: any) => {
//
alert((isUserNotAllow ? "UserNotAllow" : "") + "无法录音:" + msg);
console.log((isUserNotAllow ? "UserNotAllow" : "") + "无法录音:" + msg);
});
}
/**
* 开始录音
*/
function recStart() {
if (!rec) { console.error("未打开录音"); return }
}
/**
* 结束录音
*/
function recStop() {
if (!rec) { console.error("未打开录音"); return }
rec.stop((blob: any, duration: any) => {
//blob
recBlob = blob;
//URL使audio.srca.hrefa.click()adownload="xxx.wav"
var localUrl = (window.URL || 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) {
//使FormDatamultipart/form-data
//blobFileReaderbase64使application/x-www-form-urlencoded
var form = new FormData();
form.append("file", blob, "recorder.wav"); //formupfilerecorder.wav
// form.append("key", "value"); //
var reader: any = new FileReader();
reader.onloadend = function () {
var base64 = (/.+;\s*base64\s*,\s*(.+)$/i.exec(reader.result) || [])[1];
// console.log("base64", base64, blob.size);
/**
let data = {
base64: base64,
size: blob.size
}
postwav(data).then((res: any) => {
if (res.err_msg == 'success') {
text.value = res.result[0]
}
})
*/
};
reader.readAsDataURL(blob);
fileUpload(form).then((res: any) => {
if (res.code == '200') {
postwavUpload({ url: res.url }).then((result: any) => {
if (result.code == 200) {
text.value = result.msg
}
})
}
})
// var xhr=new XMLHttpRequest();
// xhr.open("POST", "/upload/xxxx");
// xhr.onreadystatechange=()=>{
// if(xhr.readyState==4){
// if(xhr.status==200){
// console.log("");
// }else{
// console.error(""+xhr.status);
// };
// };
// };
// xhr.send(form);
}
/**
* 本地直接试听
*/
function recPlay() {
//URLblobaudio
var localUrl = URL.createObjectURL(recBlob);
var audio = document.createElement("audio");
audio.controls = true;
document.body.appendChild(audio);
audio.src = localUrl;
audio.play(); //
//revokeObjectURL
setTimeout(function () { URL.revokeObjectURL(audio.src) }, 5000);
}
</script>
<style scoped>
.container {
width: 1920px;
height: 1080px;
display: flex;
justify-content: center;
align-items: center;
background-color: #fff;
font-size: 28px;
}
.text {
width: 100%;
margin-top: 15px;
text-align: center;
}
</style>