125 lines
3.1 KiB
JavaScript
125 lines
3.1 KiB
JavaScript
const startBtn = document.getElementById('startBtn');
|
|
const hint = document.getElementById('hint');
|
|
const numClustersInput = document.getElementById('numClustersInputID');
|
|
const thresholdInput = document.getElementById('thresholdInputID');
|
|
const textArea = document.getElementById('text');
|
|
|
|
const fileSelectCtrl = document.getElementById('file');
|
|
|
|
let sd = null;
|
|
let float32Samples = null;
|
|
|
|
Module = {};
|
|
Module.onRuntimeInitialized = function() {
|
|
console.log('Model files downloaded!');
|
|
|
|
console.log('Initializing speaker diarization ......');
|
|
sd = createOfflineSpeakerDiarization(Module)
|
|
console.log('sampleRate', sd.sampleRate);
|
|
|
|
hint.innerText =
|
|
'Initialized! Please select a wave file and click the Start button.';
|
|
|
|
fileSelectCtrl.disabled = false;
|
|
};
|
|
|
|
function onFileChange() {
|
|
var files = document.getElementById('file').files;
|
|
|
|
if (files.length == 0) {
|
|
console.log('No file selected');
|
|
float32Samples = null;
|
|
startBtn.disabled = true;
|
|
return;
|
|
}
|
|
textArea.value = '';
|
|
|
|
console.log('files: ' + files);
|
|
|
|
const file = files[0];
|
|
console.log(file);
|
|
console.log('file.name ' + file.name);
|
|
console.log('file.type ' + file.type);
|
|
console.log('file.size ' + file.size);
|
|
|
|
let audioCtx = new AudioContext({sampleRate: sd.sampleRate});
|
|
|
|
let reader = new FileReader();
|
|
reader.onload = function() {
|
|
console.log('reading file!');
|
|
audioCtx.decodeAudioData(reader.result, decodedDone);
|
|
};
|
|
|
|
function decodedDone(decoded) {
|
|
let typedArray = new Float32Array(decoded.length);
|
|
float32Samples = decoded.getChannelData(0);
|
|
|
|
startBtn.disabled = false;
|
|
}
|
|
|
|
reader.readAsArrayBuffer(file);
|
|
}
|
|
|
|
startBtn.onclick = function() {
|
|
textArea.value = '';
|
|
if (float32Samples == null) {
|
|
alert('Empty audio samples!');
|
|
|
|
startBtn.disabled = true;
|
|
return;
|
|
}
|
|
|
|
let numClusters = numClustersInput.value;
|
|
if (numClusters.trim().length == 0) {
|
|
alert(
|
|
'Please provide numClusters. Use -1 if you are not sure how many speakers are there');
|
|
return;
|
|
}
|
|
|
|
if (!numClusters.match(/^\d+$/)) {
|
|
alert(`number of clusters ${
|
|
numClusters} is not an integer .\nPlease enter an integer`);
|
|
return;
|
|
}
|
|
numClusters = parseInt(numClusters, 10);
|
|
if (numClusters < -1) {
|
|
alert(`Number of clusters should be >= -1`);
|
|
return;
|
|
}
|
|
|
|
let threshold = 0.5;
|
|
if (numClusters <= 0) {
|
|
threshold = thresholdInput.value;
|
|
if (threshold.trim().length == 0) {
|
|
alert('Please provide a threshold.');
|
|
return;
|
|
}
|
|
|
|
threshold = parseFloat(threshold);
|
|
if (threshold < 0) {
|
|
alert(`Pleaser enter a positive threshold`);
|
|
return;
|
|
}
|
|
}
|
|
|
|
let config = sd.config
|
|
config.clustering = {numClusters: numClusters, threshold: threshold};
|
|
sd.setConfig(config);
|
|
let segments = sd.process(float32Samples);
|
|
if (segments == null) {
|
|
textArea.value = 'No speakers detected';
|
|
return
|
|
}
|
|
|
|
let s = '';
|
|
let sep = '';
|
|
|
|
for (seg of segments) {
|
|
// clang-format off
|
|
s += sep + `${seg.start.toFixed(2)} -- ${seg.end.toFixed(2)} speaker_${seg.speaker}`
|
|
// clang-format on
|
|
sep = '\n';
|
|
}
|
|
textArea.value = s;
|
|
}
|