@livekit/agents 0.3.4 → 0.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 (188) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +40 -0
  3. package/dist/audio.js +17 -30
  4. package/dist/audio.js.map +1 -1
  5. package/dist/cli.js +3 -14
  6. package/dist/cli.js.map +1 -1
  7. package/dist/http_server.d.ts +1 -1
  8. package/dist/http_server.js +5 -9
  9. package/dist/http_server.js.map +1 -1
  10. package/dist/index.d.ts +3 -2
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +14 -2
  13. package/dist/index.js.map +1 -1
  14. package/dist/ipc/job_executor.js +3 -5
  15. package/dist/ipc/job_executor.js.map +1 -1
  16. package/dist/ipc/job_main.d.ts +1 -1
  17. package/dist/ipc/proc_job_executor.js +66 -80
  18. package/dist/ipc/proc_job_executor.js.map +1 -1
  19. package/dist/ipc/proc_pool.d.ts +3 -3
  20. package/dist/ipc/proc_pool.d.ts.map +1 -1
  21. package/dist/ipc/proc_pool.js +16 -11
  22. package/dist/ipc/proc_pool.js.map +1 -1
  23. package/dist/job.js +56 -73
  24. package/dist/job.js.map +1 -1
  25. package/dist/llm/chat_context.d.ts +66 -0
  26. package/dist/llm/chat_context.d.ts.map +1 -0
  27. package/dist/llm/chat_context.js +93 -0
  28. package/dist/llm/chat_context.js.map +1 -0
  29. package/dist/llm/function_context.d.ts +19 -1
  30. package/dist/llm/function_context.d.ts.map +1 -1
  31. package/dist/llm/function_context.js +54 -18
  32. package/dist/llm/function_context.js.map +1 -1
  33. package/dist/llm/function_context.test.d.ts +2 -0
  34. package/dist/llm/function_context.test.d.ts.map +1 -0
  35. package/dist/llm/function_context.test.js +218 -0
  36. package/dist/llm/function_context.test.js.map +1 -0
  37. package/dist/llm/index.d.ts +3 -2
  38. package/dist/llm/index.d.ts.map +1 -1
  39. package/dist/llm/index.js +3 -2
  40. package/dist/llm/index.js.map +1 -1
  41. package/dist/llm/llm.d.ts +53 -0
  42. package/dist/llm/llm.d.ts.map +1 -0
  43. package/dist/llm/llm.js +45 -0
  44. package/dist/llm/llm.js.map +1 -0
  45. package/dist/multimodal/agent_playout.d.ts +1 -1
  46. package/dist/multimodal/agent_playout.js +116 -153
  47. package/dist/multimodal/agent_playout.js.map +1 -1
  48. package/dist/multimodal/multimodal_agent.d.ts +4 -3
  49. package/dist/multimodal/multimodal_agent.d.ts.map +1 -1
  50. package/dist/multimodal/multimodal_agent.js +214 -237
  51. package/dist/multimodal/multimodal_agent.js.map +1 -1
  52. package/dist/pipeline/agent_output.d.ts +30 -0
  53. package/dist/pipeline/agent_output.d.ts.map +1 -0
  54. package/dist/pipeline/agent_output.js +155 -0
  55. package/dist/pipeline/agent_output.js.map +1 -0
  56. package/dist/pipeline/agent_playout.d.ts +38 -0
  57. package/dist/pipeline/agent_playout.d.ts.map +1 -0
  58. package/dist/pipeline/agent_playout.js +142 -0
  59. package/dist/pipeline/agent_playout.js.map +1 -0
  60. package/dist/pipeline/human_input.d.ts +28 -0
  61. package/dist/pipeline/human_input.d.ts.map +1 -0
  62. package/dist/pipeline/human_input.js +134 -0
  63. package/dist/pipeline/human_input.js.map +1 -0
  64. package/dist/pipeline/index.d.ts +2 -0
  65. package/dist/pipeline/index.d.ts.map +1 -0
  66. package/dist/pipeline/index.js +5 -0
  67. package/dist/pipeline/index.js.map +1 -0
  68. package/dist/pipeline/pipeline_agent.d.ts +134 -0
  69. package/dist/pipeline/pipeline_agent.d.ts.map +1 -0
  70. package/dist/pipeline/pipeline_agent.js +661 -0
  71. package/dist/pipeline/pipeline_agent.js.map +1 -0
  72. package/dist/pipeline/speech_handle.d.ts +27 -0
  73. package/dist/pipeline/speech_handle.d.ts.map +1 -0
  74. package/dist/pipeline/speech_handle.js +102 -0
  75. package/dist/pipeline/speech_handle.js.map +1 -0
  76. package/dist/plugin.js +7 -20
  77. package/dist/plugin.js.map +1 -1
  78. package/dist/stt/index.d.ts +1 -2
  79. package/dist/stt/index.d.ts.map +1 -1
  80. package/dist/stt/index.js +1 -2
  81. package/dist/stt/index.js.map +1 -1
  82. package/dist/stt/stt.d.ts +62 -24
  83. package/dist/stt/stt.d.ts.map +1 -1
  84. package/dist/stt/stt.js +77 -27
  85. package/dist/stt/stt.js.map +1 -1
  86. package/dist/tokenize/basic/basic.d.ts +16 -0
  87. package/dist/tokenize/basic/basic.d.ts.map +1 -0
  88. package/dist/tokenize/basic/basic.js +50 -0
  89. package/dist/tokenize/basic/basic.js.map +1 -0
  90. package/dist/tokenize/basic/hyphenator.d.ts +17 -0
  91. package/dist/tokenize/basic/hyphenator.d.ts.map +1 -0
  92. package/dist/tokenize/basic/hyphenator.js +420 -0
  93. package/dist/tokenize/basic/hyphenator.js.map +1 -0
  94. package/dist/tokenize/basic/index.d.ts +2 -0
  95. package/dist/tokenize/basic/index.d.ts.map +1 -0
  96. package/dist/tokenize/basic/index.js +5 -0
  97. package/dist/tokenize/basic/index.js.map +1 -0
  98. package/dist/tokenize/basic/paragraph.d.ts +5 -0
  99. package/dist/tokenize/basic/paragraph.d.ts.map +1 -0
  100. package/dist/tokenize/basic/paragraph.js +38 -0
  101. package/dist/tokenize/basic/paragraph.js.map +1 -0
  102. package/dist/tokenize/basic/sentence.d.ts +5 -0
  103. package/dist/tokenize/basic/sentence.d.ts.map +1 -0
  104. package/dist/tokenize/basic/sentence.js +60 -0
  105. package/dist/tokenize/basic/sentence.js.map +1 -0
  106. package/dist/tokenize/basic/word.d.ts +5 -0
  107. package/dist/tokenize/basic/word.d.ts.map +1 -0
  108. package/dist/tokenize/basic/word.js +23 -0
  109. package/dist/tokenize/basic/word.js.map +1 -0
  110. package/dist/tokenize/index.d.ts +5 -0
  111. package/dist/tokenize/index.d.ts.map +1 -0
  112. package/dist/tokenize/index.js +8 -0
  113. package/dist/tokenize/index.js.map +1 -0
  114. package/dist/tokenize/token_stream.d.ts +36 -0
  115. package/dist/tokenize/token_stream.d.ts.map +1 -0
  116. package/dist/tokenize/token_stream.js +136 -0
  117. package/dist/tokenize/token_stream.js.map +1 -0
  118. package/dist/tokenize/tokenizer.d.ts +55 -0
  119. package/dist/tokenize/tokenizer.d.ts.map +1 -0
  120. package/dist/tokenize/tokenizer.js +117 -0
  121. package/dist/tokenize/tokenizer.js.map +1 -0
  122. package/dist/transcription.js +78 -89
  123. package/dist/transcription.js.map +1 -1
  124. package/dist/tts/index.d.ts +1 -3
  125. package/dist/tts/index.d.ts.map +1 -1
  126. package/dist/tts/index.js +1 -3
  127. package/dist/tts/index.js.map +1 -1
  128. package/dist/tts/tts.d.ts +66 -37
  129. package/dist/tts/tts.d.ts.map +1 -1
  130. package/dist/tts/tts.js +79 -74
  131. package/dist/tts/tts.js.map +1 -1
  132. package/dist/utils.d.ts +21 -6
  133. package/dist/utils.d.ts.map +1 -1
  134. package/dist/utils.js +120 -76
  135. package/dist/utils.js.map +1 -1
  136. package/dist/vad.d.ts +43 -39
  137. package/dist/vad.d.ts.map +1 -1
  138. package/dist/vad.js +51 -4
  139. package/dist/vad.js.map +1 -1
  140. package/dist/worker.d.ts +1 -1
  141. package/dist/worker.js +257 -247
  142. package/dist/worker.js.map +1 -1
  143. package/package.json +4 -3
  144. package/src/index.ts +16 -2
  145. package/src/ipc/proc_pool.ts +4 -4
  146. package/src/llm/chat_context.ts +147 -0
  147. package/src/llm/function_context.test.ts +248 -0
  148. package/src/llm/function_context.ts +77 -18
  149. package/src/llm/index.ts +21 -2
  150. package/src/llm/llm.ts +102 -0
  151. package/src/multimodal/multimodal_agent.ts +19 -6
  152. package/src/pipeline/agent_output.ts +185 -0
  153. package/src/pipeline/agent_playout.ts +187 -0
  154. package/src/pipeline/human_input.ts +166 -0
  155. package/src/pipeline/index.ts +15 -0
  156. package/src/pipeline/pipeline_agent.ts +917 -0
  157. package/src/pipeline/speech_handle.ts +136 -0
  158. package/src/stt/index.ts +8 -2
  159. package/src/stt/stt.ts +98 -31
  160. package/src/tokenize/basic/basic.ts +73 -0
  161. package/src/tokenize/basic/hyphenator.ts +436 -0
  162. package/src/tokenize/basic/index.ts +5 -0
  163. package/src/tokenize/basic/paragraph.ts +43 -0
  164. package/src/tokenize/basic/sentence.ts +69 -0
  165. package/src/tokenize/basic/word.ts +27 -0
  166. package/src/tokenize/index.ts +16 -0
  167. package/src/tokenize/token_stream.ts +163 -0
  168. package/src/tokenize/tokenizer.ts +152 -0
  169. package/src/tts/index.ts +1 -20
  170. package/src/tts/tts.ts +110 -57
  171. package/src/utils.ts +95 -25
  172. package/src/vad.ts +86 -45
  173. package/tsconfig.tsbuildinfo +1 -1
  174. package/dist/stt/stream_adapter.d.ts +0 -19
  175. package/dist/stt/stream_adapter.d.ts.map +0 -1
  176. package/dist/stt/stream_adapter.js +0 -96
  177. package/dist/stt/stream_adapter.js.map +0 -1
  178. package/dist/tokenize.d.ts +0 -15
  179. package/dist/tokenize.d.ts.map +0 -1
  180. package/dist/tokenize.js +0 -12
  181. package/dist/tokenize.js.map +0 -1
  182. package/dist/tts/stream_adapter.d.ts +0 -19
  183. package/dist/tts/stream_adapter.d.ts.map +0 -1
  184. package/dist/tts/stream_adapter.js +0 -111
  185. package/dist/tts/stream_adapter.js.map +0 -1
  186. package/src/stt/stream_adapter.ts +0 -104
  187. package/src/tokenize.ts +0 -22
  188. package/src/tts/stream_adapter.ts +0 -93
@@ -1,96 +0,0 @@
1
- var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
2
- if (kind === "m") throw new TypeError("Private method is not writable");
3
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
4
- if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
5
- return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
6
- };
7
- var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
8
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
9
- if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
- return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
- };
12
- var _StreamAdapterWrapper_closed, _StreamAdapterWrapper_stt, _StreamAdapterWrapper_vadStream, _StreamAdapterWrapper_eventQueue, _StreamAdapterWrapper_language, _StreamAdapterWrapper_task, _StreamAdapter_stt, _StreamAdapter_vadStream;
13
- import { mergeFrames } from '../utils.js';
14
- import { VADEventType } from '../vad.js';
15
- import { STT, SpeechEvent, SpeechEventType, SpeechStream } from './stt.js';
16
- export class StreamAdapterWrapper extends SpeechStream {
17
- constructor(stt, vadStream, language = undefined) {
18
- super();
19
- _StreamAdapterWrapper_closed.set(this, void 0);
20
- _StreamAdapterWrapper_stt.set(this, void 0);
21
- _StreamAdapterWrapper_vadStream.set(this, void 0);
22
- _StreamAdapterWrapper_eventQueue.set(this, void 0);
23
- _StreamAdapterWrapper_language.set(this, void 0);
24
- _StreamAdapterWrapper_task.set(this, void 0);
25
- __classPrivateFieldSet(this, _StreamAdapterWrapper_closed, false, "f");
26
- __classPrivateFieldSet(this, _StreamAdapterWrapper_stt, stt, "f");
27
- __classPrivateFieldSet(this, _StreamAdapterWrapper_vadStream, vadStream, "f");
28
- __classPrivateFieldSet(this, _StreamAdapterWrapper_eventQueue, [], "f");
29
- __classPrivateFieldSet(this, _StreamAdapterWrapper_language, language, "f");
30
- __classPrivateFieldSet(this, _StreamAdapterWrapper_task, {
31
- run: new Promise((_, reject) => {
32
- this.run(reject);
33
- }),
34
- cancel: () => { },
35
- }, "f");
36
- }
37
- async run(reject) {
38
- __classPrivateFieldGet(this, _StreamAdapterWrapper_task, "f").cancel = () => {
39
- __classPrivateFieldSet(this, _StreamAdapterWrapper_closed, true, "f");
40
- reject(new Error('cancelled'));
41
- };
42
- for (const event of __classPrivateFieldGet(this, _StreamAdapterWrapper_vadStream, "f")) {
43
- if (event.type == VADEventType.START_OF_SPEECH) {
44
- const startEvent = new SpeechEvent(SpeechEventType.START_OF_SPEECH);
45
- __classPrivateFieldGet(this, _StreamAdapterWrapper_eventQueue, "f").push(startEvent);
46
- }
47
- else if (event.type == VADEventType.END_OF_SPEECH) {
48
- const mergedFrames = mergeFrames(event.speech);
49
- const endEvent = await __classPrivateFieldGet(this, _StreamAdapterWrapper_stt, "f").recognize(mergedFrames, __classPrivateFieldGet(this, _StreamAdapterWrapper_language, "f"));
50
- __classPrivateFieldGet(this, _StreamAdapterWrapper_eventQueue, "f").push(endEvent);
51
- }
52
- }
53
- __classPrivateFieldGet(this, _StreamAdapterWrapper_eventQueue, "f").push(undefined);
54
- }
55
- pushFrame(frame) {
56
- if (__classPrivateFieldGet(this, _StreamAdapterWrapper_closed, "f")) {
57
- throw new TypeError('cannot push frame to closed stream');
58
- }
59
- __classPrivateFieldGet(this, _StreamAdapterWrapper_vadStream, "f").pushFrame(frame);
60
- }
61
- async close(wait = true) {
62
- __classPrivateFieldSet(this, _StreamAdapterWrapper_closed, true, "f");
63
- if (!wait) {
64
- __classPrivateFieldGet(this, _StreamAdapterWrapper_task, "f").cancel();
65
- }
66
- await __classPrivateFieldGet(this, _StreamAdapterWrapper_vadStream, "f").close(wait);
67
- await __classPrivateFieldGet(this, _StreamAdapterWrapper_task, "f").run;
68
- }
69
- next() {
70
- const item = __classPrivateFieldGet(this, _StreamAdapterWrapper_eventQueue, "f").shift();
71
- if (item) {
72
- return { done: false, value: item };
73
- }
74
- else {
75
- return { done: true, value: undefined };
76
- }
77
- }
78
- }
79
- _StreamAdapterWrapper_closed = new WeakMap(), _StreamAdapterWrapper_stt = new WeakMap(), _StreamAdapterWrapper_vadStream = new WeakMap(), _StreamAdapterWrapper_eventQueue = new WeakMap(), _StreamAdapterWrapper_language = new WeakMap(), _StreamAdapterWrapper_task = new WeakMap();
80
- export class StreamAdapter extends STT {
81
- constructor(stt, vadStream) {
82
- super(true);
83
- _StreamAdapter_stt.set(this, void 0);
84
- _StreamAdapter_vadStream.set(this, void 0);
85
- __classPrivateFieldSet(this, _StreamAdapter_stt, stt, "f");
86
- __classPrivateFieldSet(this, _StreamAdapter_vadStream, vadStream, "f");
87
- }
88
- async recognize(buffer, language = undefined) {
89
- return await __classPrivateFieldGet(this, _StreamAdapter_stt, "f").recognize(buffer, language);
90
- }
91
- stream(language = undefined) {
92
- return new StreamAdapterWrapper(__classPrivateFieldGet(this, _StreamAdapter_stt, "f"), __classPrivateFieldGet(this, _StreamAdapter_vadStream, "f"), language);
93
- }
94
- }
95
- _StreamAdapter_stt = new WeakMap(), _StreamAdapter_vadStream = new WeakMap();
96
- //# sourceMappingURL=stream_adapter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stream_adapter.js","sourceRoot":"","sources":["../../src/stt/stream_adapter.ts"],"names":[],"mappings":"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"}
@@ -1,15 +0,0 @@
1
- export interface SegmentedSentence {
2
- text: string;
3
- }
4
- export declare abstract class SentenceTokenizer {
5
- abstract tokenize(text: string, language?: string): SegmentedSentence[];
6
- abstract stream(language: string | undefined): SentenceStream;
7
- }
8
- export declare abstract class SentenceStream implements IterableIterator<SegmentedSentence> {
9
- abstract pushText(text: string): void;
10
- abstract flush(): Promise<void>;
11
- close(): Promise<void>;
12
- abstract next(): IteratorResult<SegmentedSentence>;
13
- [Symbol.iterator](): SentenceStream;
14
- }
15
- //# sourceMappingURL=tokenize.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tokenize.d.ts","sourceRoot":"","sources":["../src/tokenize.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,8BAAsB,iBAAiB;IACrC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,iBAAiB,EAAE;IACvE,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,cAAc;CAC9D;AAED,8BAAsB,cAAe,YAAW,gBAAgB,CAAC,iBAAiB,CAAC;IACjF,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IACrC,QAAQ,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IACzB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAC5B,QAAQ,CAAC,IAAI,IAAI,cAAc,CAAC,iBAAiB,CAAC;IAClD,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,cAAc;CAGpC"}
package/dist/tokenize.js DELETED
@@ -1,12 +0,0 @@
1
- // SPDX-FileCopyrightText: 2024 LiveKit, Inc.
2
- //
3
- // SPDX-License-Identifier: Apache-2.0
4
- export class SentenceTokenizer {
5
- }
6
- export class SentenceStream {
7
- async close() { }
8
- [Symbol.iterator]() {
9
- return this;
10
- }
11
- }
12
- //# sourceMappingURL=tokenize.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tokenize.js","sourceRoot":"","sources":["../src/tokenize.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,EAAE;AACF,sCAAsC;AAMtC,MAAM,OAAgB,iBAAiB;CAGtC;AAED,MAAM,OAAgB,cAAc;IAGlC,KAAK,CAAC,KAAK,KAAmB,CAAC;IAE/B,CAAC,MAAM,CAAC,QAAQ,CAAC;QACf,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
@@ -1,19 +0,0 @@
1
- import type { SentenceStream, SentenceTokenizer } from '../tokenize.js';
2
- import type { ChunkedStream } from './tts.js';
3
- import { SynthesisEvent, SynthesizeStream, TTS } from './tts.js';
4
- export declare class StreamAdapterWrapper extends SynthesizeStream {
5
- #private;
6
- constructor(tts: TTS, sentenceStream: SentenceStream);
7
- run(reject: (arg: Error) => void): Promise<void>;
8
- pushText(token: string): void;
9
- flush(): Promise<void>;
10
- next(): IteratorResult<SynthesisEvent>;
11
- close(): Promise<void>;
12
- }
13
- export declare class StreamAdapter extends TTS {
14
- #private;
15
- constructor(tts: TTS, tokenizer: SentenceTokenizer);
16
- synthesize(text: string): Promise<ChunkedStream>;
17
- stream(): StreamAdapterWrapper;
18
- }
19
- //# sourceMappingURL=stream_adapter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stream_adapter.d.ts","sourceRoot":"","sources":["../../src/tts/stream_adapter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAsB,gBAAgB,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAErF,qBAAa,oBAAqB,SAAQ,gBAAgB;;gBAU5C,GAAG,EAAE,GAAG,EAAE,cAAc,EAAE,cAAc;IAc9C,GAAG,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI;IAiBtC,QAAQ,CAAC,KAAK,EAAE,MAAM;IAIhB,KAAK;IAIX,IAAI,IAAI,cAAc,CAAC,cAAc,CAAC;IAShC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAQ7B;AAED,qBAAa,aAAc,SAAQ,GAAG;;gBAIxB,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,iBAAiB;IAMlD,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAIhD,MAAM;CAGP"}
@@ -1,111 +0,0 @@
1
- var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
2
- if (kind === "m") throw new TypeError("Private method is not writable");
3
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
4
- if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
5
- return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
6
- };
7
- var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
8
- if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
9
- if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
- return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
- };
12
- var __asyncValues = (this && this.__asyncValues) || function (o) {
13
- if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
14
- var m = o[Symbol.asyncIterator], i;
15
- return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
16
- function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
17
- function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
18
- };
19
- var _StreamAdapterWrapper_closed, _StreamAdapterWrapper_tts, _StreamAdapterWrapper_sentenceStream, _StreamAdapterWrapper_eventQueue, _StreamAdapterWrapper_task, _StreamAdapter_tts, _StreamAdapter_tokenizer;
20
- import { SynthesisEvent, SynthesisEventType, SynthesizeStream, TTS } from './tts.js';
21
- export class StreamAdapterWrapper extends SynthesizeStream {
22
- constructor(tts, sentenceStream) {
23
- super();
24
- _StreamAdapterWrapper_closed.set(this, void 0);
25
- _StreamAdapterWrapper_tts.set(this, void 0);
26
- _StreamAdapterWrapper_sentenceStream.set(this, void 0);
27
- _StreamAdapterWrapper_eventQueue.set(this, void 0);
28
- _StreamAdapterWrapper_task.set(this, void 0);
29
- __classPrivateFieldSet(this, _StreamAdapterWrapper_closed, false, "f");
30
- __classPrivateFieldSet(this, _StreamAdapterWrapper_tts, tts, "f");
31
- __classPrivateFieldSet(this, _StreamAdapterWrapper_sentenceStream, sentenceStream, "f");
32
- __classPrivateFieldSet(this, _StreamAdapterWrapper_eventQueue, [], "f");
33
- __classPrivateFieldSet(this, _StreamAdapterWrapper_task, {
34
- run: new Promise((_, reject) => {
35
- this.run(reject);
36
- }),
37
- cancel: () => { },
38
- }, "f");
39
- }
40
- async run(reject) {
41
- var _a, e_1, _b, _c;
42
- while (!__classPrivateFieldGet(this, _StreamAdapterWrapper_closed, "f")) {
43
- __classPrivateFieldGet(this, _StreamAdapterWrapper_task, "f").cancel = () => {
44
- __classPrivateFieldSet(this, _StreamAdapterWrapper_closed, true, "f");
45
- reject(new Error('cancelled'));
46
- };
47
- try {
48
- for (var _d = true, _e = (e_1 = void 0, __asyncValues(__classPrivateFieldGet(this, _StreamAdapterWrapper_sentenceStream, "f"))), _f; _f = await _e.next(), _a = _f.done, !_a; _d = true) {
49
- _c = _f.value;
50
- _d = false;
51
- const sentence = _c;
52
- const audio = await __classPrivateFieldGet(this, _StreamAdapterWrapper_tts, "f").synthesize(sentence.text).then((data) => data.next());
53
- if (!audio.done) {
54
- __classPrivateFieldGet(this, _StreamAdapterWrapper_eventQueue, "f").push(new SynthesisEvent(SynthesisEventType.STARTED));
55
- __classPrivateFieldGet(this, _StreamAdapterWrapper_eventQueue, "f").push(new SynthesisEvent(SynthesisEventType.AUDIO, audio.value));
56
- __classPrivateFieldGet(this, _StreamAdapterWrapper_eventQueue, "f").push(new SynthesisEvent(SynthesisEventType.FINISHED));
57
- }
58
- }
59
- }
60
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
61
- finally {
62
- try {
63
- if (!_d && !_a && (_b = _e.return)) await _b.call(_e);
64
- }
65
- finally { if (e_1) throw e_1.error; }
66
- }
67
- }
68
- }
69
- pushText(token) {
70
- __classPrivateFieldGet(this, _StreamAdapterWrapper_sentenceStream, "f").pushText(token);
71
- }
72
- async flush() {
73
- await __classPrivateFieldGet(this, _StreamAdapterWrapper_sentenceStream, "f").flush();
74
- }
75
- next() {
76
- const event = __classPrivateFieldGet(this, _StreamAdapterWrapper_eventQueue, "f").shift();
77
- if (event) {
78
- return { done: false, value: event };
79
- }
80
- else {
81
- return { done: true, value: undefined };
82
- }
83
- }
84
- async close() {
85
- __classPrivateFieldGet(this, _StreamAdapterWrapper_task, "f").cancel();
86
- try {
87
- await __classPrivateFieldGet(this, _StreamAdapterWrapper_task, "f").run;
88
- }
89
- finally {
90
- __classPrivateFieldGet(this, _StreamAdapterWrapper_eventQueue, "f").push(undefined);
91
- }
92
- }
93
- }
94
- _StreamAdapterWrapper_closed = new WeakMap(), _StreamAdapterWrapper_tts = new WeakMap(), _StreamAdapterWrapper_sentenceStream = new WeakMap(), _StreamAdapterWrapper_eventQueue = new WeakMap(), _StreamAdapterWrapper_task = new WeakMap();
95
- export class StreamAdapter extends TTS {
96
- constructor(tts, tokenizer) {
97
- super(true);
98
- _StreamAdapter_tts.set(this, void 0);
99
- _StreamAdapter_tokenizer.set(this, void 0);
100
- __classPrivateFieldSet(this, _StreamAdapter_tts, tts, "f");
101
- __classPrivateFieldSet(this, _StreamAdapter_tokenizer, tokenizer, "f");
102
- }
103
- synthesize(text) {
104
- return __classPrivateFieldGet(this, _StreamAdapter_tts, "f").synthesize(text);
105
- }
106
- stream() {
107
- return new StreamAdapterWrapper(__classPrivateFieldGet(this, _StreamAdapter_tts, "f"), __classPrivateFieldGet(this, _StreamAdapter_tokenizer, "f").stream(undefined));
108
- }
109
- }
110
- _StreamAdapter_tts = new WeakMap(), _StreamAdapter_tokenizer = new WeakMap();
111
- //# sourceMappingURL=stream_adapter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stream_adapter.js","sourceRoot":"","sources":["../../src/tts/stream_adapter.ts"],"names":[],"mappings":"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"}
@@ -1,104 +0,0 @@
1
- // SPDX-FileCopyrightText: 2024 LiveKit, Inc.
2
- //
3
- // SPDX-License-Identifier: Apache-2.0
4
- import type { AudioFrame } from '@livekit/rtc-node';
5
- import { type AudioBuffer, mergeFrames } from '../utils.js';
6
- import { VADEventType, type VADStream } from '../vad.js';
7
- import { STT, SpeechEvent, SpeechEventType, SpeechStream } from './stt.js';
8
-
9
- export class StreamAdapterWrapper extends SpeechStream {
10
- #closed: boolean;
11
- #stt: STT;
12
- #vadStream: VADStream;
13
- #eventQueue: (SpeechEvent | undefined)[];
14
- #language?: string;
15
- #task: {
16
- run: Promise<void>;
17
- cancel: () => void;
18
- };
19
-
20
- constructor(stt: STT, vadStream: VADStream, language: string | undefined = undefined) {
21
- super();
22
- this.#closed = false;
23
- this.#stt = stt;
24
- this.#vadStream = vadStream;
25
- this.#eventQueue = [];
26
- this.#language = language;
27
- this.#task = {
28
- run: new Promise((_, reject) => {
29
- this.run(reject);
30
- }),
31
- cancel: () => {},
32
- };
33
- }
34
-
35
- async run(reject: (arg: Error) => void) {
36
- this.#task.cancel = () => {
37
- this.#closed = true;
38
- reject(new Error('cancelled'));
39
- };
40
-
41
- for (const event of this.#vadStream) {
42
- if (event.type == VADEventType.START_OF_SPEECH) {
43
- const startEvent = new SpeechEvent(SpeechEventType.START_OF_SPEECH);
44
- this.#eventQueue.push(startEvent);
45
- } else if (event.type == VADEventType.END_OF_SPEECH) {
46
- const mergedFrames = mergeFrames(event.speech);
47
- const endEvent = await this.#stt.recognize(mergedFrames, this.#language);
48
- this.#eventQueue.push(endEvent);
49
- }
50
- }
51
-
52
- this.#eventQueue.push(undefined);
53
- }
54
-
55
- pushFrame(frame: AudioFrame) {
56
- if (this.#closed) {
57
- throw new TypeError('cannot push frame to closed stream');
58
- }
59
-
60
- this.#vadStream.pushFrame(frame);
61
- }
62
-
63
- async close(wait: boolean = true): Promise<void> {
64
- this.#closed = true;
65
-
66
- if (!wait) {
67
- this.#task.cancel();
68
- }
69
-
70
- await this.#vadStream.close(wait);
71
- await this.#task.run;
72
- }
73
-
74
- next(): IteratorResult<SpeechEvent> {
75
- const item = this.#eventQueue.shift();
76
- if (item) {
77
- return { done: false, value: item };
78
- } else {
79
- return { done: true, value: undefined };
80
- }
81
- }
82
- }
83
-
84
- export class StreamAdapter extends STT {
85
- #stt: STT;
86
- #vadStream: VADStream;
87
-
88
- constructor(stt: STT, vadStream: VADStream) {
89
- super(true);
90
- this.#stt = stt;
91
- this.#vadStream = vadStream;
92
- }
93
-
94
- async recognize(
95
- buffer: AudioBuffer,
96
- language: string | undefined = undefined,
97
- ): Promise<SpeechEvent> {
98
- return await this.#stt.recognize(buffer, language);
99
- }
100
-
101
- stream(language: string | undefined = undefined) {
102
- return new StreamAdapterWrapper(this.#stt, this.#vadStream, language);
103
- }
104
- }
package/src/tokenize.ts DELETED
@@ -1,22 +0,0 @@
1
- // SPDX-FileCopyrightText: 2024 LiveKit, Inc.
2
- //
3
- // SPDX-License-Identifier: Apache-2.0
4
-
5
- export interface SegmentedSentence {
6
- text: string;
7
- }
8
-
9
- export abstract class SentenceTokenizer {
10
- abstract tokenize(text: string, language?: string): SegmentedSentence[];
11
- abstract stream(language: string | undefined): SentenceStream;
12
- }
13
-
14
- export abstract class SentenceStream implements IterableIterator<SegmentedSentence> {
15
- abstract pushText(text: string): void;
16
- abstract flush(): Promise<void>;
17
- async close(): Promise<void> {}
18
- abstract next(): IteratorResult<SegmentedSentence>;
19
- [Symbol.iterator](): SentenceStream {
20
- return this;
21
- }
22
- }
@@ -1,93 +0,0 @@
1
- // SPDX-FileCopyrightText: 2024 LiveKit, Inc.
2
- //
3
- // SPDX-License-Identifier: Apache-2.0
4
- import type { SentenceStream, SentenceTokenizer } from '../tokenize.js';
5
- import type { ChunkedStream } from './tts.js';
6
- import { SynthesisEvent, SynthesisEventType, SynthesizeStream, TTS } from './tts.js';
7
-
8
- export class StreamAdapterWrapper extends SynthesizeStream {
9
- #closed: boolean;
10
- #tts: TTS;
11
- #sentenceStream: SentenceStream;
12
- #eventQueue: (SynthesisEvent | undefined)[];
13
- #task: {
14
- run: Promise<void>;
15
- cancel: () => void;
16
- };
17
-
18
- constructor(tts: TTS, sentenceStream: SentenceStream) {
19
- super();
20
- this.#closed = false;
21
- this.#tts = tts;
22
- this.#sentenceStream = sentenceStream;
23
- this.#eventQueue = [];
24
- this.#task = {
25
- run: new Promise((_, reject) => {
26
- this.run(reject);
27
- }),
28
- cancel: () => {},
29
- };
30
- }
31
-
32
- async run(reject: (arg: Error) => void) {
33
- while (!this.#closed) {
34
- this.#task.cancel = () => {
35
- this.#closed = true;
36
- reject(new Error('cancelled'));
37
- };
38
- for await (const sentence of this.#sentenceStream) {
39
- const audio = await this.#tts.synthesize(sentence.text).then((data) => data.next());
40
- if (!audio.done) {
41
- this.#eventQueue.push(new SynthesisEvent(SynthesisEventType.STARTED));
42
- this.#eventQueue.push(new SynthesisEvent(SynthesisEventType.AUDIO, audio.value));
43
- this.#eventQueue.push(new SynthesisEvent(SynthesisEventType.FINISHED));
44
- }
45
- }
46
- }
47
- }
48
-
49
- pushText(token: string) {
50
- this.#sentenceStream.pushText(token);
51
- }
52
-
53
- async flush() {
54
- await this.#sentenceStream.flush();
55
- }
56
-
57
- next(): IteratorResult<SynthesisEvent> {
58
- const event = this.#eventQueue.shift();
59
- if (event) {
60
- return { done: false, value: event };
61
- } else {
62
- return { done: true, value: undefined };
63
- }
64
- }
65
-
66
- async close(): Promise<void> {
67
- this.#task.cancel();
68
- try {
69
- await this.#task.run;
70
- } finally {
71
- this.#eventQueue.push(undefined);
72
- }
73
- }
74
- }
75
-
76
- export class StreamAdapter extends TTS {
77
- #tts: TTS;
78
- #tokenizer: SentenceTokenizer;
79
-
80
- constructor(tts: TTS, tokenizer: SentenceTokenizer) {
81
- super(true);
82
- this.#tts = tts;
83
- this.#tokenizer = tokenizer;
84
- }
85
-
86
- synthesize(text: string): Promise<ChunkedStream> {
87
- return this.#tts.synthesize(text);
88
- }
89
-
90
- stream() {
91
- return new StreamAdapterWrapper(this.#tts, this.#tokenizer.stream(undefined));
92
- }
93
- }