@botuyo/chat-widget-standalone 1.3.5 → 1.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.
Files changed (28) hide show
  1. package/README.md +1 -1
  2. package/dist/{AudioPlayer-jAcznL1N.js → AudioPlayer-CMZ9EdSY.js} +2 -2
  3. package/dist/{AudioPlayer-jAcznL1N.js.map → AudioPlayer-CMZ9EdSY.js.map} +1 -1
  4. package/dist/{Gallery-CKdV3pMT.js → Gallery-CYqlHLLG.js} +2 -2
  5. package/dist/{Gallery-CKdV3pMT.js.map → Gallery-CYqlHLLG.js.map} +1 -1
  6. package/dist/botuyo-chat.es.js +1 -1
  7. package/dist/botuyo-chat.umd.js +1 -1
  8. package/dist/botuyo-chat.umd.js.map +1 -1
  9. package/dist/src/chat-widget/ChatWidgetProvider.d.ts +7 -0
  10. package/dist/src/chat-widget/ChatWidgetProvider.d.ts.map +1 -1
  11. package/dist/src/chat-widget/components/ChatWindow.d.ts.map +1 -1
  12. package/dist/src/chat-widget/components/VoiceCallOverlay.d.ts +15 -0
  13. package/dist/src/chat-widget/components/VoiceCallOverlay.d.ts.map +1 -1
  14. package/dist/src/chat-widget/hooks/useChatWidget.d.ts.map +1 -1
  15. package/dist/src/chat-widget/voice/audioEnhancement.d.ts +3 -1
  16. package/dist/src/chat-widget/voice/audioEnhancement.d.ts.map +1 -1
  17. package/dist/src/chat-widget/voice/speechDetector.d.ts +78 -0
  18. package/dist/src/chat-widget/voice/speechDetector.d.ts.map +1 -0
  19. package/dist/src/chat-widget/voice/vadGate.d.ts +119 -0
  20. package/dist/src/chat-widget/voice/vadGate.d.ts.map +1 -0
  21. package/dist/{standalone-DrDCLfVL.js → standalone-DN84q-yx.js} +60 -60
  22. package/dist/standalone-DN84q-yx.js.map +1 -0
  23. package/dist/standalone.d.ts +7 -0
  24. package/dist/standalone.d.ts.map +1 -1
  25. package/dist/stats-umd.html +1 -1
  26. package/dist/stats.html +1 -1
  27. package/package.json +1 -1
  28. package/dist/standalone-DrDCLfVL.js.map +0 -1
@@ -22,6 +22,13 @@ export interface ChatWidgetContextValue {
22
22
  close: () => void;
23
23
  /** Toggle abrir/cerrar */
24
24
  toggle: () => void;
25
+ /**
26
+ * Abrir el widget e iniciar una llamada de voz automáticamente.
27
+ * Requiere que el agente tenga la voz habilitada (el backend la activa vía
28
+ * connection_ack); si no, simplemente abre el chat. La llamada arranca apenas
29
+ * el socket conecta.
30
+ */
31
+ startCall: () => void;
25
32
  /** Enviar un mensaje programáticamente */
26
33
  sendMessage: (text: string) => void;
27
34
  /** Limpiar el historial de chat */
@@ -1 +1 @@
1
- {"version":3,"file":"ChatWidgetProvider.d.ts","sourceRoot":"","sources":["../../../src/chat-widget/ChatWidgetProvider.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,EAAoD,SAAS,EAAE,MAAM,OAAO,CAAA;AAGnF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAC9C,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,QAAQ,CAAA;AAI7C,MAAM,WAAW,sBAAsB;IACrC,0CAA0C;IAC1C,MAAM,EAAE,OAAO,CAAA;IACf,sBAAsB;IACtB,IAAI,EAAE,MAAM,IAAI,CAAA;IAChB,uBAAuB;IACvB,KAAK,EAAE,MAAM,IAAI,CAAA;IACjB,0BAA0B;IAC1B,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,0CAA0C;IAC1C,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACnC,mCAAmC;IACnC,aAAa,EAAE,MAAM,IAAI,CAAA;IACzB,mCAAmC;IACnC,WAAW,EAAE,MAAM,CAAA;CACpB;AAMD,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,IAAI,QAE1E;AAED,wBAAgB,yBAAyB,CAAC,EAAE,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,QAEhE;AAMD,MAAM,WAAW,uBAAwB,SAAQ,eAAe;IAC9D,uDAAuD;IACvD,QAAQ,CAAC,EAAE,SAAS,CAAA;IACpB,kDAAkD;IAClD,YAAY,CAAC,EAAE;QACb,wCAAwC;QACxC,MAAM,CAAC,EAAE,OAAO,CAAA;KACjB,CAAA;IACD,kGAAkG;IAClG,aAAa,CAAC,EAAE,eAAe,CAAA;CAChC;AAID;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,aAAa,EACb,YAAY,EACZ,aAAa,EACb,GAAG,WAAW,EACf,EAAE,uBAAuB,2CAoFzB;AAID;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,aAAa,IAAI,sBAAsB,CAWtD;AAID,eAAe,kBAAkB,CAAA"}
1
+ {"version":3,"file":"ChatWidgetProvider.d.ts","sourceRoot":"","sources":["../../../src/chat-widget/ChatWidgetProvider.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,EAAoD,SAAS,EAAE,MAAM,OAAO,CAAA;AAGnF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAC9C,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,QAAQ,CAAA;AAI7C,MAAM,WAAW,sBAAsB;IACrC,0CAA0C;IAC1C,MAAM,EAAE,OAAO,CAAA;IACf,sBAAsB;IACtB,IAAI,EAAE,MAAM,IAAI,CAAA;IAChB,uBAAuB;IACvB,KAAK,EAAE,MAAM,IAAI,CAAA;IACjB,0BAA0B;IAC1B,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB;;;;;OAKG;IACH,SAAS,EAAE,MAAM,IAAI,CAAA;IACrB,0CAA0C;IAC1C,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACnC,mCAAmC;IACnC,aAAa,EAAE,MAAM,IAAI,CAAA;IACzB,mCAAmC;IACnC,WAAW,EAAE,MAAM,CAAA;CACpB;AAMD,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,IAAI,QAE1E;AAED,wBAAgB,yBAAyB,CAAC,EAAE,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,QAEhE;AAMD,MAAM,WAAW,uBAAwB,SAAQ,eAAe;IAC9D,uDAAuD;IACvD,QAAQ,CAAC,EAAE,SAAS,CAAA;IACpB,kDAAkD;IAClD,YAAY,CAAC,EAAE;QACb,wCAAwC;QACxC,MAAM,CAAC,EAAE,OAAO,CAAA;KACjB,CAAA;IACD,kGAAkG;IAClG,aAAa,CAAC,EAAE,eAAe,CAAA;CAChC;AAID;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,QAAQ,EACR,aAAa,EACb,YAAY,EACZ,aAAa,EACb,GAAG,WAAW,EACf,EAAE,uBAAuB,2CA8FzB;AAID;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,aAAa,IAAI,sBAAsB,CAWtD;AAID,eAAe,kBAAkB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"ChatWindow.d.ts","sourceRoot":"","sources":["../../../../src/chat-widget/components/ChatWindow.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAStF,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAE7C,OAAO,EAAoB,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAE9E,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,OAAO,CAAA;IACf,WAAW,EAAE,OAAO,CAAA;IACpB,QAAQ,EAAE,OAAO,CAAA;IACjB,QAAQ,EAAE,WAAW,EAAE,CAAA;IACvB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IACxC,QAAQ,CAAC,EAAE,cAAc,GAAG,aAAa,CAAA;IACzC,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B,OAAO,CAAC,EAAE,gBAAgB,CAAA;IAC1B,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,MAAM,KAAK,IAAI,CAAA;IACzE,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAA;IAC5E,SAAS,CAAC,EAAE,MAAM,GAAG,CAAA;IACrB,wDAAwD;IACxD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,gFAAgF;IAChF,WAAW,CAAC,EAAE,kBAAkB,CAAA;IAChC,KAAK,CAAC,EAAE,OAAO,UAAU,EAAE,SAAS,CAAA;IACpC,qEAAqE;IACrE,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC7B,6FAA6F;IAC7F,UAAU,CAAC,EAAE,cAAc,GAAG,IAAI,CAAA;IAClC,qEAAqE;IACrE,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAA;CAClF;AAED,wBAAgB,UAAU,CAAC,EACzB,MAAM,EACN,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,OAAkB,EAClB,OAAO,EACP,cAAc,EACd,gBAAgB,EAChB,WAAW,EACX,OAAO,EACP,aAAa,EACb,YAAY,EACZ,OAAO,EACP,gBAAgB,EAChB,cAAc,EACd,SAAS,EACT,WAAW,EACX,WAAW,EACX,KAAK,EACL,kBAAkB,EAClB,UAAU,EACV,YAAY,GACb,EAAE,eAAe,kDAiUjB"}
1
+ {"version":3,"file":"ChatWindow.d.ts","sourceRoot":"","sources":["../../../../src/chat-widget/components/ChatWindow.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAStF,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAE7C,OAAO,EAAoB,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AAE9E,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,OAAO,CAAA;IACf,WAAW,EAAE,OAAO,CAAA;IACpB,QAAQ,EAAE,OAAO,CAAA;IACjB,QAAQ,EAAE,WAAW,EAAE,CAAA;IACvB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IACxC,QAAQ,CAAC,EAAE,cAAc,GAAG,aAAa,CAAA;IACzC,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B,OAAO,CAAC,EAAE,gBAAgB,CAAA;IAC1B,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,MAAM,KAAK,IAAI,CAAA;IACzE,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAA;IAC5E,SAAS,CAAC,EAAE,MAAM,GAAG,CAAA;IACrB,wDAAwD;IACxD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,gFAAgF;IAChF,WAAW,CAAC,EAAE,kBAAkB,CAAA;IAChC,KAAK,CAAC,EAAE,OAAO,UAAU,EAAE,SAAS,CAAA;IACpC,qEAAqE;IACrE,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC7B,6FAA6F;IAC7F,UAAU,CAAC,EAAE,cAAc,GAAG,IAAI,CAAA;IAClC,qEAAqE;IACrE,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAA;CAClF;AAED,wBAAgB,UAAU,CAAC,EACzB,MAAM,EACN,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,OAAkB,EAClB,OAAO,EACP,cAAc,EACd,gBAAgB,EAChB,WAAW,EACX,OAAO,EACP,aAAa,EACb,YAAY,EACZ,OAAO,EACP,gBAAgB,EAChB,cAAc,EACd,SAAS,EACT,WAAW,EACX,WAAW,EACX,KAAK,EACL,kBAAkB,EAClB,UAAU,EACV,YAAY,GACb,EAAE,eAAe,kDAoVjB"}
@@ -10,6 +10,7 @@
10
10
  */
11
11
  import type { EmotionAvatarMap } from './Launcher';
12
12
  import { type VoiceGateSetting } from '../voice/audioEnhancement';
13
+ import { type VadGateSetting } from '../voice/vadGate';
13
14
  /** Configurable voice call overlay options */
14
15
  export interface VoiceOverlayConfig {
15
16
  /** Background color of the overlay. Default: '#0a0a0a' */
@@ -52,6 +53,20 @@ export interface VoiceOverlayConfig {
52
53
  * - a partial `VoiceGateConfig` to fine-tune the raw thresholds.
53
54
  */
54
55
  noiseGate?: VoiceGateSetting;
56
+ /**
57
+ * Client-side voice activity detection (Silero VAD) — provider-agnostic. The
58
+ * gate streams ONLY a real, near-field ("clear & frontal") voice to the
59
+ * provider, so background noise and distant chatter never trigger it, while the
60
+ * user can always barge in over the bot with a clear voice. Silero loads lazily
61
+ * at call time; on any failure it degrades to the near-field energy gate.
62
+ * - omit / `'standard'` → on, balanced thresholds (recommended)
63
+ * - `'low'` | `'high'` → sensitivity preset
64
+ * - a partial `VadGateConfig` → fine-tune raw thresholds
65
+ * - `false` → disable VAD (near-field energy gate only)
66
+ */
67
+ vad?: false | VadGateSetting;
68
+ /** Override the Silero model/runtime asset base URL (strict CSP / self-host). */
69
+ vadAssetBaseUrl?: string;
55
70
  }
56
71
  interface VoiceCallOverlayProps {
57
72
  isOpen: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"VoiceCallOverlay.d.ts","sourceRoot":"","sources":["../../../../src/chat-widget/components/VoiceCallOverlay.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAoBH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAElD,OAAO,EAML,KAAK,gBAAgB,EACtB,MAAM,2BAA2B,CAAA;AAMlC,8CAA8C;AAC9C,MAAM,WAAW,kBAAkB;IACjC,0DAA0D;IAC1D,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,8DAA8D;IAC9D,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,2DAA2D;IAC3D,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,4DAA4D;IAC5D,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,yEAAyE;IACzE,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,sEAAsE;IACtE,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,mDAAmD;IACnD,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,kDAAkD;IAClD,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,wDAAwD;IACxD,aAAa,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IAC/C,qCAAqC;IACrC,YAAY,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAA;IACjD,0CAA0C;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,gDAAgD;IAChD,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,gDAAgD;IAChD,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,yEAAyE;IACzE,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,gBAAgB,CAAA;CAC7B;AAED,UAAU,qBAAqB;IAC7B,MAAM,EAAE,OAAO,CAAA;IACf,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,GAAG,CAAA;IACrB,OAAO,CAAC,EAAE,gBAAgB,CAAA;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,iDAAiD;IACjD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,2DAA2D;IAC3D,WAAW,CAAC,EAAE,kBAAkB,CAAA;IAChC;;;;OAIG;IACH,WAAW,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;CACxC;AAED,KAAK,SAAS,GAAG,MAAM,GAAG,YAAY,GAAG,WAAW,GAAG,UAAU,GAAG,UAAU,CAAA;AAwb9E,wBAAgB,gBAAgB,CAAC,EAC/B,MAAM,EACN,OAAO,EACP,YAAwB,EACxB,SAAS,EACT,OAAO,EACP,OAAO,EACP,WAAW,EACX,WAAW,EACX,WAAW,GACZ,EAAE,qBAAqB,kDAo6CvB"}
1
+ {"version":3,"file":"VoiceCallOverlay.d.ts","sourceRoot":"","sources":["../../../../src/chat-widget/components/VoiceCallOverlay.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAoBH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAElD,OAAO,EAML,KAAK,gBAAgB,EACtB,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAKL,KAAK,cAAc,EACpB,MAAM,kBAAkB,CAAA;AAOzB,8CAA8C;AAC9C,MAAM,WAAW,kBAAkB;IACjC,0DAA0D;IAC1D,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,8DAA8D;IAC9D,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,2DAA2D;IAC3D,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,4DAA4D;IAC5D,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,yEAAyE;IACzE,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,sEAAsE;IACtE,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,mDAAmD;IACnD,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,kDAAkD;IAClD,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,wDAAwD;IACxD,aAAa,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IAC/C,qCAAqC;IACrC,YAAY,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAA;IACjD,0CAA0C;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,gDAAgD;IAChD,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,gDAAgD;IAChD,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,yEAAyE;IACzE,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,gBAAgB,CAAA;IAC5B;;;;;;;;;;OAUG;IACH,GAAG,CAAC,EAAE,KAAK,GAAG,cAAc,CAAA;IAC5B,iFAAiF;IACjF,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,UAAU,qBAAqB;IAC7B,MAAM,EAAE,OAAO,CAAA;IACf,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,GAAG,CAAA;IACrB,OAAO,CAAC,EAAE,gBAAgB,CAAA;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,iDAAiD;IACjD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,2DAA2D;IAC3D,WAAW,CAAC,EAAE,kBAAkB,CAAA;IAChC;;;;OAIG;IACH,WAAW,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAA;CACxC;AAED,KAAK,SAAS,GAAG,MAAM,GAAG,YAAY,GAAG,WAAW,GAAG,UAAU,GAAG,UAAU,CAAA;AA4b9E,wBAAgB,gBAAgB,CAAC,EAC/B,MAAM,EACN,OAAO,EACP,YAAwB,EACxB,SAAS,EACT,OAAO,EACP,OAAO,EACP,WAAW,EACX,WAAW,EACX,WAAW,GACZ,EAAE,qBAAqB,kDAi/CvB"}
@@ -1 +1 @@
1
- {"version":3,"file":"useChatWidget.d.ts","sourceRoot":"","sources":["../../../../src/chat-widget/hooks/useChatWidget.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,eAAe,EACf,WAAW,EAKX,cAAc,EACd,WAAW,EACZ,MAAM,UAAU,CAAA;AAQjB,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAiBnD,UAAU,oBAAoB;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,KAAK,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,CAAA;IAChC,WAAW,CAAC,EAAE,eAAe,CAAC,aAAa,CAAC,CAAA;IAC5C,WAAW,CAAC,EAAE,eAAe,CAAC,aAAa,CAAC,CAAA;IAC5C,OAAO,CAAC,EAAE,eAAe,CAAC,SAAS,CAAC,CAAA;IACpC,UAAU,CAAC,EAAE,eAAe,CAAC,YAAY,CAAC,CAAA;IAC1C,OAAO,CAAC,EAAE,eAAe,CAAC,SAAS,CAAC,CAAA;IACpC,aAAa,CAAC,EAAE,eAAe,CAAC,eAAe,CAAC,CAAA;IAChD,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAA;CACrC;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB;;;;;;;;;;;;;;;;;;;;;;2BAqKhD,MAAM;iCA4CA,IAAI,QAAQ,OAAO,GAAG,OAAO,GAAG,MAAM;mCAyCxC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;gCAlDxC,cAAc,SAAS,MAAM,YAAY,MAAM;EAqJ5D"}
1
+ {"version":3,"file":"useChatWidget.d.ts","sourceRoot":"","sources":["../../../../src/chat-widget/hooks/useChatWidget.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,eAAe,EACf,WAAW,EAKX,cAAc,EACd,WAAW,EACZ,MAAM,UAAU,CAAA;AAQjB,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAiBnD,UAAU,oBAAoB;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,KAAK,CAAC,EAAE,eAAe,CAAC,OAAO,CAAC,CAAA;IAChC,WAAW,CAAC,EAAE,eAAe,CAAC,aAAa,CAAC,CAAA;IAC5C,WAAW,CAAC,EAAE,eAAe,CAAC,aAAa,CAAC,CAAA;IAC5C,OAAO,CAAC,EAAE,eAAe,CAAC,SAAS,CAAC,CAAA;IACpC,UAAU,CAAC,EAAE,eAAe,CAAC,YAAY,CAAC,CAAA;IAC1C,OAAO,CAAC,EAAE,eAAe,CAAC,SAAS,CAAC,CAAA;IACpC,aAAa,CAAC,EAAE,eAAe,CAAC,eAAe,CAAC,CAAA;IAChD,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAA;CACrC;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB;;;;;;;;;;;;;;;;;;;;;;2BAqKhD,MAAM;iCA4CA,IAAI,QAAQ,OAAO,GAAG,OAAO,GAAG,MAAM;mCAyCxC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;gCAlDxC,cAAc,SAAS,MAAM,YAAY,MAAM;EA6J5D"}
@@ -176,7 +176,9 @@ export declare function computeExpanderGain(rms: number, prevGain: number, confi
176
176
  *
177
177
  * Captures mic input as PCM 16-bit, computes per-frame RMS, applies the
178
178
  * downward-expander gain (smoothed per-sample to avoid clicks) and posts EVERY
179
- * frame so the upstream server-side VAD keeps a continuous stream.
179
+ * frame as `{ pcm, rms }` — to the main thread. The client-side VAD gate (see
180
+ * VoiceCallOverlay) decides, per frame, what is forwarded to the voice provider,
181
+ * using the RMS as the near-field energy signal.
180
182
  *
181
183
  * @param config - gate tuning (defaults to VOICE_GATE_CONFIG)
182
184
  * @param processorName - registered worklet name (default 'voice-pcm-processor')
@@ -1 +1 @@
1
- {"version":3,"file":"audioEnhancement.d.ts","sourceRoot":"","sources":["../../../../src/chat-widget/voice/audioEnhancement.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAQH;;;GAGG;AACH,eAAO,MAAM,0BAA0B,EAAE,qBAMxC,CAAA;AAMD;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,QAAQ,CAAA;AAEzC;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,IAAI,CAAA;AAMvC;;;GAGG;AACH,eAAO,MAAM,kBAAkB;IAC7B,2EAA2E;;;;;IAK3E,gGAAgG;;;;;IAKhG,4EAA4E;;;;;;IAM5E,sEAAsE;;;;;IAKtE,gFAAgF;;;;;;;;CAQxE,CAAA;AAEV;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,YAAY,EACjB,MAAM,EAAE,0BAA0B,GACjC,SAAS,CAgDX;AAMD;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,GAAE,MAA6B,EACxC,UAAU,GAAE,MAA+B,GAC1C;IAAE,eAAe,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAqBhD;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,WAAW,eAAe;IAC9B,2DAA2D;IAC3D,aAAa,EAAE,MAAM,CAAA;IACrB,iFAAiF;IACjF,SAAS,EAAE,MAAM,CAAA;IACjB,iFAAiF;IACjF,UAAU,EAAE,MAAM,CAAA;IAClB,uEAAuE;IACvE,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,eAAO,MAAM,iBAAiB,EAAE,eAK/B,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,oBAAoB,GAAG,KAAK,GAAG,KAAK,GAAG,UAAU,GAAG,MAAM,CAAA;AAEtE,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,oBAAoB,EAAE,eAAe,CAK5E,CAAA;AAED;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,oBAAoB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAA;AAExF;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,eAAe,CAYlF;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,MAAM,GAAE,eAAmC,GAC1C,MAAM,CAMR;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,GAAE,eAAmC,EAC3C,aAAa,SAAwB,EACrC,SAAS,SAAO,GACf,MAAM,CAoDR"}
1
+ {"version":3,"file":"audioEnhancement.d.ts","sourceRoot":"","sources":["../../../../src/chat-widget/voice/audioEnhancement.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAQH;;;GAGG;AACH,eAAO,MAAM,0BAA0B,EAAE,qBAMxC,CAAA;AAMD;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,QAAQ,CAAA;AAEzC;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,IAAI,CAAA;AAMvC;;;GAGG;AACH,eAAO,MAAM,kBAAkB;IAC7B,2EAA2E;;;;;IAK3E,gGAAgG;;;;;IAKhG,4EAA4E;;;;;;IAM5E,sEAAsE;;;;;IAKtE,gFAAgF;;;;;;;;CAQxE,CAAA;AAEV;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,YAAY,EACjB,MAAM,EAAE,0BAA0B,GACjC,SAAS,CAgDX;AAMD;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,GAAE,MAA6B,EACxC,UAAU,GAAE,MAA+B,GAC1C;IAAE,eAAe,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAqBhD;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,WAAW,eAAe;IAC9B,2DAA2D;IAC3D,aAAa,EAAE,MAAM,CAAA;IACrB,iFAAiF;IACjF,SAAS,EAAE,MAAM,CAAA;IACjB,iFAAiF;IACjF,UAAU,EAAE,MAAM,CAAA;IAClB,uEAAuE;IACvE,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,eAAO,MAAM,iBAAiB,EAAE,eAK/B,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,oBAAoB,GAAG,KAAK,GAAG,KAAK,GAAG,UAAU,GAAG,MAAM,CAAA;AAEtE,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,oBAAoB,EAAE,eAAe,CAK5E,CAAA;AAED;;;;;GAKG;AACH,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,oBAAoB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAA;AAExF;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,eAAe,CAYlF;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,MAAM,GAAE,eAAmC,GAC1C,MAAM,CAMR;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,GAAE,eAAmC,EAC3C,aAAa,SAAwB,EACrC,SAAS,SAAO,GACf,MAAM,CAqDR"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * @package @botuyo/chat-widget
3
+ * Speech Detector — provider-agnostic Silero VAD wrapper.
4
+ *
5
+ * Thin adapter over `@ricky0123/vad-web` (Silero VAD running on ONNX Runtime
6
+ * Web). It is loaded **lazily at call time** from a pinned CDN so it adds ZERO
7
+ * weight to the widget bundle and requires NO configuration from the embedding
8
+ * site ("completely transparent"). If anything fails to load — offline, a strict
9
+ * Content-Security-Policy, an unsupported browser — {@link createSpeechDetector}
10
+ * resolves to `null` and the caller transparently falls back to the energy-only
11
+ * gate. The end user never sees a broken call.
12
+ *
13
+ * This module is intentionally THIN and side-effectful: the speech-vs-noise
14
+ * POLICY lives in the pure, unit-tested {@link ./vadGate}. Here we only:
15
+ * 1. lazy-load the model,
16
+ * 2. forward each analysed frame as `{ speechProb, rms }`,
17
+ * 3. optionally share the caller's already-captured MediaStream so the VAD
18
+ * analyses exactly the audio we stream (consistent barge-in, AEC-aware).
19
+ */
20
+ /** A single analysed frame: Silero probability + near-field energy. */
21
+ export interface SpeechFrame {
22
+ speechProb: number;
23
+ rms: number;
24
+ }
25
+ /** Silero per-frame output (subset of `@ricky0123/vad-web`). */
26
+ export interface SpeechProbabilities {
27
+ isSpeech: number;
28
+ notSpeech: number;
29
+ }
30
+ /** Minimal subset of the `MicVAD` instance we depend on. */
31
+ export interface MicVadInstance {
32
+ start: () => void | Promise<void>;
33
+ pause: () => void | Promise<void>;
34
+ destroy: () => void | Promise<void>;
35
+ }
36
+ export interface MicVadStatic {
37
+ new: (opts: Record<string, unknown>) => Promise<MicVadInstance>;
38
+ }
39
+ /** Minimal subset of the `@ricky0123/vad-web` module we depend on. */
40
+ export interface VadModule {
41
+ MicVAD: MicVadStatic;
42
+ }
43
+ export interface ISpeechDetector {
44
+ /** Begin analysing the microphone. */
45
+ start: () => Promise<void>;
46
+ /** Stop and release the model + audio nodes. Never throws. */
47
+ destroy: () => void;
48
+ /** Whether the detector is currently analysing. */
49
+ readonly running: boolean;
50
+ }
51
+ export interface SpeechDetectorOptions {
52
+ /** Called for every analysed frame. */
53
+ onFrame: (frame: SpeechFrame) => void;
54
+ /** Share an already-captured stream so the VAD sees exactly what we send. */
55
+ stream?: MediaStream;
56
+ /** Reuse an AudioContext (optional). */
57
+ audioContext?: AudioContext;
58
+ /** Override where the worklet + `.onnx` model load from (CSP / self-host). */
59
+ assetBaseUrl?: string;
60
+ /** Override where the ONNX Runtime `.wasm`/`.mjs` files load from. */
61
+ onnxWasmBaseUrl?: string;
62
+ /** Silero model variant. Defaults to the newer `v5`. */
63
+ model?: 'v5' | 'legacy';
64
+ /** Injectable module loader — defaults to a pinned CDN import (used by tests). */
65
+ loadVad?: () => Promise<VadModule>;
66
+ }
67
+ export declare const VAD_WEB_VERSION = "0.0.30";
68
+ export declare const ORT_WEB_VERSION = "1.22.0";
69
+ export declare const DEFAULT_VAD_ASSET_BASE = "https://cdn.jsdelivr.net/npm/@ricky0123/vad-web@0.0.30/dist/";
70
+ export declare const DEFAULT_ORT_WASM_BASE = "https://cdn.jsdelivr.net/npm/onnxruntime-web@1.22.0/dist/";
71
+ /** Root-mean-square amplitude of a frame on the 0–1 Float scale. */
72
+ export declare function computeRms(frame: Float32Array): number;
73
+ /**
74
+ * Creates a Silero-backed speech detector, or `null` if the model cannot be
75
+ * loaded/initialised (caller should fall back to the energy-only gate).
76
+ */
77
+ export declare function createSpeechDetector(opts: SpeechDetectorOptions): Promise<ISpeechDetector | null>;
78
+ //# sourceMappingURL=speechDetector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"speechDetector.d.ts","sourceRoot":"","sources":["../../../../src/chat-widget/voice/speechDetector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,uEAAuE;AACvE,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAA;IAClB,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,gEAAgE;AAChE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,4DAA4D;AAC5D,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACjC,KAAK,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACjC,OAAO,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACpC;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,cAAc,CAAC,CAAA;CAChE;AAED,sEAAsE;AACtE,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,YAAY,CAAA;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,sCAAsC;IACtC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC1B,8DAA8D;IAC9D,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,mDAAmD;IACnD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAC1B;AAED,MAAM,WAAW,qBAAqB;IACpC,uCAAuC;IACvC,OAAO,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAA;IACrC,6EAA6E;IAC7E,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,wCAAwC;IACxC,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B,8EAA8E;IAC9E,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,sEAAsE;IACtE,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,wDAAwD;IACxD,KAAK,CAAC,EAAE,IAAI,GAAG,QAAQ,CAAA;IACvB,kFAAkF;IAClF,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,SAAS,CAAC,CAAA;CACnC;AAGD,eAAO,MAAM,eAAe,WAAW,CAAA;AACvC,eAAO,MAAM,eAAe,WAAW,CAAA;AAEvC,eAAO,MAAM,sBAAsB,iEAA6E,CAAA;AAChH,eAAO,MAAM,qBAAqB,8DAA0E,CAAA;AAI5G,oEAAoE;AACpE,wBAAgB,UAAU,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAKtD;AA8DD;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,qBAAqB,GAC1B,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAejC"}
@@ -0,0 +1,119 @@
1
+ /**
2
+ * @package @botuyo/chat-widget
3
+ * VAD Gate — provider-agnostic speech gate (pure logic, fully unit-tested).
4
+ *
5
+ * Decides, per audio frame, whether the upstream should carry the frame to the
6
+ * voice provider. It combines TWO independent signals so background noise never
7
+ * reaches the provider's own VAD (which we treat as an implementation detail of
8
+ * one provider, not something to depend on):
9
+ *
10
+ * 1. `speechProb` — a real speech-vs-noise probability (Silero VAD). Rejects
11
+ * loud NON-speech (door slams, music, keyboard) that an energy gate alone
12
+ * would pass.
13
+ * 2. `rms` — near-field energy. Rejects voiced-but-distant sources (a TV or a
14
+ * person across the room) via the inverse-square law: the device user is
15
+ * the loudest source in front of the mic.
16
+ *
17
+ * BARGE-IN: the gate runs continuously, INCLUDING while the bot is speaking, so
18
+ * the user can always interrupt — but only with a *clear and frontal* voice. A
19
+ * stricter near-field bar (`bargeInRms`) applies while `botSpeaking` is true so
20
+ * the bot's own echo / ambient chatter does not self-interrupt, while a real
21
+ * voice talking into the device does.
22
+ *
23
+ * Hysteresis: `onsetFrames` consecutive voiced frames are required to OPEN
24
+ * (debounces transients) and `redemptionFrames` of non-voiced audio are
25
+ * tolerated before CLOSING (so natural pauses between words are not chopped).
26
+ */
27
+ export type VadGateState = 'silence' | 'speech';
28
+ export type VadGateEvent = 'speech_start' | 'speech_end' | 'barge_in';
29
+ export interface VadGateConfig {
30
+ /** Silero speech probability (0–1) required to consider a frame voiced at ONSET. */
31
+ positiveSpeechThreshold: number;
32
+ /** Silero probability below which an ongoing turn stops being sustained (hysteresis). */
33
+ negativeSpeechThreshold: number;
34
+ /** Min near-field RMS (0–1) for the device user while idle/listening. */
35
+ nearFieldRms: number;
36
+ /** Stricter near-field RMS required to BARGE IN over the bot ("clear & frontal"). */
37
+ bargeInRms: number;
38
+ /** Consecutive voiced frames required to open the gate. */
39
+ onsetFrames: number;
40
+ /** Consecutive non-voiced frames tolerated before the gate closes (word-gap hangover). */
41
+ redemptionFrames: number;
42
+ /**
43
+ * When true, ignore `speechProb` and gate on near-field energy only. Used as a
44
+ * graceful fallback when the Silero model cannot be loaded (offline / CSP).
45
+ */
46
+ energyOnly?: boolean;
47
+ }
48
+ /** A single analysed audio frame fed to the gate. */
49
+ export interface VadFrame {
50
+ /** Silero speech probability 0–1 (ignored when `energyOnly`). */
51
+ speechProb: number;
52
+ /** Frame RMS on the 0–1 Float scale. */
53
+ rms: number;
54
+ /** Whether the bot is currently playing audio (enables the barge-in bar). */
55
+ botSpeaking: boolean;
56
+ }
57
+ export interface VadGateResult {
58
+ /** Whether this frame should be sent upstream to the provider. */
59
+ shouldStream: boolean;
60
+ /** Gate state after processing this frame. */
61
+ state: VadGateState;
62
+ /** Transition event, if any, emitted on this frame. */
63
+ event?: VadGateEvent;
64
+ }
65
+ /**
66
+ * Sensitivity presets. Higher = more background isolation: it demands a clearer
67
+ * (higher Silero prob) and louder/closer (higher RMS) voice, rejecting more
68
+ * ambient noise at the cost of a soft/distant speaker.
69
+ */
70
+ export declare const VAD_GATE_PRESETS: Record<'low' | 'standard' | 'high', VadGateConfig>;
71
+ /** What a consumer can pass to configure the gate. */
72
+ export type VadGateSetting = 'low' | 'standard' | 'high' | Partial<VadGateConfig>;
73
+ /**
74
+ * Resolves a consumer setting into a full config. Defaults to `standard`;
75
+ * a partial object is merged over `standard`.
76
+ */
77
+ export declare function resolveVadGateConfig(setting?: VadGateSetting): VadGateConfig;
78
+ /** Inputs for {@link resolveVadInput}. */
79
+ export interface VadInputContext {
80
+ /** Whether the bot is currently playing audio. */
81
+ botSpeaking: boolean;
82
+ /** Whether a real Silero VAD frame arrived recently (vs the energy-only fallback). */
83
+ vadFresh: boolean;
84
+ /** Latest Silero speech probability (only meaningful when `vadFresh`). */
85
+ speechProb: number;
86
+ /** Frame RMS (near-field energy). */
87
+ rms: number;
88
+ }
89
+ /**
90
+ * Resolves the {@link VadFrame} to feed the gate, plus whether a streamed chunk is
91
+ * CONFIRMED real speech (used by the provider's server-side greeting gate).
92
+ *
93
+ * Echo safety: without a fresh REAL VAD signal we cannot distinguish the user's
94
+ * voice from the bot's own audio leaking into the mic (imperfect AEC), so while the
95
+ * bot is speaking we feed a SILENT frame — the gate stays closed and we never
96
+ * self-interrupt. A clear, frontal voice resumes barge-in once Silero is live.
97
+ */
98
+ export declare function resolveVadInput(ctx: VadInputContext): {
99
+ frame: VadFrame;
100
+ confirmedSpeech: boolean;
101
+ };
102
+ /**
103
+ * Stateful speech gate. Feed it one analysed frame at a time via {@link process};
104
+ * it returns whether to stream the frame plus any transition event.
105
+ */
106
+ export declare class VadGate {
107
+ private readonly config;
108
+ private _state;
109
+ private onsetCount;
110
+ private redemptionCount;
111
+ constructor(config?: Partial<VadGateConfig>);
112
+ get state(): VadGateState;
113
+ /** Resets the gate to the closed (silence) state. */
114
+ reset(): void;
115
+ process(frame: VadFrame): VadGateResult;
116
+ private processSilence;
117
+ private processSpeech;
118
+ }
119
+ //# sourceMappingURL=vadGate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vadGate.d.ts","sourceRoot":"","sources":["../../../../src/chat-widget/voice/vadGate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,QAAQ,CAAA;AAE/C,MAAM,MAAM,YAAY,GAAG,cAAc,GAAG,YAAY,GAAG,UAAU,CAAA;AAErE,MAAM,WAAW,aAAa;IAC5B,oFAAoF;IACpF,uBAAuB,EAAE,MAAM,CAAA;IAC/B,yFAAyF;IACzF,uBAAuB,EAAE,MAAM,CAAA;IAC/B,yEAAyE;IACzE,YAAY,EAAE,MAAM,CAAA;IACpB,qFAAqF;IACrF,UAAU,EAAE,MAAM,CAAA;IAClB,2DAA2D;IAC3D,WAAW,EAAE,MAAM,CAAA;IACnB,0FAA0F;IAC1F,gBAAgB,EAAE,MAAM,CAAA;IACxB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAED,qDAAqD;AACrD,MAAM,WAAW,QAAQ;IACvB,iEAAiE;IACjE,UAAU,EAAE,MAAM,CAAA;IAClB,wCAAwC;IACxC,GAAG,EAAE,MAAM,CAAA;IACX,6EAA6E;IAC7E,WAAW,EAAE,OAAO,CAAA;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,kEAAkE;IAClE,YAAY,EAAE,OAAO,CAAA;IACrB,8CAA8C;IAC9C,KAAK,EAAE,YAAY,CAAA;IACnB,uDAAuD;IACvD,KAAK,CAAC,EAAE,YAAY,CAAA;CACrB;AAED;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,KAAK,GAAG,UAAU,GAAG,MAAM,EAAE,aAAa,CAyB/E,CAAA;AAED,sDAAsD;AACtD,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAA;AAKjF;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,aAAa,CAQ5E;AAED,0CAA0C;AAC1C,MAAM,WAAW,eAAe;IAC9B,kDAAkD;IAClD,WAAW,EAAE,OAAO,CAAA;IACpB,sFAAsF;IACtF,QAAQ,EAAE,OAAO,CAAA;IACjB,0EAA0E;IAC1E,UAAU,EAAE,MAAM,CAAA;IAClB,qCAAqC;IACrC,GAAG,EAAE,MAAM,CAAA;CACZ;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,eAAe,GAAG;IAAE,KAAK,EAAE,QAAQ,CAAC;IAAC,eAAe,EAAE,OAAO,CAAA;CAAE,CAYnG;AAED;;;GAGG;AACH,qBAAa,OAAO;IAClB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IACtC,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,UAAU,CAAI;IACtB,OAAO,CAAC,eAAe,CAAI;gBAEf,MAAM,GAAE,OAAO,CAAC,aAAa,CAAM;IAI/C,IAAI,KAAK,IAAI,YAAY,CAExB;IAED,qDAAqD;IACrD,KAAK,IAAI,IAAI;IAMb,OAAO,CAAC,KAAK,EAAE,QAAQ,GAAG,aAAa;IAMvC,OAAO,CAAC,cAAc;IA2BtB,OAAO,CAAC,aAAa;CAqBtB"}