|
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) { |
|
|
|
s += sep + `${seg.start.toFixed(2)} -- ${seg.end.toFixed(2)} speaker_${seg.speaker}` |
|
|
|
sep = '\n'; |
|
} |
|
textArea.value = s; |
|
} |
|
|