@newgameplusinc/odyssey-audio-video-sdk-dev 1.0.23 → 1.0.24
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/README.md +7 -7
- package/dist/SpatialAudioManager.js +43 -34
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -91,16 +91,16 @@ These layers run entirely in Web Audio, so you can ship “AirPods-style” back
|
|
|
91
91
|
```ts
|
|
92
92
|
const sdk = new OdysseySpatialComms(serverUrl, {
|
|
93
93
|
denoiser: {
|
|
94
|
-
threshold: 0.
|
|
95
|
-
maxReduction: 0.
|
|
96
|
-
hissCut: 0.
|
|
97
|
-
holdMs:
|
|
94
|
+
threshold: 0.0085,
|
|
95
|
+
maxReduction: 0.9,
|
|
96
|
+
hissCut: 0.55,
|
|
97
|
+
holdMs: 230,
|
|
98
98
|
voiceBoost: 0.65,
|
|
99
99
|
voiceSensitivity: 0.33,
|
|
100
100
|
voiceEnhancement: true,
|
|
101
|
-
silenceFloor: 0.
|
|
102
|
-
silenceHoldMs:
|
|
103
|
-
silenceReleaseMs:
|
|
101
|
+
silenceFloor: 0.0008,
|
|
102
|
+
silenceHoldMs: 480,
|
|
103
|
+
silenceReleaseMs: 180,
|
|
104
104
|
},
|
|
105
105
|
});
|
|
106
106
|
```
|
|
@@ -604,6 +604,7 @@ class SpatialAudioManager extends EventManager_1.EventManager {
|
|
|
604
604
|
this.voiceSensitivity = this._sanitize(cfg.voiceSensitivity, 0.05, 0.9, 0.35);
|
|
605
605
|
this.voiceEnhancement = cfg.voiceEnhancement === true;
|
|
606
606
|
this.silenceFloor = this._sanitize(cfg.silenceFloor, 0.0002, 0.02, 0.00085);
|
|
607
|
+
this.gateGraceSamples = Math.round(sampleRate * 0.45);
|
|
607
608
|
this.silenceHoldSamples = Math.max(
|
|
608
609
|
8,
|
|
609
610
|
Math.round(
|
|
@@ -645,6 +646,7 @@ class SpatialAudioManager extends EventManager_1.EventManager {
|
|
|
645
646
|
silenceReleaseCounter: 0,
|
|
646
647
|
isSilenced: false,
|
|
647
648
|
muteGain: 1,
|
|
649
|
+
graceSamplesRemaining: this.gateGraceSamples,
|
|
648
650
|
};
|
|
649
651
|
}
|
|
650
652
|
return this.channelState[index];
|
|
@@ -748,35 +750,42 @@ class SpatialAudioManager extends EventManager_1.EventManager {
|
|
|
748
750
|
state.quietSamples = 0;
|
|
749
751
|
}
|
|
750
752
|
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
state.
|
|
754
|
-
|
|
755
|
-
state.silenceSamples = Math.max(0, state.silenceSamples - 3);
|
|
756
|
-
}
|
|
757
|
-
|
|
758
|
-
if (!state.isSilenced && state.silenceSamples > this.silenceHoldSamples) {
|
|
759
|
-
state.isSilenced = true;
|
|
753
|
+
if (state.graceSamplesRemaining > 0) {
|
|
754
|
+
state.graceSamplesRemaining--;
|
|
755
|
+
state.isSilenced = false;
|
|
756
|
+
state.silenceSamples = 0;
|
|
760
757
|
state.silenceReleaseCounter = 0;
|
|
761
|
-
}
|
|
758
|
+
} else {
|
|
759
|
+
const belowFloor = state.envelope < this.silenceFloor;
|
|
760
|
+
if (belowFloor && speechPresence < 0.25) {
|
|
761
|
+
state.silenceSamples++;
|
|
762
|
+
} else {
|
|
763
|
+
state.silenceSamples = Math.max(0, state.silenceSamples - 3);
|
|
764
|
+
}
|
|
762
765
|
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
const wakeFromVoice = speechPresence > 0.25;
|
|
766
|
-
if (wakeFromEnergy || wakeFromVoice) {
|
|
767
|
-
state.isSilenced = false;
|
|
768
|
-
state.silenceSamples = 0;
|
|
766
|
+
if (!state.isSilenced && state.silenceSamples > this.silenceHoldSamples) {
|
|
767
|
+
state.isSilenced = true;
|
|
769
768
|
state.silenceReleaseCounter = 0;
|
|
770
|
-
}
|
|
771
|
-
|
|
772
|
-
|
|
769
|
+
}
|
|
770
|
+
|
|
771
|
+
if (state.isSilenced) {
|
|
772
|
+
const wakeFromEnergy = state.envelope > this.silenceFloor * 1.25;
|
|
773
|
+
const wakeFromVoice = speechPresence > 0.2;
|
|
774
|
+
if (wakeFromEnergy || wakeFromVoice) {
|
|
773
775
|
state.isSilenced = false;
|
|
774
776
|
state.silenceSamples = 0;
|
|
775
777
|
state.silenceReleaseCounter = 0;
|
|
778
|
+
} else {
|
|
779
|
+
state.silenceReleaseCounter++;
|
|
780
|
+
if (state.silenceReleaseCounter > this.silenceReleaseSamples) {
|
|
781
|
+
state.isSilenced = false;
|
|
782
|
+
state.silenceSamples = 0;
|
|
783
|
+
state.silenceReleaseCounter = 0;
|
|
784
|
+
}
|
|
776
785
|
}
|
|
786
|
+
} else {
|
|
787
|
+
state.silenceReleaseCounter = 0;
|
|
777
788
|
}
|
|
778
|
-
} else {
|
|
779
|
-
state.silenceReleaseCounter = 0;
|
|
780
789
|
}
|
|
781
790
|
|
|
782
791
|
const ratio = state.noise / Math.max(state.envelope, 1e-6);
|
|
@@ -809,7 +818,7 @@ class SpatialAudioManager extends EventManager_1.EventManager {
|
|
|
809
818
|
processed = state.lpState + highComponent * hissGain;
|
|
810
819
|
|
|
811
820
|
const muteTarget = state.isSilenced ? 0 : 1;
|
|
812
|
-
state.muteGain += (muteTarget - state.muteGain) * 0.
|
|
821
|
+
state.muteGain += (muteTarget - state.muteGain) * 0.18;
|
|
813
822
|
processed *= state.muteGain;
|
|
814
823
|
|
|
815
824
|
outChannel[i] = processed;
|
|
@@ -849,21 +858,21 @@ registerProcessor('odyssey-denoise', OdysseyDenoiseProcessor);
|
|
|
849
858
|
};
|
|
850
859
|
const denoiserDefaults = {
|
|
851
860
|
enabled: true,
|
|
852
|
-
threshold: 0.
|
|
853
|
-
noiseFloor: 0.
|
|
854
|
-
release: 0.
|
|
855
|
-
attack: 0.
|
|
856
|
-
holdMs:
|
|
857
|
-
maxReduction: 0.
|
|
858
|
-
hissCut: 0.
|
|
859
|
-
expansionRatio: 2.
|
|
860
|
-
learnRate: 0.
|
|
861
|
+
threshold: 0.0085,
|
|
862
|
+
noiseFloor: 0.0023,
|
|
863
|
+
release: 0.24,
|
|
864
|
+
attack: 0.34,
|
|
865
|
+
holdMs: 230,
|
|
866
|
+
maxReduction: 0.9,
|
|
867
|
+
hissCut: 0.55,
|
|
868
|
+
expansionRatio: 2.2,
|
|
869
|
+
learnRate: 0.05,
|
|
861
870
|
voiceBoost: 0.65,
|
|
862
871
|
voiceSensitivity: 0.33,
|
|
863
872
|
voiceEnhancement: false,
|
|
864
|
-
silenceFloor: 0.
|
|
865
|
-
silenceHoldMs:
|
|
866
|
-
silenceReleaseMs:
|
|
873
|
+
silenceFloor: 0.0008,
|
|
874
|
+
silenceHoldMs: 480,
|
|
875
|
+
silenceReleaseMs: 180,
|
|
867
876
|
};
|
|
868
877
|
return {
|
|
869
878
|
distance: {
|
package/package.json
CHANGED