@livekit/agents 1.0.3 → 1.0.5

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 (99) hide show
  1. package/dist/index.cjs +2 -5
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.d.cts +2 -3
  4. package/dist/index.d.ts +2 -3
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +1 -3
  7. package/dist/index.js.map +1 -1
  8. package/dist/tokenize/basic/hyphenator.cjs.map +1 -1
  9. package/dist/tokenize/basic/hyphenator.js.map +1 -1
  10. package/dist/utils.cjs +77 -0
  11. package/dist/utils.cjs.map +1 -1
  12. package/dist/utils.d.cts +21 -0
  13. package/dist/utils.d.ts +21 -0
  14. package/dist/utils.d.ts.map +1 -1
  15. package/dist/utils.js +76 -1
  16. package/dist/utils.js.map +1 -1
  17. package/dist/voice/agent_activity.cjs +107 -71
  18. package/dist/voice/agent_activity.cjs.map +1 -1
  19. package/dist/voice/agent_activity.d.ts.map +1 -1
  20. package/dist/voice/agent_activity.js +107 -71
  21. package/dist/voice/agent_activity.js.map +1 -1
  22. package/dist/voice/avatar/datastream_io.cjs +204 -0
  23. package/dist/voice/avatar/datastream_io.cjs.map +1 -0
  24. package/dist/voice/avatar/datastream_io.d.cts +37 -0
  25. package/dist/voice/avatar/datastream_io.d.ts +37 -0
  26. package/dist/voice/avatar/datastream_io.d.ts.map +1 -0
  27. package/dist/voice/avatar/datastream_io.js +188 -0
  28. package/dist/voice/avatar/datastream_io.js.map +1 -0
  29. package/dist/{multimodal → voice/avatar}/index.cjs +4 -4
  30. package/dist/voice/avatar/index.cjs.map +1 -0
  31. package/dist/voice/avatar/index.d.cts +2 -0
  32. package/dist/voice/avatar/index.d.ts +2 -0
  33. package/dist/voice/avatar/index.d.ts.map +1 -0
  34. package/dist/voice/avatar/index.js +2 -0
  35. package/dist/voice/avatar/index.js.map +1 -0
  36. package/dist/voice/index.cjs +2 -0
  37. package/dist/voice/index.cjs.map +1 -1
  38. package/dist/voice/index.d.cts +1 -0
  39. package/dist/voice/index.d.ts +1 -0
  40. package/dist/voice/index.d.ts.map +1 -1
  41. package/dist/voice/index.js +1 -0
  42. package/dist/voice/index.js.map +1 -1
  43. package/dist/voice/io.cjs.map +1 -1
  44. package/dist/voice/io.d.cts +1 -1
  45. package/dist/voice/io.d.ts +1 -1
  46. package/dist/voice/io.d.ts.map +1 -1
  47. package/dist/voice/io.js.map +1 -1
  48. package/dist/voice/room_io/_input.cjs +3 -1
  49. package/dist/voice/room_io/_input.cjs.map +1 -1
  50. package/dist/voice/room_io/_input.d.ts.map +1 -1
  51. package/dist/voice/room_io/_input.js +3 -1
  52. package/dist/voice/room_io/_input.js.map +1 -1
  53. package/dist/voice/run_context.cjs +13 -0
  54. package/dist/voice/run_context.cjs.map +1 -1
  55. package/dist/voice/run_context.d.cts +10 -0
  56. package/dist/voice/run_context.d.ts +10 -0
  57. package/dist/voice/run_context.d.ts.map +1 -1
  58. package/dist/voice/run_context.js +13 -0
  59. package/dist/voice/run_context.js.map +1 -1
  60. package/dist/voice/speech_handle.cjs +152 -30
  61. package/dist/voice/speech_handle.cjs.map +1 -1
  62. package/dist/voice/speech_handle.d.cts +67 -16
  63. package/dist/voice/speech_handle.d.ts +67 -16
  64. package/dist/voice/speech_handle.d.ts.map +1 -1
  65. package/dist/voice/speech_handle.js +153 -31
  66. package/dist/voice/speech_handle.js.map +1 -1
  67. package/dist/worker.cjs +4 -1
  68. package/dist/worker.cjs.map +1 -1
  69. package/dist/worker.d.ts.map +1 -1
  70. package/dist/worker.js +4 -1
  71. package/dist/worker.js.map +1 -1
  72. package/package.json +2 -2
  73. package/src/index.ts +2 -3
  74. package/src/tokenize/basic/hyphenator.ts +1 -1
  75. package/src/utils.ts +121 -1
  76. package/src/voice/agent_activity.ts +122 -78
  77. package/src/voice/avatar/datastream_io.ts +247 -0
  78. package/src/voice/avatar/index.ts +4 -0
  79. package/src/voice/index.ts +2 -0
  80. package/src/voice/io.ts +1 -1
  81. package/src/voice/room_io/_input.ts +9 -3
  82. package/src/voice/run_context.ts +16 -2
  83. package/src/voice/speech_handle.ts +183 -38
  84. package/src/worker.ts +5 -1
  85. package/dist/multimodal/agent_playout.cjs +0 -233
  86. package/dist/multimodal/agent_playout.cjs.map +0 -1
  87. package/dist/multimodal/agent_playout.d.cts +0 -34
  88. package/dist/multimodal/agent_playout.d.ts +0 -34
  89. package/dist/multimodal/agent_playout.d.ts.map +0 -1
  90. package/dist/multimodal/agent_playout.js +0 -207
  91. package/dist/multimodal/agent_playout.js.map +0 -1
  92. package/dist/multimodal/index.cjs.map +0 -1
  93. package/dist/multimodal/index.d.cts +0 -2
  94. package/dist/multimodal/index.d.ts +0 -2
  95. package/dist/multimodal/index.d.ts.map +0 -1
  96. package/dist/multimodal/index.js +0 -2
  97. package/dist/multimodal/index.js.map +0 -1
  98. package/src/multimodal/agent_playout.ts +0 -266
  99. package/src/multimodal/index.ts +0 -4
@@ -1,233 +0,0 @@
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 agent_playout_exports = {};
20
- __export(agent_playout_exports, {
21
- AgentPlayout: () => AgentPlayout,
22
- PlayoutHandle: () => PlayoutHandle,
23
- proto: () => proto
24
- });
25
- module.exports = __toCommonJS(agent_playout_exports);
26
- var import_rtc_node = require("@livekit/rtc-node");
27
- var import_node_events = require("node:events");
28
- var import_audio = require("../audio.cjs");
29
- var import_utils = require("../utils.cjs");
30
- const proto = {};
31
- class PlayoutHandle extends import_node_events.EventEmitter {
32
- #audioSource;
33
- #sampleRate;
34
- #itemId;
35
- #contentIndex;
36
- /** @internal */
37
- synchronizer;
38
- /** @internal */
39
- doneFut;
40
- /** @internal */
41
- intFut;
42
- /** @internal */
43
- #interrupted;
44
- /** @internal */
45
- pushedDuration;
46
- /** @internal */
47
- totalPlayedTime;
48
- // Set when playout is done
49
- constructor(audioSource, sampleRate, itemId, contentIndex, synchronizer) {
50
- super();
51
- this.#audioSource = audioSource;
52
- this.#sampleRate = sampleRate;
53
- this.#itemId = itemId;
54
- this.#contentIndex = contentIndex;
55
- this.synchronizer = synchronizer;
56
- this.doneFut = new import_utils.Future();
57
- this.intFut = new import_utils.Future();
58
- this.#interrupted = false;
59
- this.pushedDuration = 0;
60
- this.totalPlayedTime = void 0;
61
- }
62
- get itemId() {
63
- return this.#itemId;
64
- }
65
- get audioSamples() {
66
- if (this.totalPlayedTime !== void 0) {
67
- return Math.floor(this.totalPlayedTime * this.#sampleRate);
68
- }
69
- return Math.max(
70
- 0,
71
- Math.floor(
72
- (this.pushedDuration - this.#audioSource.queuedDuration) * (this.#sampleRate / 1e3)
73
- )
74
- );
75
- }
76
- get textChars() {
77
- return this.synchronizer.playedText.length;
78
- }
79
- get contentIndex() {
80
- return this.#contentIndex;
81
- }
82
- get interrupted() {
83
- return this.#interrupted;
84
- }
85
- get done() {
86
- return this.doneFut.done || this.#interrupted;
87
- }
88
- interrupt() {
89
- if (this.doneFut.done) return;
90
- this.intFut.resolve();
91
- this.#interrupted = true;
92
- }
93
- }
94
- class AgentPlayout extends import_node_events.EventEmitter {
95
- #audioSource;
96
- #playoutTask;
97
- #sampleRate;
98
- #numChannels;
99
- #inFrameSize;
100
- #outFrameSize;
101
- constructor(audioSource, sampleRate, numChannels, inFrameSize, outFrameSize) {
102
- super();
103
- this.#audioSource = audioSource;
104
- this.#playoutTask = null;
105
- this.#sampleRate = sampleRate;
106
- this.#numChannels = numChannels;
107
- this.#inFrameSize = inFrameSize;
108
- this.#outFrameSize = outFrameSize;
109
- }
110
- play(itemId, contentIndex, synchronizer, textStream, audioStream) {
111
- const handle = new PlayoutHandle(
112
- this.#audioSource,
113
- this.#sampleRate,
114
- itemId,
115
- contentIndex,
116
- synchronizer
117
- );
118
- this.#playoutTask = this.#makePlayoutTask(this.#playoutTask, handle, textStream, audioStream);
119
- return handle;
120
- }
121
- #makePlayoutTask(oldTask, handle, textStream, audioStream) {
122
- return new import_utils.CancellablePromise((resolve, reject, onCancel) => {
123
- let cancelled = false;
124
- onCancel(() => {
125
- cancelled = true;
126
- });
127
- (async () => {
128
- try {
129
- if (oldTask) {
130
- await (0, import_utils.gracefullyCancel)(oldTask);
131
- }
132
- let firstFrame = true;
133
- const readText = () => new import_utils.CancellablePromise((resolveText, rejectText, onCancelText) => {
134
- let cancelledText = false;
135
- onCancelText(() => {
136
- cancelledText = true;
137
- });
138
- (async () => {
139
- try {
140
- for await (const text of textStream) {
141
- if (cancelledText || cancelled) {
142
- break;
143
- }
144
- handle.synchronizer.pushText(text);
145
- }
146
- if (!cancelled) {
147
- handle.synchronizer.markTextSegmentEnd();
148
- }
149
- resolveText();
150
- } catch (error) {
151
- rejectText(error);
152
- }
153
- })();
154
- });
155
- const capture = () => new import_utils.CancellablePromise((resolveCapture, rejectCapture, onCancelCapture) => {
156
- let cancelledCapture = false;
157
- onCancelCapture(() => {
158
- cancelledCapture = true;
159
- });
160
- (async () => {
161
- try {
162
- const samplesPerChannel = this.#outFrameSize;
163
- const bstream = new import_audio.AudioByteStream(
164
- this.#sampleRate,
165
- this.#numChannels,
166
- samplesPerChannel
167
- );
168
- for await (const frame of audioStream) {
169
- if (cancelledCapture || cancelled) {
170
- break;
171
- }
172
- if (firstFrame) {
173
- handle.synchronizer.segmentPlayoutStarted();
174
- this.emit("playout_started");
175
- firstFrame = false;
176
- }
177
- handle.synchronizer.pushAudio(frame);
178
- for (const f of bstream.write(frame.data.buffer)) {
179
- handle.pushedDuration += f.samplesPerChannel / f.sampleRate * 1e3;
180
- await this.#audioSource.captureFrame(f);
181
- }
182
- }
183
- if (!cancelledCapture && !cancelled) {
184
- for (const f of bstream.flush()) {
185
- handle.pushedDuration += f.samplesPerChannel / f.sampleRate * 1e3;
186
- await this.#audioSource.captureFrame(f);
187
- }
188
- handle.synchronizer.markAudioSegmentEnd();
189
- await this.#audioSource.waitForPlayout();
190
- }
191
- resolveCapture();
192
- } catch (error) {
193
- rejectCapture(error);
194
- }
195
- })();
196
- });
197
- const readTextTask = readText();
198
- const captureTask = capture();
199
- try {
200
- await Promise.race([captureTask, handle.intFut.await]);
201
- } finally {
202
- if (!captureTask.isCancelled) {
203
- await (0, import_utils.gracefullyCancel)(captureTask);
204
- }
205
- if (!readTextTask.isCancelled) {
206
- await (0, import_utils.gracefullyCancel)(readTextTask);
207
- }
208
- handle.totalPlayedTime = handle.pushedDuration - this.#audioSource.queuedDuration;
209
- if (handle.interrupted || captureTask.error) {
210
- this.#audioSource.clearQueue();
211
- }
212
- if (!firstFrame) {
213
- this.emit("playout_stopped", handle.interrupted);
214
- }
215
- handle.doneFut.resolve();
216
- const isInterrupted = handle.interrupted || !!captureTask.error;
217
- await handle.synchronizer.close(isInterrupted);
218
- }
219
- resolve();
220
- } catch (error) {
221
- reject(error);
222
- }
223
- })();
224
- });
225
- }
226
- }
227
- // Annotate the CommonJS export names for ESM import in node:
228
- 0 && (module.exports = {
229
- AgentPlayout,
230
- PlayoutHandle,
231
- proto
232
- });
233
- //# sourceMappingURL=agent_playout.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/multimodal/agent_playout.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { AudioFrame } from '@livekit/rtc-node';\nimport { type AudioSource } from '@livekit/rtc-node';\nimport { EventEmitter } from 'node:events';\nimport { AudioByteStream } from '../audio.js';\nimport type { TextAudioSynchronizer } from '../transcription.js';\nimport { type AsyncIterableQueue, CancellablePromise, Future, gracefullyCancel } from '../utils.js';\n\nexport const proto = {};\n\nexport class PlayoutHandle extends EventEmitter {\n #audioSource: AudioSource;\n #sampleRate: number;\n #itemId: string;\n #contentIndex: number;\n /** @internal */\n synchronizer: TextAudioSynchronizer;\n /** @internal */\n doneFut: Future;\n /** @internal */\n intFut: Future;\n /** @internal */\n #interrupted: boolean;\n /** @internal */\n pushedDuration: number;\n /** @internal */\n totalPlayedTime: number | undefined; // Set when playout is done\n\n constructor(\n audioSource: AudioSource,\n sampleRate: number,\n itemId: string,\n contentIndex: number,\n synchronizer: TextAudioSynchronizer,\n ) {\n super();\n this.#audioSource = audioSource;\n this.#sampleRate = sampleRate;\n this.#itemId = itemId;\n this.#contentIndex = contentIndex;\n this.synchronizer = synchronizer;\n this.doneFut = new Future();\n this.intFut = new Future();\n this.#interrupted = false;\n this.pushedDuration = 0;\n this.totalPlayedTime = undefined;\n }\n\n get itemId(): string {\n return this.#itemId;\n }\n\n get audioSamples(): number {\n if (this.totalPlayedTime !== undefined) {\n return Math.floor(this.totalPlayedTime * this.#sampleRate);\n }\n\n return Math.max(\n 0,\n Math.floor(\n (this.pushedDuration - this.#audioSource.queuedDuration) * (this.#sampleRate / 1000),\n ),\n );\n }\n\n get textChars(): number {\n return this.synchronizer.playedText.length;\n }\n\n get contentIndex(): number {\n return this.#contentIndex;\n }\n\n get interrupted(): boolean {\n return this.#interrupted;\n }\n\n get done(): boolean {\n return this.doneFut.done || this.#interrupted;\n }\n\n interrupt() {\n if (this.doneFut.done) return;\n this.intFut.resolve();\n this.#interrupted = true;\n }\n}\n\nexport class AgentPlayout extends EventEmitter {\n #audioSource: AudioSource;\n #playoutTask: CancellablePromise<void> | null;\n #sampleRate: number;\n #numChannels: number;\n #inFrameSize: number;\n #outFrameSize: number;\n constructor(\n audioSource: AudioSource,\n sampleRate: number,\n numChannels: number,\n inFrameSize: number,\n outFrameSize: number,\n ) {\n super();\n this.#audioSource = audioSource;\n this.#playoutTask = null;\n this.#sampleRate = sampleRate;\n this.#numChannels = numChannels;\n this.#inFrameSize = inFrameSize;\n this.#outFrameSize = outFrameSize;\n }\n\n play(\n itemId: string,\n contentIndex: number,\n synchronizer: TextAudioSynchronizer,\n textStream: AsyncIterableQueue<string>,\n audioStream: AsyncIterableQueue<AudioFrame>,\n ): PlayoutHandle {\n const handle = new PlayoutHandle(\n this.#audioSource,\n this.#sampleRate,\n itemId,\n contentIndex,\n synchronizer,\n );\n this.#playoutTask = this.#makePlayoutTask(this.#playoutTask, handle, textStream, audioStream);\n return handle;\n }\n\n #makePlayoutTask(\n oldTask: CancellablePromise<void> | null,\n handle: PlayoutHandle,\n textStream: AsyncIterableQueue<string>,\n audioStream: AsyncIterableQueue<AudioFrame>,\n ): CancellablePromise<void> {\n return new CancellablePromise<void>((resolve, reject, onCancel) => {\n let cancelled = false;\n onCancel(() => {\n cancelled = true;\n });\n\n (async () => {\n try {\n if (oldTask) {\n await gracefullyCancel(oldTask);\n }\n\n let firstFrame = true;\n\n const readText = () =>\n new CancellablePromise<void>((resolveText, rejectText, onCancelText) => {\n let cancelledText = false;\n onCancelText(() => {\n cancelledText = true;\n });\n\n (async () => {\n try {\n for await (const text of textStream) {\n if (cancelledText || cancelled) {\n break;\n }\n handle.synchronizer.pushText(text);\n }\n if (!cancelled) {\n handle.synchronizer.markTextSegmentEnd();\n }\n resolveText();\n } catch (error) {\n rejectText(error);\n }\n })();\n });\n\n const capture = () =>\n new CancellablePromise<void>((resolveCapture, rejectCapture, onCancelCapture) => {\n let cancelledCapture = false;\n onCancelCapture(() => {\n cancelledCapture = true;\n });\n\n (async () => {\n try {\n const samplesPerChannel = this.#outFrameSize;\n const bstream = new AudioByteStream(\n this.#sampleRate,\n this.#numChannels,\n samplesPerChannel,\n );\n\n for await (const frame of audioStream) {\n if (cancelledCapture || cancelled) {\n break;\n }\n if (firstFrame) {\n handle.synchronizer.segmentPlayoutStarted();\n this.emit('playout_started');\n firstFrame = false;\n }\n\n handle.synchronizer.pushAudio(frame);\n\n for (const f of bstream.write(frame.data.buffer)) {\n handle.pushedDuration += (f.samplesPerChannel / f.sampleRate) * 1000;\n await this.#audioSource.captureFrame(f);\n }\n }\n\n if (!cancelledCapture && !cancelled) {\n for (const f of bstream.flush()) {\n handle.pushedDuration += (f.samplesPerChannel / f.sampleRate) * 1000;\n await this.#audioSource.captureFrame(f);\n }\n\n handle.synchronizer.markAudioSegmentEnd();\n\n await this.#audioSource.waitForPlayout();\n }\n\n resolveCapture();\n } catch (error) {\n rejectCapture(error);\n }\n })();\n });\n\n const readTextTask = readText();\n const captureTask = capture();\n\n try {\n await Promise.race([captureTask, handle.intFut.await]);\n } finally {\n if (!captureTask.isCancelled) {\n await gracefullyCancel(captureTask);\n }\n\n if (!readTextTask.isCancelled) {\n await gracefullyCancel(readTextTask);\n }\n\n handle.totalPlayedTime = handle.pushedDuration - this.#audioSource.queuedDuration;\n\n if (handle.interrupted || captureTask.error) {\n this.#audioSource.clearQueue(); // make sure to remove any queued frames\n }\n\n if (!firstFrame) {\n this.emit('playout_stopped', handle.interrupted);\n }\n\n handle.doneFut.resolve();\n\n const isInterrupted = handle.interrupted || !!captureTask.error;\n await handle.synchronizer.close(isInterrupted);\n }\n\n resolve();\n } catch (error) {\n reject(error);\n }\n })();\n });\n }\n}\n"],"mappings":"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","names":[]}
@@ -1,34 +0,0 @@
1
- /// <reference types="node" resolution-mode="require"/>
2
- import type { AudioFrame } from '@livekit/rtc-node';
3
- import { type AudioSource } from '@livekit/rtc-node';
4
- import { EventEmitter } from 'node:events';
5
- import type { TextAudioSynchronizer } from '../transcription.js';
6
- import { type AsyncIterableQueue, Future } from '../utils.js';
7
- export declare const proto: {};
8
- export declare class PlayoutHandle extends EventEmitter {
9
- #private;
10
- /** @internal */
11
- synchronizer: TextAudioSynchronizer;
12
- /** @internal */
13
- doneFut: Future;
14
- /** @internal */
15
- intFut: Future;
16
- /** @internal */
17
- pushedDuration: number;
18
- /** @internal */
19
- totalPlayedTime: number | undefined;
20
- constructor(audioSource: AudioSource, sampleRate: number, itemId: string, contentIndex: number, synchronizer: TextAudioSynchronizer);
21
- get itemId(): string;
22
- get audioSamples(): number;
23
- get textChars(): number;
24
- get contentIndex(): number;
25
- get interrupted(): boolean;
26
- get done(): boolean;
27
- interrupt(): void;
28
- }
29
- export declare class AgentPlayout extends EventEmitter {
30
- #private;
31
- constructor(audioSource: AudioSource, sampleRate: number, numChannels: number, inFrameSize: number, outFrameSize: number);
32
- play(itemId: string, contentIndex: number, synchronizer: TextAudioSynchronizer, textStream: AsyncIterableQueue<string>, audioStream: AsyncIterableQueue<AudioFrame>): PlayoutHandle;
33
- }
34
- //# sourceMappingURL=agent_playout.d.ts.map
@@ -1,34 +0,0 @@
1
- /// <reference types="node" resolution-mode="require"/>
2
- import type { AudioFrame } from '@livekit/rtc-node';
3
- import { type AudioSource } from '@livekit/rtc-node';
4
- import { EventEmitter } from 'node:events';
5
- import type { TextAudioSynchronizer } from '../transcription.js';
6
- import { type AsyncIterableQueue, Future } from '../utils.js';
7
- export declare const proto: {};
8
- export declare class PlayoutHandle extends EventEmitter {
9
- #private;
10
- /** @internal */
11
- synchronizer: TextAudioSynchronizer;
12
- /** @internal */
13
- doneFut: Future;
14
- /** @internal */
15
- intFut: Future;
16
- /** @internal */
17
- pushedDuration: number;
18
- /** @internal */
19
- totalPlayedTime: number | undefined;
20
- constructor(audioSource: AudioSource, sampleRate: number, itemId: string, contentIndex: number, synchronizer: TextAudioSynchronizer);
21
- get itemId(): string;
22
- get audioSamples(): number;
23
- get textChars(): number;
24
- get contentIndex(): number;
25
- get interrupted(): boolean;
26
- get done(): boolean;
27
- interrupt(): void;
28
- }
29
- export declare class AgentPlayout extends EventEmitter {
30
- #private;
31
- constructor(audioSource: AudioSource, sampleRate: number, numChannels: number, inFrameSize: number, outFrameSize: number);
32
- play(itemId: string, contentIndex: number, synchronizer: TextAudioSynchronizer, textStream: AsyncIterableQueue<string>, audioStream: AsyncIterableQueue<AudioFrame>): PlayoutHandle;
33
- }
34
- //# sourceMappingURL=agent_playout.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"agent_playout.d.ts","sourceRoot":"","sources":["../../src/multimodal/agent_playout.ts"],"names":[],"mappings":";AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACjE,OAAO,EAAE,KAAK,kBAAkB,EAAsB,MAAM,EAAoB,MAAM,aAAa,CAAC;AAEpG,eAAO,MAAM,KAAK,IAAK,CAAC;AAExB,qBAAa,aAAc,SAAQ,YAAY;;IAK7C,gBAAgB;IAChB,YAAY,EAAE,qBAAqB,CAAC;IACpC,gBAAgB;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB;IAChB,MAAM,EAAE,MAAM,CAAC;IAGf,gBAAgB;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB;IAChB,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;gBAGlC,WAAW,EAAE,WAAW,EACxB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,qBAAqB;IAerC,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,IAAI,YAAY,IAAI,MAAM,CAWzB;IAED,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,IAAI,WAAW,IAAI,OAAO,CAEzB;IAED,IAAI,IAAI,IAAI,OAAO,CAElB;IAED,SAAS;CAKV;AAED,qBAAa,YAAa,SAAQ,YAAY;;gBAQ1C,WAAW,EAAE,WAAW,EACxB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM;IAWtB,IAAI,CACF,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,qBAAqB,EACnC,UAAU,EAAE,kBAAkB,CAAC,MAAM,CAAC,EACtC,WAAW,EAAE,kBAAkB,CAAC,UAAU,CAAC,GAC1C,aAAa;CAkJjB"}
@@ -1,207 +0,0 @@
1
- import {} from "@livekit/rtc-node";
2
- import { EventEmitter } from "node:events";
3
- import { AudioByteStream } from "../audio.js";
4
- import { CancellablePromise, Future, gracefullyCancel } from "../utils.js";
5
- const proto = {};
6
- class PlayoutHandle extends EventEmitter {
7
- #audioSource;
8
- #sampleRate;
9
- #itemId;
10
- #contentIndex;
11
- /** @internal */
12
- synchronizer;
13
- /** @internal */
14
- doneFut;
15
- /** @internal */
16
- intFut;
17
- /** @internal */
18
- #interrupted;
19
- /** @internal */
20
- pushedDuration;
21
- /** @internal */
22
- totalPlayedTime;
23
- // Set when playout is done
24
- constructor(audioSource, sampleRate, itemId, contentIndex, synchronizer) {
25
- super();
26
- this.#audioSource = audioSource;
27
- this.#sampleRate = sampleRate;
28
- this.#itemId = itemId;
29
- this.#contentIndex = contentIndex;
30
- this.synchronizer = synchronizer;
31
- this.doneFut = new Future();
32
- this.intFut = new Future();
33
- this.#interrupted = false;
34
- this.pushedDuration = 0;
35
- this.totalPlayedTime = void 0;
36
- }
37
- get itemId() {
38
- return this.#itemId;
39
- }
40
- get audioSamples() {
41
- if (this.totalPlayedTime !== void 0) {
42
- return Math.floor(this.totalPlayedTime * this.#sampleRate);
43
- }
44
- return Math.max(
45
- 0,
46
- Math.floor(
47
- (this.pushedDuration - this.#audioSource.queuedDuration) * (this.#sampleRate / 1e3)
48
- )
49
- );
50
- }
51
- get textChars() {
52
- return this.synchronizer.playedText.length;
53
- }
54
- get contentIndex() {
55
- return this.#contentIndex;
56
- }
57
- get interrupted() {
58
- return this.#interrupted;
59
- }
60
- get done() {
61
- return this.doneFut.done || this.#interrupted;
62
- }
63
- interrupt() {
64
- if (this.doneFut.done) return;
65
- this.intFut.resolve();
66
- this.#interrupted = true;
67
- }
68
- }
69
- class AgentPlayout extends EventEmitter {
70
- #audioSource;
71
- #playoutTask;
72
- #sampleRate;
73
- #numChannels;
74
- #inFrameSize;
75
- #outFrameSize;
76
- constructor(audioSource, sampleRate, numChannels, inFrameSize, outFrameSize) {
77
- super();
78
- this.#audioSource = audioSource;
79
- this.#playoutTask = null;
80
- this.#sampleRate = sampleRate;
81
- this.#numChannels = numChannels;
82
- this.#inFrameSize = inFrameSize;
83
- this.#outFrameSize = outFrameSize;
84
- }
85
- play(itemId, contentIndex, synchronizer, textStream, audioStream) {
86
- const handle = new PlayoutHandle(
87
- this.#audioSource,
88
- this.#sampleRate,
89
- itemId,
90
- contentIndex,
91
- synchronizer
92
- );
93
- this.#playoutTask = this.#makePlayoutTask(this.#playoutTask, handle, textStream, audioStream);
94
- return handle;
95
- }
96
- #makePlayoutTask(oldTask, handle, textStream, audioStream) {
97
- return new CancellablePromise((resolve, reject, onCancel) => {
98
- let cancelled = false;
99
- onCancel(() => {
100
- cancelled = true;
101
- });
102
- (async () => {
103
- try {
104
- if (oldTask) {
105
- await gracefullyCancel(oldTask);
106
- }
107
- let firstFrame = true;
108
- const readText = () => new CancellablePromise((resolveText, rejectText, onCancelText) => {
109
- let cancelledText = false;
110
- onCancelText(() => {
111
- cancelledText = true;
112
- });
113
- (async () => {
114
- try {
115
- for await (const text of textStream) {
116
- if (cancelledText || cancelled) {
117
- break;
118
- }
119
- handle.synchronizer.pushText(text);
120
- }
121
- if (!cancelled) {
122
- handle.synchronizer.markTextSegmentEnd();
123
- }
124
- resolveText();
125
- } catch (error) {
126
- rejectText(error);
127
- }
128
- })();
129
- });
130
- const capture = () => new CancellablePromise((resolveCapture, rejectCapture, onCancelCapture) => {
131
- let cancelledCapture = false;
132
- onCancelCapture(() => {
133
- cancelledCapture = true;
134
- });
135
- (async () => {
136
- try {
137
- const samplesPerChannel = this.#outFrameSize;
138
- const bstream = new AudioByteStream(
139
- this.#sampleRate,
140
- this.#numChannels,
141
- samplesPerChannel
142
- );
143
- for await (const frame of audioStream) {
144
- if (cancelledCapture || cancelled) {
145
- break;
146
- }
147
- if (firstFrame) {
148
- handle.synchronizer.segmentPlayoutStarted();
149
- this.emit("playout_started");
150
- firstFrame = false;
151
- }
152
- handle.synchronizer.pushAudio(frame);
153
- for (const f of bstream.write(frame.data.buffer)) {
154
- handle.pushedDuration += f.samplesPerChannel / f.sampleRate * 1e3;
155
- await this.#audioSource.captureFrame(f);
156
- }
157
- }
158
- if (!cancelledCapture && !cancelled) {
159
- for (const f of bstream.flush()) {
160
- handle.pushedDuration += f.samplesPerChannel / f.sampleRate * 1e3;
161
- await this.#audioSource.captureFrame(f);
162
- }
163
- handle.synchronizer.markAudioSegmentEnd();
164
- await this.#audioSource.waitForPlayout();
165
- }
166
- resolveCapture();
167
- } catch (error) {
168
- rejectCapture(error);
169
- }
170
- })();
171
- });
172
- const readTextTask = readText();
173
- const captureTask = capture();
174
- try {
175
- await Promise.race([captureTask, handle.intFut.await]);
176
- } finally {
177
- if (!captureTask.isCancelled) {
178
- await gracefullyCancel(captureTask);
179
- }
180
- if (!readTextTask.isCancelled) {
181
- await gracefullyCancel(readTextTask);
182
- }
183
- handle.totalPlayedTime = handle.pushedDuration - this.#audioSource.queuedDuration;
184
- if (handle.interrupted || captureTask.error) {
185
- this.#audioSource.clearQueue();
186
- }
187
- if (!firstFrame) {
188
- this.emit("playout_stopped", handle.interrupted);
189
- }
190
- handle.doneFut.resolve();
191
- const isInterrupted = handle.interrupted || !!captureTask.error;
192
- await handle.synchronizer.close(isInterrupted);
193
- }
194
- resolve();
195
- } catch (error) {
196
- reject(error);
197
- }
198
- })();
199
- });
200
- }
201
- }
202
- export {
203
- AgentPlayout,
204
- PlayoutHandle,
205
- proto
206
- };
207
- //# sourceMappingURL=agent_playout.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/multimodal/agent_playout.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { AudioFrame } from '@livekit/rtc-node';\nimport { type AudioSource } from '@livekit/rtc-node';\nimport { EventEmitter } from 'node:events';\nimport { AudioByteStream } from '../audio.js';\nimport type { TextAudioSynchronizer } from '../transcription.js';\nimport { type AsyncIterableQueue, CancellablePromise, Future, gracefullyCancel } from '../utils.js';\n\nexport const proto = {};\n\nexport class PlayoutHandle extends EventEmitter {\n #audioSource: AudioSource;\n #sampleRate: number;\n #itemId: string;\n #contentIndex: number;\n /** @internal */\n synchronizer: TextAudioSynchronizer;\n /** @internal */\n doneFut: Future;\n /** @internal */\n intFut: Future;\n /** @internal */\n #interrupted: boolean;\n /** @internal */\n pushedDuration: number;\n /** @internal */\n totalPlayedTime: number | undefined; // Set when playout is done\n\n constructor(\n audioSource: AudioSource,\n sampleRate: number,\n itemId: string,\n contentIndex: number,\n synchronizer: TextAudioSynchronizer,\n ) {\n super();\n this.#audioSource = audioSource;\n this.#sampleRate = sampleRate;\n this.#itemId = itemId;\n this.#contentIndex = contentIndex;\n this.synchronizer = synchronizer;\n this.doneFut = new Future();\n this.intFut = new Future();\n this.#interrupted = false;\n this.pushedDuration = 0;\n this.totalPlayedTime = undefined;\n }\n\n get itemId(): string {\n return this.#itemId;\n }\n\n get audioSamples(): number {\n if (this.totalPlayedTime !== undefined) {\n return Math.floor(this.totalPlayedTime * this.#sampleRate);\n }\n\n return Math.max(\n 0,\n Math.floor(\n (this.pushedDuration - this.#audioSource.queuedDuration) * (this.#sampleRate / 1000),\n ),\n );\n }\n\n get textChars(): number {\n return this.synchronizer.playedText.length;\n }\n\n get contentIndex(): number {\n return this.#contentIndex;\n }\n\n get interrupted(): boolean {\n return this.#interrupted;\n }\n\n get done(): boolean {\n return this.doneFut.done || this.#interrupted;\n }\n\n interrupt() {\n if (this.doneFut.done) return;\n this.intFut.resolve();\n this.#interrupted = true;\n }\n}\n\nexport class AgentPlayout extends EventEmitter {\n #audioSource: AudioSource;\n #playoutTask: CancellablePromise<void> | null;\n #sampleRate: number;\n #numChannels: number;\n #inFrameSize: number;\n #outFrameSize: number;\n constructor(\n audioSource: AudioSource,\n sampleRate: number,\n numChannels: number,\n inFrameSize: number,\n outFrameSize: number,\n ) {\n super();\n this.#audioSource = audioSource;\n this.#playoutTask = null;\n this.#sampleRate = sampleRate;\n this.#numChannels = numChannels;\n this.#inFrameSize = inFrameSize;\n this.#outFrameSize = outFrameSize;\n }\n\n play(\n itemId: string,\n contentIndex: number,\n synchronizer: TextAudioSynchronizer,\n textStream: AsyncIterableQueue<string>,\n audioStream: AsyncIterableQueue<AudioFrame>,\n ): PlayoutHandle {\n const handle = new PlayoutHandle(\n this.#audioSource,\n this.#sampleRate,\n itemId,\n contentIndex,\n synchronizer,\n );\n this.#playoutTask = this.#makePlayoutTask(this.#playoutTask, handle, textStream, audioStream);\n return handle;\n }\n\n #makePlayoutTask(\n oldTask: CancellablePromise<void> | null,\n handle: PlayoutHandle,\n textStream: AsyncIterableQueue<string>,\n audioStream: AsyncIterableQueue<AudioFrame>,\n ): CancellablePromise<void> {\n return new CancellablePromise<void>((resolve, reject, onCancel) => {\n let cancelled = false;\n onCancel(() => {\n cancelled = true;\n });\n\n (async () => {\n try {\n if (oldTask) {\n await gracefullyCancel(oldTask);\n }\n\n let firstFrame = true;\n\n const readText = () =>\n new CancellablePromise<void>((resolveText, rejectText, onCancelText) => {\n let cancelledText = false;\n onCancelText(() => {\n cancelledText = true;\n });\n\n (async () => {\n try {\n for await (const text of textStream) {\n if (cancelledText || cancelled) {\n break;\n }\n handle.synchronizer.pushText(text);\n }\n if (!cancelled) {\n handle.synchronizer.markTextSegmentEnd();\n }\n resolveText();\n } catch (error) {\n rejectText(error);\n }\n })();\n });\n\n const capture = () =>\n new CancellablePromise<void>((resolveCapture, rejectCapture, onCancelCapture) => {\n let cancelledCapture = false;\n onCancelCapture(() => {\n cancelledCapture = true;\n });\n\n (async () => {\n try {\n const samplesPerChannel = this.#outFrameSize;\n const bstream = new AudioByteStream(\n this.#sampleRate,\n this.#numChannels,\n samplesPerChannel,\n );\n\n for await (const frame of audioStream) {\n if (cancelledCapture || cancelled) {\n break;\n }\n if (firstFrame) {\n handle.synchronizer.segmentPlayoutStarted();\n this.emit('playout_started');\n firstFrame = false;\n }\n\n handle.synchronizer.pushAudio(frame);\n\n for (const f of bstream.write(frame.data.buffer)) {\n handle.pushedDuration += (f.samplesPerChannel / f.sampleRate) * 1000;\n await this.#audioSource.captureFrame(f);\n }\n }\n\n if (!cancelledCapture && !cancelled) {\n for (const f of bstream.flush()) {\n handle.pushedDuration += (f.samplesPerChannel / f.sampleRate) * 1000;\n await this.#audioSource.captureFrame(f);\n }\n\n handle.synchronizer.markAudioSegmentEnd();\n\n await this.#audioSource.waitForPlayout();\n }\n\n resolveCapture();\n } catch (error) {\n rejectCapture(error);\n }\n })();\n });\n\n const readTextTask = readText();\n const captureTask = capture();\n\n try {\n await Promise.race([captureTask, handle.intFut.await]);\n } finally {\n if (!captureTask.isCancelled) {\n await gracefullyCancel(captureTask);\n }\n\n if (!readTextTask.isCancelled) {\n await gracefullyCancel(readTextTask);\n }\n\n handle.totalPlayedTime = handle.pushedDuration - this.#audioSource.queuedDuration;\n\n if (handle.interrupted || captureTask.error) {\n this.#audioSource.clearQueue(); // make sure to remove any queued frames\n }\n\n if (!firstFrame) {\n this.emit('playout_stopped', handle.interrupted);\n }\n\n handle.doneFut.resolve();\n\n const isInterrupted = handle.interrupted || !!captureTask.error;\n await handle.synchronizer.close(isInterrupted);\n }\n\n resolve();\n } catch (error) {\n reject(error);\n }\n })();\n });\n }\n}\n"],"mappings":"AAIA,eAAiC;AACjC,SAAS,oBAAoB;AAC7B,SAAS,uBAAuB;AAEhC,SAAkC,oBAAoB,QAAQ,wBAAwB;AAE/E,MAAM,QAAQ,CAAC;AAEf,MAAM,sBAAsB,aAAa;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA;AAAA;AAAA,EAEA,YACE,aACA,YACA,QACA,cACA,cACA;AACA,UAAM;AACN,SAAK,eAAe;AACpB,SAAK,cAAc;AACnB,SAAK,UAAU;AACf,SAAK,gBAAgB;AACrB,SAAK,eAAe;AACpB,SAAK,UAAU,IAAI,OAAO;AAC1B,SAAK,SAAS,IAAI,OAAO;AACzB,SAAK,eAAe;AACpB,SAAK,iBAAiB;AACtB,SAAK,kBAAkB;AAAA,EACzB;AAAA,EAEA,IAAI,SAAiB;AACnB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,eAAuB;AACzB,QAAI,KAAK,oBAAoB,QAAW;AACtC,aAAO,KAAK,MAAM,KAAK,kBAAkB,KAAK,WAAW;AAAA,IAC3D;AAEA,WAAO,KAAK;AAAA,MACV;AAAA,MACA,KAAK;AAAA,SACF,KAAK,iBAAiB,KAAK,aAAa,mBAAmB,KAAK,cAAc;AAAA,MACjF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,IAAI,YAAoB;AACtB,WAAO,KAAK,aAAa,WAAW;AAAA,EACtC;AAAA,EAEA,IAAI,eAAuB;AACzB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,cAAuB;AACzB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,OAAgB;AAClB,WAAO,KAAK,QAAQ,QAAQ,KAAK;AAAA,EACnC;AAAA,EAEA,YAAY;AACV,QAAI,KAAK,QAAQ,KAAM;AACvB,SAAK,OAAO,QAAQ;AACpB,SAAK,eAAe;AAAA,EACtB;AACF;AAEO,MAAM,qBAAqB,aAAa;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YACE,aACA,YACA,aACA,aACA,cACA;AACA,UAAM;AACN,SAAK,eAAe;AACpB,SAAK,eAAe;AACpB,SAAK,cAAc;AACnB,SAAK,eAAe;AACpB,SAAK,eAAe;AACpB,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEA,KACE,QACA,cACA,cACA,YACA,aACe;AACf,UAAM,SAAS,IAAI;AAAA,MACjB,KAAK;AAAA,MACL,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,SAAK,eAAe,KAAK,iBAAiB,KAAK,cAAc,QAAQ,YAAY,WAAW;AAC5F,WAAO;AAAA,EACT;AAAA,EAEA,iBACE,SACA,QACA,YACA,aAC0B;AAC1B,WAAO,IAAI,mBAAyB,CAAC,SAAS,QAAQ,aAAa;AACjE,UAAI,YAAY;AAChB,eAAS,MAAM;AACb,oBAAY;AAAA,MACd,CAAC;AAED,OAAC,YAAY;AACX,YAAI;AACF,cAAI,SAAS;AACX,kBAAM,iBAAiB,OAAO;AAAA,UAChC;AAEA,cAAI,aAAa;AAEjB,gBAAM,WAAW,MACf,IAAI,mBAAyB,CAAC,aAAa,YAAY,iBAAiB;AACtE,gBAAI,gBAAgB;AACpB,yBAAa,MAAM;AACjB,8BAAgB;AAAA,YAClB,CAAC;AAED,aAAC,YAAY;AACX,kBAAI;AACF,iCAAiB,QAAQ,YAAY;AACnC,sBAAI,iBAAiB,WAAW;AAC9B;AAAA,kBACF;AACA,yBAAO,aAAa,SAAS,IAAI;AAAA,gBACnC;AACA,oBAAI,CAAC,WAAW;AACd,yBAAO,aAAa,mBAAmB;AAAA,gBACzC;AACA,4BAAY;AAAA,cACd,SAAS,OAAO;AACd,2BAAW,KAAK;AAAA,cAClB;AAAA,YACF,GAAG;AAAA,UACL,CAAC;AAEH,gBAAM,UAAU,MACd,IAAI,mBAAyB,CAAC,gBAAgB,eAAe,oBAAoB;AAC/E,gBAAI,mBAAmB;AACvB,4BAAgB,MAAM;AACpB,iCAAmB;AAAA,YACrB,CAAC;AAED,aAAC,YAAY;AACX,kBAAI;AACF,sBAAM,oBAAoB,KAAK;AAC/B,sBAAM,UAAU,IAAI;AAAA,kBAClB,KAAK;AAAA,kBACL,KAAK;AAAA,kBACL;AAAA,gBACF;AAEA,iCAAiB,SAAS,aAAa;AACrC,sBAAI,oBAAoB,WAAW;AACjC;AAAA,kBACF;AACA,sBAAI,YAAY;AACd,2BAAO,aAAa,sBAAsB;AAC1C,yBAAK,KAAK,iBAAiB;AAC3B,iCAAa;AAAA,kBACf;AAEA,yBAAO,aAAa,UAAU,KAAK;AAEnC,6BAAW,KAAK,QAAQ,MAAM,MAAM,KAAK,MAAM,GAAG;AAChD,2BAAO,kBAAmB,EAAE,oBAAoB,EAAE,aAAc;AAChE,0BAAM,KAAK,aAAa,aAAa,CAAC;AAAA,kBACxC;AAAA,gBACF;AAEA,oBAAI,CAAC,oBAAoB,CAAC,WAAW;AACnC,6BAAW,KAAK,QAAQ,MAAM,GAAG;AAC/B,2BAAO,kBAAmB,EAAE,oBAAoB,EAAE,aAAc;AAChE,0BAAM,KAAK,aAAa,aAAa,CAAC;AAAA,kBACxC;AAEA,yBAAO,aAAa,oBAAoB;AAExC,wBAAM,KAAK,aAAa,eAAe;AAAA,gBACzC;AAEA,+BAAe;AAAA,cACjB,SAAS,OAAO;AACd,8BAAc,KAAK;AAAA,cACrB;AAAA,YACF,GAAG;AAAA,UACL,CAAC;AAEH,gBAAM,eAAe,SAAS;AAC9B,gBAAM,cAAc,QAAQ;AAE5B,cAAI;AACF,kBAAM,QAAQ,KAAK,CAAC,aAAa,OAAO,OAAO,KAAK,CAAC;AAAA,UACvD,UAAE;AACA,gBAAI,CAAC,YAAY,aAAa;AAC5B,oBAAM,iBAAiB,WAAW;AAAA,YACpC;AAEA,gBAAI,CAAC,aAAa,aAAa;AAC7B,oBAAM,iBAAiB,YAAY;AAAA,YACrC;AAEA,mBAAO,kBAAkB,OAAO,iBAAiB,KAAK,aAAa;AAEnE,gBAAI,OAAO,eAAe,YAAY,OAAO;AAC3C,mBAAK,aAAa,WAAW;AAAA,YAC/B;AAEA,gBAAI,CAAC,YAAY;AACf,mBAAK,KAAK,mBAAmB,OAAO,WAAW;AAAA,YACjD;AAEA,mBAAO,QAAQ,QAAQ;AAEvB,kBAAM,gBAAgB,OAAO,eAAe,CAAC,CAAC,YAAY;AAC1D,kBAAM,OAAO,aAAa,MAAM,aAAa;AAAA,UAC/C;AAEA,kBAAQ;AAAA,QACV,SAAS,OAAO;AACd,iBAAO,KAAK;AAAA,QACd;AAAA,MACF,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AACF;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/multimodal/index.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nexport * from './agent_playout.js';\n"],"mappings":";;;;;;;;;;;;;;;AAAA;AAAA;AAGA,+BAAc,+BAHd;","names":[]}
@@ -1,2 +0,0 @@
1
- export * from './agent_playout.js';
2
- //# sourceMappingURL=index.d.ts.map
@@ -1,2 +0,0 @@
1
- export * from './agent_playout.js';
2
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/multimodal/index.ts"],"names":[],"mappings":"AAGA,cAAc,oBAAoB,CAAC"}
@@ -1,2 +0,0 @@
1
- export * from "./agent_playout.js";
2
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/multimodal/index.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nexport * from './agent_playout.js';\n"],"mappings":"AAGA,cAAc;","names":[]}