@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 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.0088,
95
- maxReduction: 0.92,
96
- hissCut: 0.58,
97
- holdMs: 210,
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.00085,
102
- silenceHoldMs: 320,
103
- silenceReleaseMs: 140,
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
- const belowFloor = state.envelope < this.silenceFloor;
752
- if (belowFloor && speechPresence < 0.25) {
753
- state.silenceSamples++;
754
- } else {
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
- if (state.isSilenced) {
764
- const wakeFromEnergy = state.envelope > this.silenceFloor * 1.35;
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
- } else {
771
- state.silenceReleaseCounter++;
772
- if (state.silenceReleaseCounter > this.silenceReleaseSamples) {
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.25;
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.0088,
853
- noiseFloor: 0.0024,
854
- release: 0.26,
855
- attack: 0.3,
856
- holdMs: 210,
857
- maxReduction: 0.92,
858
- hissCut: 0.58,
859
- expansionRatio: 2.25,
860
- learnRate: 0.055,
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.00085,
865
- silenceHoldMs: 320,
866
- silenceReleaseMs: 140,
873
+ silenceFloor: 0.0008,
874
+ silenceHoldMs: 480,
875
+ silenceReleaseMs: 180,
867
876
  };
868
877
  return {
869
878
  distance: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@newgameplusinc/odyssey-audio-video-sdk-dev",
3
- "version": "1.0.23",
3
+ "version": "1.0.24",
4
4
  "description": "Odyssey Spatial Audio & Video SDK using MediaSoup for real-time communication",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",