@iam-protocol/pulse-sdk 0.3.9 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +17 -14
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +17 -14
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/extraction/speaker.ts +10 -8
- package/src/extraction/statistics.ts +11 -6
package/dist/index.js
CHANGED
|
@@ -376,14 +376,15 @@ function autocorrelation(values, lag = 1) {
|
|
|
376
376
|
}
|
|
377
377
|
function normalizeGroup(features) {
|
|
378
378
|
if (features.length === 0) return features;
|
|
379
|
+
const clean = features.map((v) => Number.isFinite(v) ? v : 0);
|
|
379
380
|
let sum = 0;
|
|
380
|
-
for (const v of
|
|
381
|
-
const mean2 = sum /
|
|
381
|
+
for (const v of clean) sum += v;
|
|
382
|
+
const mean2 = sum / clean.length;
|
|
382
383
|
let sqSum = 0;
|
|
383
|
-
for (const v of
|
|
384
|
-
const std = Math.sqrt(sqSum /
|
|
385
|
-
if (std === 0) return
|
|
386
|
-
return
|
|
384
|
+
for (const v of clean) sqSum += (v - mean2) * (v - mean2);
|
|
385
|
+
const std = Math.sqrt(sqSum / clean.length);
|
|
386
|
+
if (std === 0) return clean.map(() => 0);
|
|
387
|
+
return clean.map((v) => (v - mean2) / std);
|
|
387
388
|
}
|
|
388
389
|
function fuseFeatures(audio, motion, touch) {
|
|
389
390
|
return [...normalizeGroup(audio), ...normalizeGroup(motion), ...normalizeGroup(touch)];
|
|
@@ -528,11 +529,13 @@ var FRAME_SIZE = 512;
|
|
|
528
529
|
var HOP_SIZE = 160;
|
|
529
530
|
var SPEAKER_FEATURE_COUNT = 44;
|
|
530
531
|
var pitchDetector = null;
|
|
532
|
+
var pitchDetectorRate = 0;
|
|
531
533
|
var meydaModule = null;
|
|
532
|
-
async function getPitchDetector() {
|
|
533
|
-
if (!pitchDetector) {
|
|
534
|
+
async function getPitchDetector(sampleRate) {
|
|
535
|
+
if (!pitchDetector || pitchDetectorRate !== sampleRate) {
|
|
534
536
|
const PitchFinder = await import("pitchfinder");
|
|
535
|
-
pitchDetector = PitchFinder.YIN({ sampleRate
|
|
537
|
+
pitchDetector = PitchFinder.YIN({ sampleRate });
|
|
538
|
+
pitchDetectorRate = sampleRate;
|
|
536
539
|
}
|
|
537
540
|
return pitchDetector;
|
|
538
541
|
}
|
|
@@ -547,7 +550,7 @@ async function getMeyda() {
|
|
|
547
550
|
return meydaModule.default ?? meydaModule;
|
|
548
551
|
}
|
|
549
552
|
async function detectF0Contour(samples, sampleRate) {
|
|
550
|
-
const detect = await getPitchDetector();
|
|
553
|
+
const detect = await getPitchDetector(sampleRate);
|
|
551
554
|
const f0 = [];
|
|
552
555
|
const amplitudes = [];
|
|
553
556
|
const periods = [];
|
|
@@ -679,10 +682,10 @@ async function computeLTAS(samples, sampleRate) {
|
|
|
679
682
|
{ sampleRate, bufferSize: FRAME_SIZE }
|
|
680
683
|
);
|
|
681
684
|
if (features) {
|
|
682
|
-
if (
|
|
683
|
-
if (
|
|
684
|
-
if (
|
|
685
|
-
if (
|
|
685
|
+
if (Number.isFinite(features.spectralCentroid)) centroids.push(features.spectralCentroid);
|
|
686
|
+
if (Number.isFinite(features.spectralRolloff)) rolloffs.push(features.spectralRolloff);
|
|
687
|
+
if (Number.isFinite(features.spectralFlatness)) flatnesses.push(features.spectralFlatness);
|
|
688
|
+
if (Number.isFinite(features.spectralSpread)) spreads.push(features.spectralSpread);
|
|
686
689
|
}
|
|
687
690
|
}
|
|
688
691
|
const m = (arr) => arr.length > 0 ? arr.reduce((a, b) => a + b, 0) / arr.length : 0;
|