@livekit/agents 0.4.6 → 0.5.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 (197) hide show
  1. package/README.md +17 -0
  2. package/dist/audio.cjs +77 -0
  3. package/dist/audio.cjs.map +1 -0
  4. package/dist/audio.js +48 -37
  5. package/dist/audio.js.map +1 -1
  6. package/dist/cli.cjs +131 -0
  7. package/dist/cli.cjs.map +1 -0
  8. package/dist/cli.js +96 -122
  9. package/dist/cli.js.map +1 -1
  10. package/dist/generator.cjs +36 -0
  11. package/dist/generator.cjs.map +1 -0
  12. package/dist/generator.js +8 -22
  13. package/dist/generator.js.map +1 -1
  14. package/dist/http_server.cjs +72 -0
  15. package/dist/http_server.cjs.map +1 -0
  16. package/dist/http_server.d.ts +1 -1
  17. package/dist/http_server.js +44 -47
  18. package/dist/http_server.js.map +1 -1
  19. package/dist/index.cjs +78 -0
  20. package/dist/index.cjs.map +1 -0
  21. package/dist/index.js +26 -28
  22. package/dist/index.js.map +1 -1
  23. package/dist/ipc/job_executor.cjs +33 -0
  24. package/dist/ipc/job_executor.cjs.map +1 -0
  25. package/dist/ipc/job_executor.js +7 -4
  26. package/dist/ipc/job_executor.js.map +1 -1
  27. package/dist/ipc/job_main.cjs +147 -0
  28. package/dist/ipc/job_main.cjs.map +1 -0
  29. package/dist/ipc/job_main.d.ts +1 -1
  30. package/dist/ipc/job_main.js +103 -103
  31. package/dist/ipc/job_main.js.map +1 -1
  32. package/dist/ipc/message.cjs +17 -0
  33. package/dist/ipc/message.cjs.map +1 -0
  34. package/dist/ipc/message.js +0 -1
  35. package/dist/ipc/message.js.map +1 -1
  36. package/dist/ipc/proc_job_executor.cjs +174 -0
  37. package/dist/ipc/proc_job_executor.cjs.map +1 -0
  38. package/dist/ipc/proc_job_executor.js +130 -126
  39. package/dist/ipc/proc_job_executor.js.map +1 -1
  40. package/dist/ipc/proc_pool.cjs +126 -0
  41. package/dist/ipc/proc_pool.cjs.map +1 -0
  42. package/dist/ipc/proc_pool.js +93 -96
  43. package/dist/ipc/proc_pool.js.map +1 -1
  44. package/dist/job.cjs +230 -0
  45. package/dist/job.cjs.map +1 -0
  46. package/dist/job.js +195 -198
  47. package/dist/job.js.map +1 -1
  48. package/dist/llm/chat_context.cjs +131 -0
  49. package/dist/llm/chat_context.cjs.map +1 -0
  50. package/dist/llm/chat_context.js +98 -86
  51. package/dist/llm/chat_context.js.map +1 -1
  52. package/dist/llm/function_context.cjs +103 -0
  53. package/dist/llm/function_context.cjs.map +1 -0
  54. package/dist/llm/function_context.js +72 -81
  55. package/dist/llm/function_context.js.map +1 -1
  56. package/dist/llm/function_context.test.cjs +218 -0
  57. package/dist/llm/function_context.test.cjs.map +1 -0
  58. package/dist/llm/function_context.test.js +209 -210
  59. package/dist/llm/function_context.test.js.map +1 -1
  60. package/dist/llm/index.cjs +43 -0
  61. package/dist/llm/index.cjs.map +1 -0
  62. package/dist/llm/index.js +22 -6
  63. package/dist/llm/index.js.map +1 -1
  64. package/dist/llm/llm.cjs +76 -0
  65. package/dist/llm/llm.cjs.map +1 -0
  66. package/dist/llm/llm.js +48 -42
  67. package/dist/llm/llm.js.map +1 -1
  68. package/dist/log.cjs +57 -0
  69. package/dist/log.cjs.map +1 -0
  70. package/dist/log.js +27 -26
  71. package/dist/log.js.map +1 -1
  72. package/dist/multimodal/agent_playout.cjs +228 -0
  73. package/dist/multimodal/agent_playout.cjs.map +1 -0
  74. package/dist/multimodal/agent_playout.d.ts +1 -1
  75. package/dist/multimodal/agent_playout.js +193 -180
  76. package/dist/multimodal/agent_playout.js.map +1 -1
  77. package/dist/multimodal/index.cjs +25 -0
  78. package/dist/multimodal/index.cjs.map +1 -0
  79. package/dist/multimodal/index.js +2 -5
  80. package/dist/multimodal/index.js.map +1 -1
  81. package/dist/multimodal/multimodal_agent.cjs +404 -0
  82. package/dist/multimodal/multimodal_agent.cjs.map +1 -0
  83. package/dist/multimodal/multimodal_agent.d.ts +1 -1
  84. package/dist/multimodal/multimodal_agent.js +351 -330
  85. package/dist/multimodal/multimodal_agent.js.map +1 -1
  86. package/dist/pipeline/agent_output.cjs +172 -0
  87. package/dist/pipeline/agent_output.cjs.map +1 -0
  88. package/dist/pipeline/agent_output.js +136 -138
  89. package/dist/pipeline/agent_output.js.map +1 -1
  90. package/dist/pipeline/agent_playout.cjs +169 -0
  91. package/dist/pipeline/agent_playout.cjs.map +1 -0
  92. package/dist/pipeline/agent_playout.js +126 -136
  93. package/dist/pipeline/agent_playout.js.map +1 -1
  94. package/dist/pipeline/human_input.cjs +158 -0
  95. package/dist/pipeline/human_input.cjs.map +1 -0
  96. package/dist/pipeline/human_input.js +124 -125
  97. package/dist/pipeline/human_input.js.map +1 -1
  98. package/dist/pipeline/index.cjs +31 -0
  99. package/dist/pipeline/index.cjs.map +1 -0
  100. package/dist/pipeline/index.js +8 -4
  101. package/dist/pipeline/index.js.map +1 -1
  102. package/dist/pipeline/pipeline_agent.cjs +642 -0
  103. package/dist/pipeline/pipeline_agent.cjs.map +1 -0
  104. package/dist/pipeline/pipeline_agent.js +595 -651
  105. package/dist/pipeline/pipeline_agent.js.map +1 -1
  106. package/dist/pipeline/speech_handle.cjs +128 -0
  107. package/dist/pipeline/speech_handle.cjs.map +1 -0
  108. package/dist/pipeline/speech_handle.js +102 -100
  109. package/dist/pipeline/speech_handle.js.map +1 -1
  110. package/dist/plugin.cjs +46 -0
  111. package/dist/plugin.cjs.map +1 -0
  112. package/dist/plugin.js +20 -20
  113. package/dist/plugin.js.map +1 -1
  114. package/dist/stt/index.cjs +38 -0
  115. package/dist/stt/index.cjs.map +1 -0
  116. package/dist/stt/index.js +13 -5
  117. package/dist/stt/index.js.map +1 -1
  118. package/dist/stt/stream_adapter.cjs +87 -0
  119. package/dist/stt/stream_adapter.cjs.map +1 -0
  120. package/dist/stt/stream_adapter.js +58 -55
  121. package/dist/stt/stream_adapter.js.map +1 -1
  122. package/dist/stt/stt.cjs +98 -0
  123. package/dist/stt/stt.cjs.map +1 -0
  124. package/dist/stt/stt.js +63 -98
  125. package/dist/stt/stt.js.map +1 -1
  126. package/dist/tokenize/basic/basic.cjs +98 -0
  127. package/dist/tokenize/basic/basic.cjs.map +1 -0
  128. package/dist/tokenize/basic/basic.js +56 -45
  129. package/dist/tokenize/basic/basic.js.map +1 -1
  130. package/dist/tokenize/basic/hyphenator.cjs +425 -0
  131. package/dist/tokenize/basic/hyphenator.cjs.map +1 -0
  132. package/dist/tokenize/basic/hyphenator.js +66 -82
  133. package/dist/tokenize/basic/hyphenator.js.map +1 -1
  134. package/dist/tokenize/basic/index.cjs +35 -0
  135. package/dist/tokenize/basic/index.cjs.map +1 -0
  136. package/dist/tokenize/basic/index.js +7 -4
  137. package/dist/tokenize/basic/index.js.map +1 -1
  138. package/dist/tokenize/basic/paragraph.cjs +57 -0
  139. package/dist/tokenize/basic/paragraph.cjs.map +1 -0
  140. package/dist/tokenize/basic/paragraph.js +30 -35
  141. package/dist/tokenize/basic/paragraph.js.map +1 -1
  142. package/dist/tokenize/basic/sentence.cjs +83 -0
  143. package/dist/tokenize/basic/sentence.cjs.map +1 -0
  144. package/dist/tokenize/basic/sentence.js +56 -57
  145. package/dist/tokenize/basic/sentence.js.map +1 -1
  146. package/dist/tokenize/basic/word.cjs +44 -0
  147. package/dist/tokenize/basic/word.cjs.map +1 -0
  148. package/dist/tokenize/basic/word.js +17 -20
  149. package/dist/tokenize/basic/word.js.map +1 -1
  150. package/dist/tokenize/index.cjs +55 -0
  151. package/dist/tokenize/index.cjs.map +1 -0
  152. package/dist/tokenize/index.js +18 -7
  153. package/dist/tokenize/index.js.map +1 -1
  154. package/dist/tokenize/token_stream.cjs +164 -0
  155. package/dist/tokenize/token_stream.cjs.map +1 -0
  156. package/dist/tokenize/token_stream.js +133 -139
  157. package/dist/tokenize/token_stream.js.map +1 -1
  158. package/dist/tokenize/tokenizer.cjs +184 -0
  159. package/dist/tokenize/tokenizer.cjs.map +1 -0
  160. package/dist/tokenize/tokenizer.js +138 -99
  161. package/dist/tokenize/tokenizer.js.map +1 -1
  162. package/dist/transcription.cjs +131 -0
  163. package/dist/transcription.cjs.map +1 -0
  164. package/dist/transcription.js +99 -96
  165. package/dist/transcription.js.map +1 -1
  166. package/dist/tts/index.cjs +38 -0
  167. package/dist/tts/index.cjs.map +1 -0
  168. package/dist/tts/index.js +13 -5
  169. package/dist/tts/index.js.map +1 -1
  170. package/dist/tts/stream_adapter.cjs +78 -0
  171. package/dist/tts/stream_adapter.cjs.map +1 -0
  172. package/dist/tts/stream_adapter.js +50 -47
  173. package/dist/tts/stream_adapter.js.map +1 -1
  174. package/dist/tts/tts.cjs +127 -0
  175. package/dist/tts/tts.cjs.map +1 -0
  176. package/dist/tts/tts.js +90 -120
  177. package/dist/tts/tts.js.map +1 -1
  178. package/dist/utils.cjs +284 -0
  179. package/dist/utils.cjs.map +1 -0
  180. package/dist/utils.js +242 -247
  181. package/dist/utils.js.map +1 -1
  182. package/dist/vad.cjs +92 -0
  183. package/dist/vad.cjs.map +1 -0
  184. package/dist/vad.js +57 -52
  185. package/dist/vad.js.map +1 -1
  186. package/dist/version.cjs +29 -0
  187. package/dist/version.cjs.map +1 -0
  188. package/dist/version.js +4 -4
  189. package/dist/version.js.map +1 -1
  190. package/dist/worker.cjs +576 -0
  191. package/dist/worker.cjs.map +1 -0
  192. package/dist/worker.d.ts +1 -1
  193. package/dist/worker.js +511 -484
  194. package/dist/worker.js.map +1 -1
  195. package/package.json +18 -8
  196. package/src/ipc/job_main.ts +66 -64
  197. package/src/pipeline/pipeline_agent.ts +23 -23
package/dist/utils.js CHANGED
@@ -1,257 +1,252 @@
1
- var _a;
2
- import { AudioFrame, TrackSource } from '@livekit/rtc-node';
3
- import { EventEmitter, once } from 'node:events';
4
- /**
5
- * Merge one or more {@link AudioFrame}s into a single one.
6
- *
7
- * @param buffer Either an {@link AudioFrame} or a list thereof
8
- * @throws
9
- * {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypeError
10
- * | TypeError} if sample rate or channel count are mismatched
11
- */
12
- export const mergeFrames = (buffer) => {
13
- if (Array.isArray(buffer)) {
14
- buffer = buffer;
15
- if (buffer.length == 0) {
16
- throw new TypeError('buffer is empty');
17
- }
18
- const sampleRate = buffer[0].sampleRate;
19
- const channels = buffer[0].channels;
20
- let samplesPerChannel = 0;
21
- let data = new Int16Array();
22
- for (const frame of buffer) {
23
- if (frame.sampleRate !== sampleRate) {
24
- throw new TypeError('sample rate mismatch');
25
- }
26
- if (frame.channels !== channels) {
27
- throw new TypeError('channel count mismatch');
28
- }
29
- data = new Int16Array([...data, ...frame.data]);
30
- samplesPerChannel += frame.samplesPerChannel;
31
- }
32
- return new AudioFrame(data, sampleRate, channels, samplesPerChannel);
33
- }
34
- return buffer;
1
+ import { AudioFrame, TrackSource } from "@livekit/rtc-node";
2
+ import { EventEmitter, once } from "node:events";
3
+ const mergeFrames = (buffer) => {
4
+ if (Array.isArray(buffer)) {
5
+ buffer = buffer;
6
+ if (buffer.length == 0) {
7
+ throw new TypeError("buffer is empty");
8
+ }
9
+ const sampleRate = buffer[0].sampleRate;
10
+ const channels = buffer[0].channels;
11
+ let samplesPerChannel = 0;
12
+ let data = new Int16Array();
13
+ for (const frame of buffer) {
14
+ if (frame.sampleRate !== sampleRate) {
15
+ throw new TypeError("sample rate mismatch");
16
+ }
17
+ if (frame.channels !== channels) {
18
+ throw new TypeError("channel count mismatch");
19
+ }
20
+ data = new Int16Array([...data, ...frame.data]);
21
+ samplesPerChannel += frame.samplesPerChannel;
22
+ }
23
+ return new AudioFrame(data, sampleRate, channels, samplesPerChannel);
24
+ }
25
+ return buffer;
35
26
  };
36
- export const findMicroTrackId = (room, identity) => {
37
- let p = room.remoteParticipants.get(identity);
38
- if (identity === room.localParticipant?.identity) {
39
- p = room.localParticipant;
40
- }
41
- if (!p) {
42
- throw new Error(`participant ${identity} not found`);
43
- }
44
- // find first micro track
45
- let trackId;
46
- p.trackPublications.forEach((track) => {
47
- if (track.source === TrackSource.SOURCE_MICROPHONE) {
48
- trackId = track.sid;
49
- return;
50
- }
51
- });
52
- if (!trackId) {
53
- throw new Error(`participant ${identity} does not have a microphone track`);
54
- }
55
- return trackId;
27
+ const findMicroTrackId = (room, identity) => {
28
+ var _a;
29
+ let p = room.remoteParticipants.get(identity);
30
+ if (identity === ((_a = room.localParticipant) == null ? void 0 : _a.identity)) {
31
+ p = room.localParticipant;
32
+ }
33
+ if (!p) {
34
+ throw new Error(`participant ${identity} not found`);
35
+ }
36
+ let trackId;
37
+ p.trackPublications.forEach((track) => {
38
+ if (track.source === TrackSource.SOURCE_MICROPHONE) {
39
+ trackId = track.sid;
40
+ return;
41
+ }
42
+ });
43
+ if (!trackId) {
44
+ throw new Error(`participant ${identity} does not have a microphone track`);
45
+ }
46
+ return trackId;
56
47
  };
57
- /** @internal */
58
- export class Queue {
59
- /** @internal */
60
- items = [];
61
- #limit;
62
- #events = new EventEmitter();
63
- constructor(limit) {
64
- this.#limit = limit;
65
- }
66
- async get() {
67
- if (this.items.length === 0) {
68
- await once(this.#events, 'put');
69
- }
70
- const item = this.items.shift();
71
- this.#events.emit('get');
72
- return item;
73
- }
74
- async put(item) {
75
- if (this.#limit && this.items.length >= this.#limit) {
76
- await once(this.#events, 'get');
77
- }
78
- this.items.push(item);
79
- this.#events.emit('put');
80
- }
48
+ class Queue {
49
+ /** @internal */
50
+ items = [];
51
+ #limit;
52
+ #events = new EventEmitter();
53
+ constructor(limit) {
54
+ this.#limit = limit;
55
+ }
56
+ async get() {
57
+ if (this.items.length === 0) {
58
+ await once(this.#events, "put");
59
+ }
60
+ const item = this.items.shift();
61
+ this.#events.emit("get");
62
+ return item;
63
+ }
64
+ async put(item) {
65
+ if (this.#limit && this.items.length >= this.#limit) {
66
+ await once(this.#events, "get");
67
+ }
68
+ this.items.push(item);
69
+ this.#events.emit("put");
70
+ }
81
71
  }
82
- /** @internal */
83
- export class Future {
84
- #await;
85
- #resolvePromise;
86
- #rejectPromise;
87
- #done = false;
88
- constructor() {
89
- this.#await = new Promise((resolve, reject) => {
90
- this.#resolvePromise = resolve;
91
- this.#rejectPromise = reject;
92
- });
93
- }
94
- get await() {
95
- return this.#await;
96
- }
97
- get done() {
98
- return this.#done;
99
- }
100
- resolve() {
101
- this.#done = true;
102
- this.#resolvePromise();
103
- }
104
- reject(error) {
105
- this.#done = true;
106
- this.#rejectPromise(error);
107
- }
72
+ class Future {
73
+ #await;
74
+ #resolvePromise;
75
+ #rejectPromise;
76
+ #done = false;
77
+ constructor() {
78
+ this.#await = new Promise((resolve, reject) => {
79
+ this.#resolvePromise = resolve;
80
+ this.#rejectPromise = reject;
81
+ });
82
+ }
83
+ get await() {
84
+ return this.#await;
85
+ }
86
+ get done() {
87
+ return this.#done;
88
+ }
89
+ resolve() {
90
+ this.#done = true;
91
+ this.#resolvePromise();
92
+ }
93
+ reject(error) {
94
+ this.#done = true;
95
+ this.#rejectPromise(error);
96
+ }
108
97
  }
109
- /** @internal */
110
- export class CancellablePromise {
111
- #promise;
112
- #cancelFn;
113
- #isCancelled = false;
114
- #error = null;
115
- constructor(executor) {
116
- let cancel;
117
- this.#promise = new Promise((resolve, reject) => {
118
- executor(resolve, (reason) => {
119
- this.#error = reason instanceof Error ? reason : new Error(String(reason));
120
- reject(reason);
121
- }, (cancelFn) => {
122
- cancel = () => {
123
- this.#isCancelled = true;
124
- cancelFn();
125
- };
126
- });
127
- });
128
- this.#cancelFn = cancel;
129
- }
130
- get isCancelled() {
131
- return this.#isCancelled;
132
- }
133
- get error() {
134
- return this.#error;
135
- }
136
- then(onfulfilled, onrejected) {
137
- return this.#promise.then(onfulfilled, onrejected);
138
- }
139
- catch(onrejected) {
140
- return this.#promise.catch(onrejected);
141
- }
142
- finally(onfinally) {
143
- return this.#promise.finally(onfinally);
144
- }
145
- cancel() {
146
- this.#cancelFn();
147
- }
148
- static from(promise) {
149
- return new CancellablePromise((resolve, reject) => {
150
- promise.then(resolve).catch(reject);
151
- });
152
- }
98
+ class CancellablePromise {
99
+ #promise;
100
+ #cancelFn;
101
+ #isCancelled = false;
102
+ #error = null;
103
+ constructor(executor) {
104
+ let cancel;
105
+ this.#promise = new Promise((resolve, reject) => {
106
+ executor(
107
+ resolve,
108
+ (reason) => {
109
+ this.#error = reason instanceof Error ? reason : new Error(String(reason));
110
+ reject(reason);
111
+ },
112
+ (cancelFn) => {
113
+ cancel = () => {
114
+ this.#isCancelled = true;
115
+ cancelFn();
116
+ };
117
+ }
118
+ );
119
+ });
120
+ this.#cancelFn = cancel;
121
+ }
122
+ get isCancelled() {
123
+ return this.#isCancelled;
124
+ }
125
+ get error() {
126
+ return this.#error;
127
+ }
128
+ then(onfulfilled, onrejected) {
129
+ return this.#promise.then(onfulfilled, onrejected);
130
+ }
131
+ catch(onrejected) {
132
+ return this.#promise.catch(onrejected);
133
+ }
134
+ finally(onfinally) {
135
+ return this.#promise.finally(onfinally);
136
+ }
137
+ cancel() {
138
+ this.#cancelFn();
139
+ }
140
+ static from(promise) {
141
+ return new CancellablePromise((resolve, reject) => {
142
+ promise.then(resolve).catch(reject);
143
+ });
144
+ }
153
145
  }
154
- /** @internal */
155
- export async function gracefullyCancel(promise) {
156
- if (!promise.isCancelled) {
157
- promise.cancel();
158
- }
159
- try {
160
- await promise;
161
- }
162
- catch (error) {
163
- // Ignore the error, as it's expected due to cancellation
164
- }
146
+ async function gracefullyCancel(promise) {
147
+ if (!promise.isCancelled) {
148
+ promise.cancel();
149
+ }
150
+ try {
151
+ await promise;
152
+ } catch (error) {
153
+ }
165
154
  }
166
- /** @internal */
167
- export class AsyncIterableQueue {
168
- static CLOSE_SENTINEL = Symbol('CLOSE_SENTINEL');
169
- #queue = new Queue();
170
- #closed = false;
171
- get closed() {
172
- return this.#closed;
173
- }
174
- put(item) {
175
- if (this.#closed) {
176
- throw new Error('Queue is closed');
177
- }
178
- this.#queue.put(item);
179
- }
180
- close() {
181
- this.#closed = true;
182
- this.#queue.put(_a.CLOSE_SENTINEL);
183
- }
184
- async next() {
185
- if (this.#closed && this.#queue.items.length === 0) {
186
- return { value: undefined, done: true };
187
- }
188
- const item = await this.#queue.get();
189
- if (item === _a.CLOSE_SENTINEL && this.#closed) {
190
- return { value: undefined, done: true };
191
- }
192
- return { value: item, done: false };
193
- }
194
- [Symbol.asyncIterator]() {
195
- return this;
196
- }
155
+ class AsyncIterableQueue {
156
+ static CLOSE_SENTINEL = Symbol("CLOSE_SENTINEL");
157
+ #queue = new Queue();
158
+ #closed = false;
159
+ get closed() {
160
+ return this.#closed;
161
+ }
162
+ put(item) {
163
+ if (this.#closed) {
164
+ throw new Error("Queue is closed");
165
+ }
166
+ this.#queue.put(item);
167
+ }
168
+ close() {
169
+ this.#closed = true;
170
+ this.#queue.put(AsyncIterableQueue.CLOSE_SENTINEL);
171
+ }
172
+ async next() {
173
+ if (this.#closed && this.#queue.items.length === 0) {
174
+ return { value: void 0, done: true };
175
+ }
176
+ const item = await this.#queue.get();
177
+ if (item === AsyncIterableQueue.CLOSE_SENTINEL && this.#closed) {
178
+ return { value: void 0, done: true };
179
+ }
180
+ return { value: item, done: false };
181
+ }
182
+ [Symbol.asyncIterator]() {
183
+ return this;
184
+ }
197
185
  }
198
- _a = AsyncIterableQueue;
199
- /** @internal */
200
- export class ExpFilter {
201
- #alpha;
202
- #max;
203
- #filtered = undefined;
204
- constructor(alpha, max) {
205
- this.#alpha = alpha;
206
- this.#max = max;
207
- }
208
- reset(alpha) {
209
- if (alpha) {
210
- this.#alpha = alpha;
211
- }
212
- this.#filtered = undefined;
213
- }
214
- apply(exp, sample) {
215
- if (this.#filtered) {
216
- const a = this.#alpha ** exp;
217
- this.#filtered = a * this.#filtered + (1 - a) * sample;
218
- }
219
- else {
220
- this.#filtered = sample;
221
- }
222
- if (this.#max && this.#filtered > this.#max) {
223
- this.#filtered = this.#max;
224
- }
225
- return this.#filtered;
226
- }
227
- get filtered() {
228
- return this.#filtered;
229
- }
230
- set alpha(alpha) {
231
- this.#alpha = alpha;
232
- }
186
+ class ExpFilter {
187
+ #alpha;
188
+ #max;
189
+ #filtered = void 0;
190
+ constructor(alpha, max) {
191
+ this.#alpha = alpha;
192
+ this.#max = max;
193
+ }
194
+ reset(alpha) {
195
+ if (alpha) {
196
+ this.#alpha = alpha;
197
+ }
198
+ this.#filtered = void 0;
199
+ }
200
+ apply(exp, sample) {
201
+ if (this.#filtered) {
202
+ const a = this.#alpha ** exp;
203
+ this.#filtered = a * this.#filtered + (1 - a) * sample;
204
+ } else {
205
+ this.#filtered = sample;
206
+ }
207
+ if (this.#max && this.#filtered > this.#max) {
208
+ this.#filtered = this.#max;
209
+ }
210
+ return this.#filtered;
211
+ }
212
+ get filtered() {
213
+ return this.#filtered;
214
+ }
215
+ set alpha(alpha) {
216
+ this.#alpha = alpha;
217
+ }
233
218
  }
234
- /** @internal */
235
- export class AudioEnergyFilter {
236
- #cooldownSeconds;
237
- #cooldown;
238
- constructor(cooldownSeconds = 1) {
239
- this.#cooldownSeconds = cooldownSeconds;
240
- this.#cooldown = cooldownSeconds;
241
- }
242
- pushFrame(frame) {
243
- const arr = Float32Array.from(frame.data, (x) => x / 32768);
244
- const rms = (arr.map((x) => x ** 2).reduce((acc, x) => acc + x) / arr.length) ** 0.5;
245
- if (rms > 0.004) {
246
- this.#cooldown = this.#cooldownSeconds;
247
- return true;
248
- }
249
- const durationSeconds = frame.samplesPerChannel / frame.sampleRate;
250
- this.#cooldown -= durationSeconds;
251
- if (this.#cooldown > 0) {
252
- return true;
253
- }
254
- return false;
255
- }
219
+ class AudioEnergyFilter {
220
+ #cooldownSeconds;
221
+ #cooldown;
222
+ constructor(cooldownSeconds = 1) {
223
+ this.#cooldownSeconds = cooldownSeconds;
224
+ this.#cooldown = cooldownSeconds;
225
+ }
226
+ pushFrame(frame) {
227
+ const arr = Float32Array.from(frame.data, (x) => x / 32768);
228
+ const rms = (arr.map((x) => x ** 2).reduce((acc, x) => acc + x) / arr.length) ** 0.5;
229
+ if (rms > 4e-3) {
230
+ this.#cooldown = this.#cooldownSeconds;
231
+ return true;
232
+ }
233
+ const durationSeconds = frame.samplesPerChannel / frame.sampleRate;
234
+ this.#cooldown -= durationSeconds;
235
+ if (this.#cooldown > 0) {
236
+ return true;
237
+ }
238
+ return false;
239
+ }
256
240
  }
241
+ export {
242
+ AsyncIterableQueue,
243
+ AudioEnergyFilter,
244
+ CancellablePromise,
245
+ ExpFilter,
246
+ Future,
247
+ Queue,
248
+ findMicroTrackId,
249
+ gracefullyCancel,
250
+ mergeFrames
251
+ };
257
252
  //# sourceMappingURL=utils.js.map
package/dist/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"sources":["../src/utils.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type {\n LocalParticipant,\n RemoteParticipant,\n Room,\n TrackPublication,\n} from '@livekit/rtc-node';\nimport { AudioFrame, TrackSource } from '@livekit/rtc-node';\nimport { EventEmitter, once } from 'node:events';\n\n/** Union of a single and a list of {@link AudioFrame}s */\nexport type AudioBuffer = AudioFrame[] | AudioFrame;\n\n/**\n * Merge one or more {@link AudioFrame}s into a single one.\n *\n * @param buffer Either an {@link AudioFrame} or a list thereof\n * @throws\n * {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypeError\n * | TypeError} if sample rate or channel count are mismatched\n */\nexport const mergeFrames = (buffer: AudioBuffer): AudioFrame => {\n if (Array.isArray(buffer)) {\n buffer = buffer as AudioFrame[];\n if (buffer.length == 0) {\n throw new TypeError('buffer is empty');\n }\n\n const sampleRate = buffer[0]!.sampleRate;\n const channels = buffer[0]!.channels;\n let samplesPerChannel = 0;\n let data = new Int16Array();\n\n for (const frame of buffer) {\n if (frame.sampleRate !== sampleRate) {\n throw new TypeError('sample rate mismatch');\n }\n\n if (frame.channels !== channels) {\n throw new TypeError('channel count mismatch');\n }\n\n data = new Int16Array([...data, ...frame.data]);\n samplesPerChannel += frame.samplesPerChannel;\n }\n\n return new AudioFrame(data, sampleRate, channels, samplesPerChannel);\n }\n\n return buffer;\n};\n\nexport const findMicroTrackId = (room: Room, identity: string): string => {\n let p: RemoteParticipant | LocalParticipant | undefined = room.remoteParticipants.get(identity);\n\n if (identity === room.localParticipant?.identity) {\n p = room.localParticipant;\n }\n\n if (!p) {\n throw new Error(`participant ${identity} not found`);\n }\n\n // find first micro track\n let trackId: string | undefined;\n p.trackPublications.forEach((track: TrackPublication) => {\n if (track.source === TrackSource.SOURCE_MICROPHONE) {\n trackId = track.sid;\n return;\n }\n });\n\n if (!trackId) {\n throw new Error(`participant ${identity} does not have a microphone track`);\n }\n\n return trackId;\n};\n\n/** @internal */\nexport class Queue<T> {\n /** @internal */\n items: T[] = [];\n #limit?: number;\n #events = new EventEmitter();\n\n constructor(limit?: number) {\n this.#limit = limit;\n }\n\n async get(): Promise<T> {\n if (this.items.length === 0) {\n await once(this.#events, 'put');\n }\n const item = this.items.shift()!;\n this.#events.emit('get');\n return item;\n }\n\n async put(item: T) {\n if (this.#limit && this.items.length >= this.#limit) {\n await once(this.#events, 'get');\n }\n this.items.push(item);\n this.#events.emit('put');\n }\n}\n\n/** @internal */\nexport class Future {\n #await: Promise<void>;\n #resolvePromise!: () => void;\n #rejectPromise!: (error: Error) => void;\n #done: boolean = false;\n\n constructor() {\n this.#await = new Promise<void>((resolve, reject) => {\n this.#resolvePromise = resolve;\n this.#rejectPromise = reject;\n });\n }\n\n get await() {\n return this.#await;\n }\n\n get done() {\n return this.#done;\n }\n\n resolve() {\n this.#done = true;\n this.#resolvePromise();\n }\n\n reject(error: Error) {\n this.#done = true;\n this.#rejectPromise(error);\n }\n}\n\n/** @internal */\nexport class CancellablePromise<T> {\n #promise: Promise<T>;\n #cancelFn: () => void;\n #isCancelled: boolean = false;\n #error: Error | null = null;\n\n constructor(\n executor: (\n resolve: (value: T | PromiseLike<T>) => void,\n reject: (reason?: any) => void,\n onCancel: (cancelFn: () => void) => void,\n ) => void,\n ) {\n let cancel: () => void;\n\n this.#promise = new Promise<T>((resolve, reject) => {\n executor(\n resolve,\n (reason) => {\n this.#error = reason instanceof Error ? reason : new Error(String(reason));\n reject(reason);\n },\n (cancelFn) => {\n cancel = () => {\n this.#isCancelled = true;\n cancelFn();\n };\n },\n );\n });\n\n this.#cancelFn = cancel!;\n }\n\n get isCancelled(): boolean {\n return this.#isCancelled;\n }\n\n get error(): Error | null {\n return this.#error;\n }\n\n then<TResult1 = T, TResult2 = never>(\n onfulfilled?: ((value: T) => TResult1 | Promise<TResult1>) | null,\n onrejected?: ((reason: any) => TResult2 | Promise<TResult2>) | null,\n ): Promise<TResult1 | TResult2> {\n return this.#promise.then(onfulfilled, onrejected);\n }\n\n catch<TResult = never>(\n onrejected?: ((reason: any) => TResult | Promise<TResult>) | null,\n ): Promise<T | TResult> {\n return this.#promise.catch(onrejected);\n }\n\n finally(onfinally?: (() => void) | null): Promise<T> {\n return this.#promise.finally(onfinally);\n }\n\n cancel(): void {\n this.#cancelFn();\n }\n\n static from<T>(promise: Promise<T>): CancellablePromise<T> {\n return new CancellablePromise<T>((resolve, reject) => {\n promise.then(resolve).catch(reject);\n });\n }\n}\n\n/** @internal */\nexport async function gracefullyCancel<T>(promise: CancellablePromise<T>): Promise<void> {\n if (!promise.isCancelled) {\n promise.cancel();\n }\n try {\n await promise;\n } catch (error) {\n // Ignore the error, as it's expected due to cancellation\n }\n}\n\n/** @internal */\nexport class AsyncIterableQueue<T> implements AsyncIterableIterator<T> {\n private static readonly CLOSE_SENTINEL = Symbol('CLOSE_SENTINEL');\n #queue = new Queue<T | typeof AsyncIterableQueue.CLOSE_SENTINEL>();\n #closed = false;\n\n get closed(): boolean {\n return this.#closed;\n }\n\n put(item: T): void {\n if (this.#closed) {\n throw new Error('Queue is closed');\n }\n this.#queue.put(item);\n }\n\n close(): void {\n this.#closed = true;\n this.#queue.put(AsyncIterableQueue.CLOSE_SENTINEL);\n }\n\n async next(): Promise<IteratorResult<T>> {\n if (this.#closed && this.#queue.items.length === 0) {\n return { value: undefined, done: true };\n }\n const item = await this.#queue.get();\n if (item === AsyncIterableQueue.CLOSE_SENTINEL && this.#closed) {\n return { value: undefined, done: true };\n }\n return { value: item as T, done: false };\n }\n\n [Symbol.asyncIterator](): AsyncIterableQueue<T> {\n return this;\n }\n}\n\n/** @internal */\nexport class ExpFilter {\n #alpha: number;\n #max?: number;\n #filtered?: number = undefined;\n\n constructor(alpha: number, max?: number) {\n this.#alpha = alpha;\n this.#max = max;\n }\n\n reset(alpha?: number) {\n if (alpha) {\n this.#alpha = alpha;\n }\n this.#filtered = undefined;\n }\n\n apply(exp: number, sample: number): number {\n if (this.#filtered) {\n const a = this.#alpha ** exp;\n this.#filtered = a * this.#filtered + (1 - a) * sample;\n } else {\n this.#filtered = sample;\n }\n\n if (this.#max && this.#filtered > this.#max) {\n this.#filtered = this.#max;\n }\n\n return this.#filtered;\n }\n\n get filtered(): number | undefined {\n return this.#filtered;\n }\n\n set alpha(alpha: number) {\n this.#alpha = alpha;\n }\n}\n\n/** @internal */\nexport class AudioEnergyFilter {\n #cooldownSeconds: number;\n #cooldown: number;\n\n constructor(cooldownSeconds = 1) {\n this.#cooldownSeconds = cooldownSeconds;\n this.#cooldown = cooldownSeconds;\n }\n\n pushFrame(frame: AudioFrame): boolean {\n const arr = Float32Array.from(frame.data, (x) => x / 32768);\n const rms = (arr.map((x) => x ** 2).reduce((acc, x) => acc + x) / arr.length) ** 0.5;\n if (rms > 0.004) {\n this.#cooldown = this.#cooldownSeconds;\n return true;\n }\n\n const durationSeconds = frame.samplesPerChannel / frame.sampleRate;\n this.#cooldown -= durationSeconds;\n if (this.#cooldown > 0) {\n return true;\n }\n\n return false;\n }\n}\n"],"mappings":"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","names":[]}
package/dist/vad.cjs ADDED
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var vad_exports = {};
20
+ __export(vad_exports, {
21
+ VAD: () => VAD,
22
+ VADEventType: () => VADEventType,
23
+ VADStream: () => VADStream
24
+ });
25
+ module.exports = __toCommonJS(vad_exports);
26
+ var import_utils = require("./utils.cjs");
27
+ var VADEventType = /* @__PURE__ */ ((VADEventType2) => {
28
+ VADEventType2[VADEventType2["START_OF_SPEECH"] = 0] = "START_OF_SPEECH";
29
+ VADEventType2[VADEventType2["INFERENCE_DONE"] = 1] = "INFERENCE_DONE";
30
+ VADEventType2[VADEventType2["END_OF_SPEECH"] = 2] = "END_OF_SPEECH";
31
+ return VADEventType2;
32
+ })(VADEventType || {});
33
+ class VAD {
34
+ #capabilities;
35
+ constructor(capabilities) {
36
+ this.#capabilities = capabilities;
37
+ }
38
+ get capabilities() {
39
+ return this.#capabilities;
40
+ }
41
+ }
42
+ class VADStream {
43
+ static FLUSH_SENTINEL = Symbol("FLUSH_SENTINEL");
44
+ input = new import_utils.AsyncIterableQueue();
45
+ queue = new import_utils.AsyncIterableQueue();
46
+ closed = false;
47
+ pushFrame(frame) {
48
+ if (this.input.closed) {
49
+ throw new Error("Input is closed");
50
+ }
51
+ if (this.closed) {
52
+ throw new Error("Stream is closed");
53
+ }
54
+ this.input.put(frame);
55
+ }
56
+ flush() {
57
+ if (this.input.closed) {
58
+ throw new Error("Input is closed");
59
+ }
60
+ if (this.closed) {
61
+ throw new Error("Stream is closed");
62
+ }
63
+ this.input.put(VADStream.FLUSH_SENTINEL);
64
+ }
65
+ endInput() {
66
+ if (this.input.closed) {
67
+ throw new Error("Input is closed");
68
+ }
69
+ if (this.closed) {
70
+ throw new Error("Stream is closed");
71
+ }
72
+ this.input.close();
73
+ }
74
+ next() {
75
+ return this.queue.next();
76
+ }
77
+ close() {
78
+ this.input.close();
79
+ this.queue.close();
80
+ this.closed = true;
81
+ }
82
+ [Symbol.asyncIterator]() {
83
+ return this;
84
+ }
85
+ }
86
+ // Annotate the CommonJS export names for ESM import in node:
87
+ 0 && (module.exports = {
88
+ VAD,
89
+ VADEventType,
90
+ VADStream
91
+ });
92
+ //# sourceMappingURL=vad.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/vad.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { AudioFrame } from '@livekit/rtc-node';\nimport { AsyncIterableQueue } from './utils.js';\n\nexport enum VADEventType {\n START_OF_SPEECH,\n INFERENCE_DONE,\n END_OF_SPEECH,\n}\n\nexport interface VADEvent {\n /** Type of the VAD event (e.g., start of speech, end of speech, inference done). */\n type: VADEventType;\n /**\n * Index of the audio sample where the event occurred, relative to the inference sample rate.\n */\n samplesIndex: number;\n /** Timestamp when the event was fired. */\n timestamp: number;\n /** Duration of the detected speech segment in seconds. */\n speechDuration: number;\n /** Duration of the silence segment preceding or following the speech, in seconds. */\n silenceDuration: number;\n /**\n * List of audio frames associated with the speech.\n *\n * @remarks\n * - For `start_of_speech` events, this contains the audio chunks that triggered the detection.\n * - For `inference_done` events, this contains the audio chunks that were processed.\n * - For `end_of_speech` events, this contains the complete user speech.\n */\n frames: AudioFrame[];\n /** Probability that speech is present (only for `INFERENCE_DONE` events). */\n probability: number;\n /** Time taken to perform the inference, in seconds (only for `INFERENCE_DONE` events). */\n inferenceDuration: number;\n /** Indicates whether speech was detected in the frames. */\n speaking: boolean;\n}\n\nexport interface VADCapabilities {\n updateInterval: number;\n}\n\nexport abstract class VAD {\n #capabilities: VADCapabilities;\n constructor(capabilities: VADCapabilities) {\n this.#capabilities = capabilities;\n }\n\n get capabilities(): VADCapabilities {\n return this.#capabilities;\n }\n\n /**\n * Returns a {@link VADStream} that can be used to push audio frames and receive VAD events.\n */\n abstract stream(): VADStream;\n}\n\nexport abstract class VADStream implements AsyncIterableIterator<VADEvent> {\n protected static readonly FLUSH_SENTINEL = Symbol('FLUSH_SENTINEL');\n protected input = new AsyncIterableQueue<AudioFrame | typeof VADStream.FLUSH_SENTINEL>();\n protected queue = new AsyncIterableQueue<VADEvent>();\n protected closed = false;\n\n pushFrame(frame: AudioFrame) {\n if (this.input.closed) {\n throw new Error('Input is closed');\n }\n if (this.closed) {\n throw new Error('Stream is closed');\n }\n this.input.put(frame);\n }\n\n flush() {\n if (this.input.closed) {\n throw new Error('Input is closed');\n }\n if (this.closed) {\n throw new Error('Stream is closed');\n }\n this.input.put(VADStream.FLUSH_SENTINEL);\n }\n\n endInput() {\n if (this.input.closed) {\n throw new Error('Input is closed');\n }\n if (this.closed) {\n throw new Error('Stream is closed');\n }\n this.input.close();\n }\n\n next(): Promise<IteratorResult<VADEvent>> {\n return this.queue.next();\n }\n\n close() {\n this.input.close();\n this.queue.close();\n this.closed = true;\n }\n\n [Symbol.asyncIterator](): VADStream {\n return this;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,mBAAmC;AAE5B,IAAK,eAAL,kBAAKA,kBAAL;AACL,EAAAA,4BAAA;AACA,EAAAA,4BAAA;AACA,EAAAA,4BAAA;AAHU,SAAAA;AAAA,GAAA;AAwCL,MAAe,IAAI;AAAA,EACxB;AAAA,EACA,YAAY,cAA+B;AACzC,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEA,IAAI,eAAgC;AAClC,WAAO,KAAK;AAAA,EACd;AAMF;AAEO,MAAe,UAAqD;AAAA,EACzE,OAA0B,iBAAiB,OAAO,gBAAgB;AAAA,EACxD,QAAQ,IAAI,gCAAiE;AAAA,EAC7E,QAAQ,IAAI,gCAA6B;AAAA,EACzC,SAAS;AAAA,EAEnB,UAAU,OAAmB;AAC3B,QAAI,KAAK,MAAM,QAAQ;AACrB,YAAM,IAAI,MAAM,iBAAiB;AAAA,IACnC;AACA,QAAI,KAAK,QAAQ;AACf,YAAM,IAAI,MAAM,kBAAkB;AAAA,IACpC;AACA,SAAK,MAAM,IAAI,KAAK;AAAA,EACtB;AAAA,EAEA,QAAQ;AACN,QAAI,KAAK,MAAM,QAAQ;AACrB,YAAM,IAAI,MAAM,iBAAiB;AAAA,IACnC;AACA,QAAI,KAAK,QAAQ;AACf,YAAM,IAAI,MAAM,kBAAkB;AAAA,IACpC;AACA,SAAK,MAAM,IAAI,UAAU,cAAc;AAAA,EACzC;AAAA,EAEA,WAAW;AACT,QAAI,KAAK,MAAM,QAAQ;AACrB,YAAM,IAAI,MAAM,iBAAiB;AAAA,IACnC;AACA,QAAI,KAAK,QAAQ;AACf,YAAM,IAAI,MAAM,kBAAkB;AAAA,IACpC;AACA,SAAK,MAAM,MAAM;AAAA,EACnB;AAAA,EAEA,OAA0C;AACxC,WAAO,KAAK,MAAM,KAAK;AAAA,EACzB;AAAA,EAEA,QAAQ;AACN,SAAK,MAAM,MAAM;AACjB,SAAK,MAAM,MAAM;AACjB,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,CAAC,OAAO,aAAa,IAAe;AAClC,WAAO;AAAA,EACT;AACF;","names":["VADEventType"]}