vue部分代码
xx.vue
import Recorder from './Recorder.js';
export default {
data() {
return {
mediaStream: null,
recorder: null,
isRecording: false,
audioChunks: [],
vadInterval: null // 新增:用于存储声音活动检测的间隔 ID
};
},
async mounted() {
this.mediaStream = await navigator.mediaDevices.getUserMedia({ audio: true });
this.startVAD();
},
beforeDestroy() {
// 新增:组件销毁前清理声音活动检测的间隔
if (this.vadInterval) {
cancelAnimationFrame(this.vadInterval);
}
},
created() {
this.defaultLogin();
},
methods: {
startVAD() {
const audioContext = new (window.AudioContext || window.webkitAudioContext)();
const source = audioContext.createMediaStreamSource(this.mediaStream);
const analyser = audioContext.createAnalyser();
source.connect(analyser);
analyser.fftSize = 2048;
const bufferLength = analyser.frequencyBinCount;
const dataArray = new Uint8Array(bufferLength);
const checkVoiceActivity = () => {
analyser.getByteFrequencyData(dataArray);
let sum = 0;
for (let i = 0; i < bufferLength; i++) {
sum += dataArray[i];
}
const average = sum / bufferLength;
if (average > 30 && !this.isRecording) {
this.startRecording();
} else if (average < 10 && this.isRecording) {
setTimeout(() => {
analyser.getByteFrequencyData(dataArray);
let newSum = 0;
for (let i = 0; i < bufferLength; i++) {
newSum += dataArray[i];
}
const newAverage = newSum / bufferLength;
if (newAverage < 10) {
this.stopRecording(