@vapi-ai/web 1.0.215 → 1.0.217

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
@@ -68,6 +68,10 @@ vapi.on('call-end', () => {
68
68
  console.log('Call has stopped');
69
69
  });
70
70
 
71
+ vapi.on('volume-level', (volume) => {
72
+ console.log(`Assistant volume level: ${volume}`);
73
+ });
74
+
71
75
  vapi.on('error', (e) => {
72
76
  console.error(e)
73
77
  });
package/dist/vapi.d.ts CHANGED
@@ -1,7 +1,23 @@
1
1
  /// <reference types="node" />
2
2
  import { CreateAssistantDTO } from "./api";
3
3
  import EventEmitter from "events";
4
- export default class Vapi extends EventEmitter {
4
+ type VapiEventNames = "call-end" | "call-start" | "volume-level" | "speech-start" | "speech-end" | "error";
5
+ type VapiEventListeners = {
6
+ "call-end": () => void;
7
+ "call-start": () => void;
8
+ "volume-level": (volume: number) => void;
9
+ "speech-start": () => void;
10
+ "speech-end": () => void;
11
+ error: (error: any) => void;
12
+ };
13
+ declare class VapiEventEmitter extends EventEmitter {
14
+ on<E extends VapiEventNames>(event: E, listener: VapiEventListeners[E]): this;
15
+ once<E extends VapiEventNames>(event: E, listener: VapiEventListeners[E]): this;
16
+ emit<E extends VapiEventNames>(event: E, ...args: Parameters<VapiEventListeners[E]>): boolean;
17
+ removeListener<E extends VapiEventNames>(event: E, listener: VapiEventListeners[E]): this;
18
+ removeAllListeners(event?: VapiEventNames): this;
19
+ }
20
+ export default class Vapi extends VapiEventEmitter {
5
21
  private started;
6
22
  private call;
7
23
  private speakingTimeout;
@@ -10,3 +26,4 @@ export default class Vapi extends EventEmitter {
10
26
  private handleRemoteParticipantsAudioLevel;
11
27
  stop(): void;
12
28
  }
29
+ export {};
package/dist/vapi.js CHANGED
@@ -48,7 +48,28 @@ function subscribeToTracks(e, call) {
48
48
  },
49
49
  });
50
50
  }
51
- class Vapi extends events_1.default {
51
+ class VapiEventEmitter extends events_1.default {
52
+ on(event, listener) {
53
+ super.on(event, listener);
54
+ return this;
55
+ }
56
+ once(event, listener) {
57
+ super.once(event, listener);
58
+ return this;
59
+ }
60
+ emit(event, ...args) {
61
+ return super.emit(event, ...args);
62
+ }
63
+ removeListener(event, listener) {
64
+ super.removeListener(event, listener);
65
+ return this;
66
+ }
67
+ removeAllListeners(event) {
68
+ super.removeAllListeners(event);
69
+ return this;
70
+ }
71
+ }
72
+ class Vapi extends VapiEventEmitter {
52
73
  constructor(apiToken, apiBaseUrl) {
53
74
  super();
54
75
  this.started = false;
@@ -109,7 +130,7 @@ class Vapi extends events_1.default {
109
130
  url: webCallUrl,
110
131
  subscribeToTracksAutomatically: false,
111
132
  });
112
- this.call.startRemoteParticipantsAudioLevelObserver();
133
+ this.call.startRemoteParticipantsAudioLevelObserver(100);
113
134
  this.call.on("remote-participants-audio-level", (e) => this.handleRemoteParticipantsAudioLevel(e));
114
135
  this.call.updateInputSettings({
115
136
  audio: {
@@ -126,7 +147,9 @@ class Vapi extends events_1.default {
126
147
  });
127
148
  }
128
149
  handleRemoteParticipantsAudioLevel(e) {
129
- const isSpeaking = Object.values(e.participantsAudioLevel).some((v) => v > 0.01);
150
+ const speechLevel = Object.values(e.participantsAudioLevel).reduce((a, b) => a + b, 0);
151
+ this.emit("volume-level", speechLevel);
152
+ const isSpeaking = speechLevel > 0.1;
130
153
  if (!isSpeaking)
131
154
  return;
132
155
  if (this.speakingTimeout) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vapi-ai/web",
3
- "version": "1.0.215",
3
+ "version": "1.0.217",
4
4
  "description": "",
5
5
  "main": "dist/vapi.js",
6
6
  "types": "dist/vapi.d.ts",
package/vapi.ts CHANGED
@@ -41,7 +41,57 @@ function subscribeToTracks(e: DailyEventObjectParticipant, call: DailyCall) {
41
41
  });
42
42
  }
43
43
 
44
- export default class Vapi extends EventEmitter {
44
+ type VapiEventNames =
45
+ | "call-end"
46
+ | "call-start"
47
+ | "volume-level"
48
+ | "speech-start"
49
+ | "speech-end"
50
+ | "error";
51
+ type VapiEventListeners = {
52
+ "call-end": () => void;
53
+ "call-start": () => void;
54
+ "volume-level": (volume: number) => void;
55
+ "speech-start": () => void;
56
+ "speech-end": () => void;
57
+ error: (error: any) => void;
58
+ };
59
+
60
+ class VapiEventEmitter extends EventEmitter {
61
+ on<E extends VapiEventNames>(
62
+ event: E,
63
+ listener: VapiEventListeners[E]
64
+ ): this {
65
+ super.on(event, listener);
66
+ return this;
67
+ }
68
+ once<E extends VapiEventNames>(
69
+ event: E,
70
+ listener: VapiEventListeners[E]
71
+ ): this {
72
+ super.once(event, listener);
73
+ return this;
74
+ }
75
+ emit<E extends VapiEventNames>(
76
+ event: E,
77
+ ...args: Parameters<VapiEventListeners[E]>
78
+ ): boolean {
79
+ return super.emit(event, ...args);
80
+ }
81
+ removeListener<E extends VapiEventNames>(
82
+ event: E,
83
+ listener: VapiEventListeners[E]
84
+ ): this {
85
+ super.removeListener(event, listener);
86
+ return this;
87
+ }
88
+ removeAllListeners(event?: VapiEventNames): this {
89
+ super.removeAllListeners(event);
90
+ return this;
91
+ }
92
+ }
93
+
94
+ export default class Vapi extends VapiEventEmitter {
45
95
  private started: boolean = false;
46
96
  private call: DailyCall | null = null;
47
97
  private speakingTimeout: NodeJS.Timeout | null = null;
@@ -108,7 +158,7 @@ export default class Vapi extends EventEmitter {
108
158
  subscribeToTracksAutomatically: false,
109
159
  });
110
160
 
111
- this.call.startRemoteParticipantsAudioLevelObserver();
161
+ this.call.startRemoteParticipantsAudioLevelObserver(100);
112
162
  this.call.on("remote-participants-audio-level", (e) =>
113
163
  this.handleRemoteParticipantsAudioLevel(e)
114
164
  );
@@ -131,9 +181,13 @@ export default class Vapi extends EventEmitter {
131
181
  private handleRemoteParticipantsAudioLevel(
132
182
  e: DailyEventObjectRemoteParticipantsAudioLevel
133
183
  ) {
134
- const isSpeaking = Object.values(e.participantsAudioLevel).some(
135
- (v) => v > 0.01
184
+ const speechLevel = Object.values(e.participantsAudioLevel).reduce(
185
+ (a, b) => a + b,
186
+ 0
136
187
  );
188
+ this.emit("volume-level", speechLevel);
189
+
190
+ const isSpeaking = speechLevel > 0.1;
137
191
  if (!isSpeaking) return;
138
192
 
139
193
  if (this.speakingTimeout) {