@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
@@ -0,0 +1,30 @@
1
+ import type { AudioFrame } from '@livekit/rtc-node';
2
+ import { type TTS } from '../tts/index.js';
3
+ import { AsyncIterableQueue, Future } from '../utils.js';
4
+ import type { AgentPlayout, PlayoutHandle } from './agent_playout.js';
5
+ export type SpeechSource = AsyncIterable<string> | string | Promise<string>;
6
+ export declare class SynthesisHandle {
7
+ #private;
8
+ static readonly FLUSH_SENTINEL: unique symbol;
9
+ ttsSource: SpeechSource;
10
+ tts: TTS;
11
+ queue: AsyncIterableQueue<AudioFrame | typeof SynthesisHandle.FLUSH_SENTINEL>;
12
+ intFut: Future;
13
+ constructor(speechId: string, ttsSource: SpeechSource, agentPlayout: AgentPlayout, tts: TTS);
14
+ get speechId(): string;
15
+ get validated(): boolean;
16
+ get interrupted(): boolean;
17
+ get playHandle(): PlayoutHandle | undefined;
18
+ /** Validate the speech for playout. */
19
+ play(): PlayoutHandle;
20
+ /** Interrupt the speech. */
21
+ interrupt(): void;
22
+ }
23
+ export declare class AgentOutput {
24
+ #private;
25
+ constructor(agentPlayout: AgentPlayout, tts: TTS);
26
+ get playout(): AgentPlayout;
27
+ close(): Promise<void>;
28
+ synthesize(speechId: string, ttsSource: SpeechSource): SynthesisHandle;
29
+ }
30
+ //# sourceMappingURL=agent_output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent_output.d.ts","sourceRoot":"","sources":["../../src/pipeline/agent_output.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,OAAO,EAAoB,KAAK,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAsB,MAAM,EAAoB,MAAM,aAAa,CAAC;AAC/F,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEtE,MAAM,MAAM,YAAY,GAAG,aAAa,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;AAE5E,qBAAa,eAAe;;IAC1B,MAAM,CAAC,QAAQ,CAAC,cAAc,gBAA4B;IAG1D,SAAS,EAAE,YAAY,CAAC;IAExB,GAAG,EAAE,GAAG,CAAC;IACT,KAAK,yEAAgF;IAErF,MAAM,SAAgB;gBAGV,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,EAAE,GAAG;IAO3F,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,IAAI,UAAU,IAAI,aAAa,GAAG,SAAS,CAE1C;IAED,uCAAuC;IACvC,IAAI,IAAI,aAAa;IASrB,4BAA4B;IAC5B,SAAS;CASV;AAED,qBAAa,WAAW;;gBAKV,YAAY,EAAE,YAAY,EAAE,GAAG,EAAE,GAAG;IAKhD,IAAI,OAAO,IAAI,YAAY,CAE1B;IAEK,KAAK;IAKX,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,GAAG,eAAe;CAkCvE"}
@@ -0,0 +1,155 @@
1
+ import { log } from '../log.js';
2
+ import { SynthesizeStream } from '../tts/index.js';
3
+ import { AsyncIterableQueue, CancellablePromise, Future, gracefullyCancel } from '../utils.js';
4
+ export class SynthesisHandle {
5
+ static FLUSH_SENTINEL = Symbol('FLUSH_SENTINEL');
6
+ #speechId;
7
+ ttsSource;
8
+ #agentPlayout;
9
+ tts;
10
+ queue = new AsyncIterableQueue();
11
+ #playHandle;
12
+ intFut = new Future();
13
+ #logger = log();
14
+ constructor(speechId, ttsSource, agentPlayout, tts) {
15
+ this.#speechId = speechId;
16
+ this.ttsSource = ttsSource;
17
+ this.#agentPlayout = agentPlayout;
18
+ this.tts = tts;
19
+ }
20
+ get speechId() {
21
+ return this.#speechId;
22
+ }
23
+ get validated() {
24
+ return !!this.#playHandle;
25
+ }
26
+ get interrupted() {
27
+ return this.intFut.done;
28
+ }
29
+ get playHandle() {
30
+ return this.#playHandle;
31
+ }
32
+ /** Validate the speech for playout. */
33
+ play() {
34
+ if (this.interrupted) {
35
+ throw new Error('synthesis was interrupted');
36
+ }
37
+ this.#playHandle = this.#agentPlayout.play(this.#speechId, this.queue);
38
+ return this.#playHandle;
39
+ }
40
+ /** Interrupt the speech. */
41
+ interrupt() {
42
+ if (this.interrupted) {
43
+ return;
44
+ }
45
+ this.#logger.child({ speechId: this.#speechId }).debug('interrupting synthesis/playout');
46
+ this.#playHandle?.interrupt();
47
+ this.intFut.resolve();
48
+ }
49
+ }
50
+ export class AgentOutput {
51
+ #agentPlayout;
52
+ #tts;
53
+ #tasks = [];
54
+ constructor(agentPlayout, tts) {
55
+ this.#agentPlayout = agentPlayout;
56
+ this.#tts = tts;
57
+ }
58
+ get playout() {
59
+ return this.#agentPlayout;
60
+ }
61
+ async close() {
62
+ this.#tasks.forEach((task) => task.cancel());
63
+ await Promise.all(this.#tasks);
64
+ }
65
+ synthesize(speechId, ttsSource) {
66
+ const handle = new SynthesisHandle(speechId, ttsSource, this.#agentPlayout, this.#tts);
67
+ const task = this.#synthesize(handle);
68
+ this.#tasks.push(task);
69
+ task.finally(() => this.#tasks.splice(this.#tasks.indexOf(task)));
70
+ return handle;
71
+ }
72
+ #synthesize(handle) {
73
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
74
+ return new CancellablePromise(async (resolve, _, onCancel) => {
75
+ const ttsSource = await handle.ttsSource;
76
+ let task;
77
+ if (typeof ttsSource === 'string') {
78
+ task = stringSynthesisTask(ttsSource, handle);
79
+ }
80
+ else {
81
+ task = streamSynthesisTask(ttsSource, handle);
82
+ }
83
+ onCancel(() => {
84
+ gracefullyCancel(task);
85
+ });
86
+ try {
87
+ await Promise.any([task, handle.intFut.await]);
88
+ }
89
+ finally {
90
+ if (handle.intFut.done) {
91
+ gracefullyCancel(task);
92
+ }
93
+ }
94
+ resolve();
95
+ });
96
+ }
97
+ }
98
+ const stringSynthesisTask = (text, handle) => {
99
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
100
+ return new CancellablePromise(async (resolve, _, onCancel) => {
101
+ let cancelled = false;
102
+ onCancel(() => {
103
+ cancelled = true;
104
+ });
105
+ const ttsStream = handle.tts.stream();
106
+ ttsStream.pushText(text);
107
+ ttsStream.flush();
108
+ ttsStream.endInput();
109
+ for await (const audio of ttsStream) {
110
+ if (cancelled || audio === SynthesizeStream.END_OF_STREAM)
111
+ break;
112
+ handle.queue.put(audio.frame);
113
+ }
114
+ handle.queue.put(SynthesisHandle.FLUSH_SENTINEL);
115
+ resolve();
116
+ });
117
+ };
118
+ const streamSynthesisTask = (stream, handle) => {
119
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
120
+ return new CancellablePromise(async (resolve, _, onCancel) => {
121
+ let cancelled = false;
122
+ onCancel(() => {
123
+ cancelled = true;
124
+ });
125
+ const ttsStream = handle.tts.stream();
126
+ const readGeneratedAudio = async () => {
127
+ let started = false;
128
+ for await (const audio of ttsStream) {
129
+ if (cancelled)
130
+ break;
131
+ if (audio === SynthesizeStream.END_OF_STREAM) {
132
+ if (started) {
133
+ break;
134
+ }
135
+ else {
136
+ continue;
137
+ }
138
+ }
139
+ handle.queue.put(audio.frame);
140
+ started = true;
141
+ }
142
+ handle.queue.put(SynthesisHandle.FLUSH_SENTINEL);
143
+ };
144
+ readGeneratedAudio();
145
+ for await (const text of stream) {
146
+ if (cancelled)
147
+ break;
148
+ ttsStream.pushText(text);
149
+ }
150
+ ttsStream.flush();
151
+ ttsStream.endInput();
152
+ resolve();
153
+ });
154
+ };
155
+ //# sourceMappingURL=agent_output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent_output.js","sourceRoot":"","sources":["../../src/pipeline/agent_output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import type { AudioFrame, AudioSource } from '@livekit/rtc-node';
2
+ import type { TypedEventEmitter as TypedEmitter } from '@livekit/typed-emitter';
3
+ import { Future } from '../utils.js';
4
+ import { SynthesisHandle } from './agent_output.js';
5
+ export declare enum AgentPlayoutEvent {
6
+ PLAYOUT_STARTED = 0,
7
+ PLAYOUT_STOPPED = 1
8
+ }
9
+ export type AgentPlayoutCallbacks = {
10
+ [AgentPlayoutEvent.PLAYOUT_STARTED]: () => void;
11
+ [AgentPlayoutEvent.PLAYOUT_STOPPED]: (interrupt: boolean) => void;
12
+ };
13
+ export declare class PlayoutHandle {
14
+ #private;
15
+ playoutSource: AsyncIterable<AudioFrame | typeof SynthesisHandle.FLUSH_SENTINEL>;
16
+ totalPlayedTime?: number;
17
+ pushedDuration: number;
18
+ intFut: Future;
19
+ doneFut: Future;
20
+ constructor(speechId: string, audioSource: AudioSource, playoutSource: AsyncIterable<AudioFrame | typeof SynthesisHandle.FLUSH_SENTINEL>);
21
+ get speechId(): string;
22
+ get interrupted(): boolean;
23
+ get timePlayed(): number;
24
+ get done(): boolean;
25
+ interrupt(): void;
26
+ join(): Future;
27
+ }
28
+ declare const AgentPlayout_base: new () => TypedEmitter<AgentPlayoutCallbacks>;
29
+ export declare class AgentPlayout extends AgentPlayout_base {
30
+ #private;
31
+ constructor(audioSource: AudioSource);
32
+ get targetVolume(): number;
33
+ set targetVolume(vol: number);
34
+ play(speechId: string, playoutSource: AsyncIterable<AudioFrame | typeof SynthesisHandle.FLUSH_SENTINEL>): PlayoutHandle;
35
+ close(): Promise<void>;
36
+ }
37
+ export {};
38
+ //# sourceMappingURL=agent_playout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent_playout.d.ts","sourceRoot":"","sources":["../../src/pipeline/agent_playout.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,KAAK,EAAE,iBAAiB,IAAI,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAGhF,OAAO,EAAsB,MAAM,EAAoB,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,oBAAY,iBAAiB;IAC3B,eAAe,IAAA;IACf,eAAe,IAAA;CAChB;AAED,MAAM,MAAM,qBAAqB,GAAG;IAClC,CAAC,iBAAiB,CAAC,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;IAChD,CAAC,iBAAiB,CAAC,eAAe,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;CACnE,CAAC;AAEF,qBAAa,aAAa;;IAGxB,aAAa,EAAE,aAAa,CAAC,UAAU,GAAG,OAAO,eAAe,CAAC,cAAc,CAAC,CAAC;IACjF,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB,cAAc,SAAK;IACnB,MAAM,SAAgB;IACtB,OAAO,SAAgB;gBAGrB,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,WAAW,EACxB,aAAa,EAAE,aAAa,CAAC,UAAU,GAAG,OAAO,eAAe,CAAC,cAAc,CAAC;IAOlF,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED,IAAI,IAAI,IAAI,OAAO,CAElB;IAED,SAAS;IAST,IAAI,IAAI,MAAM;CAGf;2CAE4D,aAAa,qBAAqB,CAAC;AAAhG,qBAAa,YAAa,SAAQ,iBAA+D;;gBAOnF,WAAW,EAAE,WAAW;IAKpC,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,IAAI,YAAY,CAAC,GAAG,EAAE,MAAM,EAE3B;IAED,IAAI,CACF,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,aAAa,CAAC,UAAU,GAAG,OAAO,eAAe,CAAC,cAAc,CAAC,GAC/E,aAAa;IAyFV,KAAK;CAIZ"}
@@ -0,0 +1,142 @@
1
+ import EventEmitter from 'node:events';
2
+ import { log } from '../log.js';
3
+ import { CancellablePromise, Future, gracefullyCancel } from '../utils.js';
4
+ import { SynthesisHandle } from './agent_output.js';
5
+ export var AgentPlayoutEvent;
6
+ (function (AgentPlayoutEvent) {
7
+ AgentPlayoutEvent[AgentPlayoutEvent["PLAYOUT_STARTED"] = 0] = "PLAYOUT_STARTED";
8
+ AgentPlayoutEvent[AgentPlayoutEvent["PLAYOUT_STOPPED"] = 1] = "PLAYOUT_STOPPED";
9
+ })(AgentPlayoutEvent || (AgentPlayoutEvent = {}));
10
+ export class PlayoutHandle {
11
+ #speechId;
12
+ #audioSource;
13
+ playoutSource;
14
+ totalPlayedTime;
15
+ #interrupted = false;
16
+ pushedDuration = 0;
17
+ intFut = new Future();
18
+ doneFut = new Future();
19
+ constructor(speechId, audioSource, playoutSource) {
20
+ this.#speechId = speechId;
21
+ this.#audioSource = audioSource;
22
+ this.playoutSource = playoutSource;
23
+ }
24
+ get speechId() {
25
+ return this.#speechId;
26
+ }
27
+ get interrupted() {
28
+ return this.#interrupted;
29
+ }
30
+ get timePlayed() {
31
+ return this.totalPlayedTime || this.pushedDuration - this.#audioSource.queuedDuration;
32
+ }
33
+ get done() {
34
+ return this.doneFut.done || this.#interrupted;
35
+ }
36
+ interrupt() {
37
+ if (this.done) {
38
+ return;
39
+ }
40
+ this.intFut.resolve();
41
+ this.#interrupted = true;
42
+ }
43
+ join() {
44
+ return this.doneFut;
45
+ }
46
+ }
47
+ export class AgentPlayout extends EventEmitter {
48
+ #closed = false;
49
+ #audioSource;
50
+ #targetVolume = 1;
51
+ #playoutTask;
52
+ #logger = log();
53
+ constructor(audioSource) {
54
+ super();
55
+ this.#audioSource = audioSource;
56
+ }
57
+ get targetVolume() {
58
+ return this.#targetVolume;
59
+ }
60
+ set targetVolume(vol) {
61
+ this.#targetVolume = vol;
62
+ }
63
+ play(speechId, playoutSource) {
64
+ if (this.#closed) {
65
+ throw new Error('source closed');
66
+ }
67
+ const handle = new PlayoutHandle(speechId, this.#audioSource, playoutSource);
68
+ this.#playoutTask = this.#playout(handle, this.#playoutTask);
69
+ return handle;
70
+ }
71
+ #playout(handle, oldTask) {
72
+ return new CancellablePromise(async (resolve, _, onCancel) => {
73
+ const cancel = () => {
74
+ captureTask.cancel();
75
+ handle.totalPlayedTime = handle.pushedDuration - this.#audioSource.queuedDuration;
76
+ if (handle.interrupted || captureTask.error) {
77
+ this.#audioSource.clearQueue(); // make sure to remove any queued frames
78
+ }
79
+ if (!firstFrame) {
80
+ this.emit(AgentPlayoutEvent.PLAYOUT_STOPPED, handle.interrupted);
81
+ }
82
+ handle.doneFut.resolve();
83
+ this.#logger
84
+ .child({ speechId: handle.speechId, interrupted: handle.interrupted })
85
+ .debug('playout finished');
86
+ };
87
+ onCancel(() => {
88
+ cancel();
89
+ });
90
+ if (oldTask) {
91
+ await gracefullyCancel(oldTask);
92
+ }
93
+ if (this.#audioSource.queuedDuration > 0) {
94
+ // this should not happen, but log it just in case
95
+ this.#logger
96
+ .child({ speechId: handle.speechId, queuedDuration: this.#audioSource.queuedDuration })
97
+ .warn('new playout while the source is still playing');
98
+ }
99
+ let firstFrame = true;
100
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
101
+ const captureTask = new CancellablePromise(async (resolve, _, onCancel) => {
102
+ let cancelled = false;
103
+ onCancel(() => {
104
+ cancelled = true;
105
+ });
106
+ for await (const frame of handle.playoutSource) {
107
+ if (cancelled || frame === SynthesisHandle.FLUSH_SENTINEL)
108
+ break;
109
+ if (firstFrame) {
110
+ this.#logger
111
+ .child({ speechId: handle.speechId })
112
+ .debug('started playing the first time');
113
+ this.emit(AgentPlayoutEvent.PLAYOUT_STARTED);
114
+ firstFrame = false;
115
+ }
116
+ handle.pushedDuration += (frame.samplesPerChannel / frame.sampleRate) * 1000;
117
+ await this.#audioSource.captureFrame(frame);
118
+ await this.#audioSource.waitForPlayout();
119
+ }
120
+ // XXX(nbsp): line 161 waits instead of this. this is not the case on python agents,
121
+ // but for some reason too many TTS frames can gunk up the buffer and lead to
122
+ // FFI errors. this works 🤷‍♀️
123
+ // if (this.#audioSource.queuedDuration > 0) {
124
+ // await this.#audioSource.waitForPlayout();
125
+ // }
126
+ resolve();
127
+ });
128
+ try {
129
+ await Promise.any([captureTask, handle.intFut.await]);
130
+ }
131
+ finally {
132
+ cancel();
133
+ resolve();
134
+ }
135
+ });
136
+ }
137
+ async close() {
138
+ this.#closed = true;
139
+ await this.#playoutTask;
140
+ }
141
+ }
142
+ //# sourceMappingURL=agent_playout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent_playout.js","sourceRoot":"","sources":["../../src/pipeline/agent_playout.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { RemoteParticipant, Room } from '@livekit/rtc-node';
2
+ import type { TypedEventEmitter as TypedEmitter } from '@livekit/typed-emitter';
3
+ import type { STT, SpeechEvent } from '../stt/stt.js';
4
+ import type { VAD, VADEvent } from '../vad.js';
5
+ export declare enum HumanInputEvent {
6
+ START_OF_SPEECH = 0,
7
+ VAD_INFERENCE_DONE = 1,
8
+ END_OF_SPEECH = 2,
9
+ FINAL_TRANSCRIPT = 3,
10
+ INTERIM_TRANSCRIPT = 4
11
+ }
12
+ export type HumanInputCallbacks = {
13
+ [HumanInputEvent.START_OF_SPEECH]: (event: VADEvent) => void;
14
+ [HumanInputEvent.VAD_INFERENCE_DONE]: (event: VADEvent) => void;
15
+ [HumanInputEvent.END_OF_SPEECH]: (event: VADEvent) => void;
16
+ [HumanInputEvent.FINAL_TRANSCRIPT]: (event: SpeechEvent) => void;
17
+ [HumanInputEvent.INTERIM_TRANSCRIPT]: (event: SpeechEvent) => void;
18
+ };
19
+ declare const HumanInput_base: new () => TypedEmitter<HumanInputCallbacks>;
20
+ export declare class HumanInput extends HumanInput_base {
21
+ #private;
22
+ constructor(room: Room, vad: VAD, stt: STT, participant: RemoteParticipant);
23
+ get speaking(): boolean;
24
+ get speakingProbability(): number;
25
+ close(): Promise<void>;
26
+ }
27
+ export {};
28
+ //# sourceMappingURL=human_input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"human_input.d.ts","sourceRoot":"","sources":["../../src/pipeline/human_input.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAEV,iBAAiB,EAEjB,IAAI,EACL,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,iBAAiB,IAAI,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAGhF,OAAO,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAGtD,OAAO,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAG/C,oBAAY,eAAe;IACzB,eAAe,IAAA;IACf,kBAAkB,IAAA;IAClB,aAAa,IAAA;IACb,gBAAgB,IAAA;IAChB,kBAAkB,IAAA;CACnB;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,CAAC,eAAe,CAAC,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;IAC7D,CAAC,eAAe,CAAC,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;IAChE,CAAC,eAAe,CAAC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;IAC3D,CAAC,eAAe,CAAC,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IACjE,CAAC,eAAe,CAAC,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;CACpE,CAAC;yCAEyD,aAAa,mBAAmB,CAAC;AAA5F,qBAAa,UAAW,SAAQ,eAA6D;;gBAY/E,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,WAAW,EAAE,iBAAiB;IAmG1E,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,IAAI,mBAAmB,IAAI,MAAM,CAEhC;IAEK,KAAK;CAWZ"}
@@ -0,0 +1,134 @@
1
+ import { AudioStream, RoomEvent, TrackSource } from '@livekit/rtc-node';
2
+ import { EventEmitter } from 'node:events';
3
+ import { log } from '../log.js';
4
+ import { SpeechEventType } from '../stt/stt.js';
5
+ import { CancellablePromise, gracefullyCancel } from '../utils.js';
6
+ import { VADEventType } from '../vad.js';
7
+ export var HumanInputEvent;
8
+ (function (HumanInputEvent) {
9
+ HumanInputEvent[HumanInputEvent["START_OF_SPEECH"] = 0] = "START_OF_SPEECH";
10
+ HumanInputEvent[HumanInputEvent["VAD_INFERENCE_DONE"] = 1] = "VAD_INFERENCE_DONE";
11
+ HumanInputEvent[HumanInputEvent["END_OF_SPEECH"] = 2] = "END_OF_SPEECH";
12
+ HumanInputEvent[HumanInputEvent["FINAL_TRANSCRIPT"] = 3] = "FINAL_TRANSCRIPT";
13
+ HumanInputEvent[HumanInputEvent["INTERIM_TRANSCRIPT"] = 4] = "INTERIM_TRANSCRIPT";
14
+ })(HumanInputEvent || (HumanInputEvent = {}));
15
+ export class HumanInput extends EventEmitter {
16
+ #closed = false;
17
+ #room;
18
+ #vad;
19
+ #stt;
20
+ #participant;
21
+ #subscribedTrack;
22
+ #recognizeTask;
23
+ #speaking = false;
24
+ #speechProbability = 0;
25
+ #logger = log();
26
+ constructor(room, vad, stt, participant) {
27
+ super();
28
+ this.#room = room;
29
+ this.#vad = vad;
30
+ this.#stt = stt;
31
+ this.#participant = participant;
32
+ this.#room.on(RoomEvent.TrackPublished, this.#subscribeToMicrophone.bind(this));
33
+ this.#room.on(RoomEvent.TrackSubscribed, this.#subscribeToMicrophone.bind(this));
34
+ this.#subscribeToMicrophone();
35
+ }
36
+ #subscribeToMicrophone() {
37
+ if (!this.#participant) {
38
+ this.#logger.error('Participant is not set');
39
+ return;
40
+ }
41
+ let microphonePublication = undefined;
42
+ for (const publication of this.#participant.trackPublications.values()) {
43
+ if (publication.source === TrackSource.SOURCE_MICROPHONE) {
44
+ microphonePublication = publication;
45
+ break;
46
+ }
47
+ }
48
+ if (!microphonePublication) {
49
+ return;
50
+ }
51
+ if (!microphonePublication.subscribed) {
52
+ microphonePublication.setSubscribed(true);
53
+ }
54
+ const track = microphonePublication.track;
55
+ if (track && track !== this.#subscribedTrack) {
56
+ this.#subscribedTrack = track;
57
+ if (this.#recognizeTask) {
58
+ this.#recognizeTask.cancel();
59
+ }
60
+ const audioStream = new AudioStream(track, 16000);
61
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
62
+ this.#recognizeTask = new CancellablePromise(async (resolve, _, onCancel) => {
63
+ let cancelled = false;
64
+ onCancel(() => {
65
+ cancelled = true;
66
+ });
67
+ const sttStream = this.#stt.stream();
68
+ const vadStream = this.#vad.stream();
69
+ const audioStreamCo = async () => {
70
+ for await (const ev of audioStream) {
71
+ if (cancelled)
72
+ return;
73
+ sttStream.pushFrame(ev);
74
+ vadStream.pushFrame(ev);
75
+ }
76
+ };
77
+ const vadStreamCo = async () => {
78
+ for await (const ev of vadStream) {
79
+ if (cancelled)
80
+ return;
81
+ switch (ev.type) {
82
+ case VADEventType.START_OF_SPEECH:
83
+ this.#speaking = true;
84
+ this.emit(HumanInputEvent.START_OF_SPEECH, ev);
85
+ break;
86
+ case VADEventType.INFERENCE_DONE:
87
+ this.#speechProbability = ev.probability;
88
+ this.emit(HumanInputEvent.VAD_INFERENCE_DONE, ev);
89
+ break;
90
+ case VADEventType.END_OF_SPEECH:
91
+ this.#speaking = false;
92
+ this.emit(HumanInputEvent.END_OF_SPEECH, ev);
93
+ break;
94
+ }
95
+ }
96
+ };
97
+ const sttStreamCo = async () => {
98
+ for await (const ev of sttStream) {
99
+ if (cancelled)
100
+ return;
101
+ if (ev.type === SpeechEventType.FINAL_TRANSCRIPT) {
102
+ this.emit(HumanInputEvent.FINAL_TRANSCRIPT, ev);
103
+ }
104
+ else if (ev.type == SpeechEventType.INTERIM_TRANSCRIPT) {
105
+ this.emit(HumanInputEvent.INTERIM_TRANSCRIPT, ev);
106
+ }
107
+ }
108
+ };
109
+ await Promise.all([audioStreamCo(), vadStreamCo(), sttStreamCo()]);
110
+ sttStream.close();
111
+ vadStream.close();
112
+ resolve();
113
+ });
114
+ }
115
+ }
116
+ get speaking() {
117
+ return this.#speaking;
118
+ }
119
+ get speakingProbability() {
120
+ return this.#speechProbability;
121
+ }
122
+ async close() {
123
+ if (this.#closed) {
124
+ throw new Error('HumanInput already closed');
125
+ }
126
+ this.#closed = true;
127
+ this.#room.removeAllListeners();
128
+ this.#speaking = false;
129
+ if (this.#recognizeTask) {
130
+ await gracefullyCancel(this.#recognizeTask);
131
+ }
132
+ }
133
+ }
134
+ //# sourceMappingURL=human_input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"human_input.js","sourceRoot":"","sources":["../../src/pipeline/human_input.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { type AgentState, type BeforeTTSCallback, type BeforeLLMCallback, type VPAEvent, type VPACallbacks, type AgentCallContext, type AgentTranscriptionOptions, type VPAOptions, VoicePipelineAgent, } from './pipeline_agent.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/pipeline/index.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,KAAK,UAAU,EACf,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,QAAQ,EACb,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,yBAAyB,EAC9B,KAAK,UAAU,EACf,kBAAkB,GACnB,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2024 LiveKit, Inc.
2
+ //
3
+ // SPDX-License-Identifier: Apache-2.0
4
+ export { VoicePipelineAgent, } from './pipeline_agent.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/pipeline/index.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,EAAE;AACF,sCAAsC;AAEtC,OAAO,EASL,kBAAkB,GACnB,MAAM,qBAAqB,CAAC"}