46 lines
1.5 KiB
TypeScript
46 lines
1.5 KiB
TypeScript
import { sleep } from "./util";
|
|
|
|
class voiceDetector{
|
|
|
|
private userMedia: MediaStream;
|
|
private audioContext: AudioContext;
|
|
private analyser: AnalyserNode;
|
|
private mediaRecorder: MediaRecorder;
|
|
private intervalID: number;
|
|
private audioChunks: {
|
|
data:Blob,
|
|
time: number
|
|
}[];
|
|
|
|
|
|
async init() {
|
|
this.userMedia = await navigator.mediaDevices.getUserMedia({ audio: true });
|
|
this.audioContext = new AudioContext();
|
|
this.mediaRecorder = new MediaRecorder(this.userMedia);
|
|
this.analyser = this.audioContext.createAnalyser();
|
|
const source = this.audioContext.createMediaStreamSource(this.userMedia);
|
|
source.connect(this.analyser);
|
|
this.audioChunks = [];
|
|
this.mediaRecorder.ondataavailable = (event) => {
|
|
this.audioChunks.push({
|
|
data: event.data,
|
|
time: Date.now()
|
|
});
|
|
};
|
|
this.mediaRecorder.start();
|
|
//analyze the audio volume every 100ms
|
|
let start = Date.now();
|
|
this.analyser.fftSize = 2048;
|
|
this.intervalID = setInterval(() => {
|
|
const dataArray = new Uint8Array(this.analyser.frequencyBinCount);
|
|
this.analyser.getByteTimeDomainData(dataArray);
|
|
const volume = dataArray.reduce((acc, val) => acc + val, 0) / dataArray.length;
|
|
if (Date.now() - start > 10000) {
|
|
this.mediaRecorder.stop();
|
|
clearInterval(this.intervalID);
|
|
}
|
|
}, 100) as any as number;
|
|
|
|
}
|
|
|
|
} |