@voxagent/bridge 0.1.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.
- package/README.md +74 -0
- package/dist/audio/source.d.ts +23 -0
- package/dist/audio/source.d.ts.map +1 -0
- package/dist/audio/source.js +69 -0
- package/dist/audio/source.js.map +1 -0
- package/dist/cli.d.ts +13 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +171 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +62 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +102 -0
- package/dist/config.js.map +1 -0
- package/dist/drivers/claude.d.ts +36 -0
- package/dist/drivers/claude.d.ts.map +1 -0
- package/dist/drivers/claude.js +445 -0
- package/dist/drivers/claude.js.map +1 -0
- package/dist/drivers/codex.d.ts +56 -0
- package/dist/drivers/codex.d.ts.map +1 -0
- package/dist/drivers/codex.js +652 -0
- package/dist/drivers/codex.js.map +1 -0
- package/dist/drivers/index.d.ts +34 -0
- package/dist/drivers/index.d.ts.map +1 -0
- package/dist/drivers/index.js +18 -0
- package/dist/drivers/index.js.map +1 -0
- package/dist/drivers/types.d.ts +81 -0
- package/dist/drivers/types.d.ts.map +1 -0
- package/dist/drivers/types.js +11 -0
- package/dist/drivers/types.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/logging.d.ts +15 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/logging.js +36 -0
- package/dist/logging.js.map +1 -0
- package/dist/pair.d.ts +25 -0
- package/dist/pair.d.ts.map +1 -0
- package/dist/pair.js +41 -0
- package/dist/pair.js.map +1 -0
- package/dist/permissions.d.ts +67 -0
- package/dist/permissions.d.ts.map +1 -0
- package/dist/permissions.js +221 -0
- package/dist/permissions.js.map +1 -0
- package/dist/protocol.d.ts +181 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +63 -0
- package/dist/protocol.js.map +1 -0
- package/dist/room.d.ts +52 -0
- package/dist/room.d.ts.map +1 -0
- package/dist/room.js +401 -0
- package/dist/room.js.map +1 -0
- package/dist/tts/elevenlabs.d.ts +43 -0
- package/dist/tts/elevenlabs.d.ts.map +1 -0
- package/dist/tts/elevenlabs.js +268 -0
- package/dist/tts/elevenlabs.js.map +1 -0
- package/dist/tts/index.d.ts +22 -0
- package/dist/tts/index.d.ts.map +1 -0
- package/dist/tts/index.js +23 -0
- package/dist/tts/index.js.map +1 -0
- package/dist/tts/openai.d.ts +35 -0
- package/dist/tts/openai.d.ts.map +1 -0
- package/dist/tts/openai.js +270 -0
- package/dist/tts/openai.js.map +1 -0
- package/dist/tts/types.d.ts +28 -0
- package/dist/tts/types.d.ts.map +1 -0
- package/dist/tts/types.js +5 -0
- package/dist/tts/types.js.map +1 -0
- package/package.json +68 -0
package/dist/room.js
ADDED
|
@@ -0,0 +1,401 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Room runtime — joins LiveKit, publishes agent voice, drives the agent.
|
|
3
|
+
*
|
|
4
|
+
* Lifecycle:
|
|
5
|
+
* 1. Connect to LiveKit with the bridge JWT.
|
|
6
|
+
* 2. Publish the agent audio track so other participants subscribe to it.
|
|
7
|
+
* 3. Send `bridge.hello` over the data channel so the UI knows we're paired.
|
|
8
|
+
* 4. Listen for `prompt.user_turn` from any participant.
|
|
9
|
+
* 5. For each prompt, run the driver; fan events into:
|
|
10
|
+
* - data channel (text deltas, tool events) for UI
|
|
11
|
+
* - TTS engine (text deltas) → AudioSource (PCM frames) for voice
|
|
12
|
+
* - cloud action ingest (tool start/end) for the persisted timeline
|
|
13
|
+
*/
|
|
14
|
+
import { Room, RoomEvent, } from '@livekit/rtc-node';
|
|
15
|
+
import { request } from 'undici';
|
|
16
|
+
import { AgentAudioPublisher } from './audio/source.js';
|
|
17
|
+
import { log } from './logging.js';
|
|
18
|
+
import { BRIDGE_TOPIC, PROTOCOL_VERSION, decodeBridgeEvent, encodeBridgeEvent, } from './protocol.js';
|
|
19
|
+
import { createTtsEngine } from './tts/index.js';
|
|
20
|
+
export class BridgeRoomRuntime {
|
|
21
|
+
options;
|
|
22
|
+
room;
|
|
23
|
+
audio = null;
|
|
24
|
+
tts = null;
|
|
25
|
+
activeRun = null;
|
|
26
|
+
deltaSeq = 0;
|
|
27
|
+
shuttingDown = false;
|
|
28
|
+
pendingPrompts = [];
|
|
29
|
+
constructor(options) {
|
|
30
|
+
this.options = options;
|
|
31
|
+
this.room = new Room();
|
|
32
|
+
}
|
|
33
|
+
async start() {
|
|
34
|
+
const { config, pair, capabilities } = this.options;
|
|
35
|
+
if (!config.textOnly) {
|
|
36
|
+
const apiKey = config.ttsProvider === 'openai' ? config.openAiApiKey : config.elevenLabsApiKey;
|
|
37
|
+
if (!apiKey) {
|
|
38
|
+
const envHint = config.ttsProvider === 'openai'
|
|
39
|
+
? 'Set OPENAI_API_KEY or VOXAGENT_OPENAI_API_KEY before running the bridge.'
|
|
40
|
+
: 'Set VOXAGENT_ELEVENLABS_API_KEY (or ELEVENLABS_API_KEY) before running the bridge.';
|
|
41
|
+
log.error('tts_key_missing', { provider: config.ttsProvider, hint: envHint });
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
this.tts = createTtsEngine({
|
|
45
|
+
provider: config.ttsProvider,
|
|
46
|
+
apiKey,
|
|
47
|
+
voiceId: config.ttsVoiceId,
|
|
48
|
+
modelId: config.ttsModelId,
|
|
49
|
+
...(config.ttsProvider === 'elevenlabs'
|
|
50
|
+
? { audioFormat: config.elevenLabsAudioFormat }
|
|
51
|
+
: {}),
|
|
52
|
+
});
|
|
53
|
+
log.info('tts_engine_ready', {
|
|
54
|
+
provider: config.ttsProvider,
|
|
55
|
+
voiceId: config.ttsVoiceId,
|
|
56
|
+
modelId: config.ttsModelId,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
log.info('tts_text_only_mode_enabled');
|
|
62
|
+
}
|
|
63
|
+
this.room.on(RoomEvent.DataReceived, this.handleDataReceived);
|
|
64
|
+
this.room.on(RoomEvent.Disconnected, this.handleDisconnect);
|
|
65
|
+
await this.room.connect(pair.livekitUrl, pair.livekitToken, {
|
|
66
|
+
autoSubscribe: true,
|
|
67
|
+
dynacast: true,
|
|
68
|
+
});
|
|
69
|
+
log.info('bridge_connected', {
|
|
70
|
+
identity: this.room.localParticipant?.identity ?? '(unknown)',
|
|
71
|
+
roomId: pair.roomId,
|
|
72
|
+
});
|
|
73
|
+
if (this.tts) {
|
|
74
|
+
this.audio = new AgentAudioPublisher(this.tts.sampleRate, this.tts.numChannels);
|
|
75
|
+
await this.audio.publish(this.room);
|
|
76
|
+
}
|
|
77
|
+
// Attach the permission broker now that the data channel is connected.
|
|
78
|
+
this.options.permissionBroker.attachPublisher((event) => {
|
|
79
|
+
void this.publishEvent(event);
|
|
80
|
+
});
|
|
81
|
+
await this.publishEvent({
|
|
82
|
+
type: 'bridge.hello',
|
|
83
|
+
protocolVersion: PROTOCOL_VERSION,
|
|
84
|
+
capabilities,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
async shutdown(reason = 'shutdown') {
|
|
88
|
+
if (this.shuttingDown)
|
|
89
|
+
return;
|
|
90
|
+
this.shuttingDown = true;
|
|
91
|
+
if (this.activeRun) {
|
|
92
|
+
this.activeRun.abort.abort();
|
|
93
|
+
this.activeRun.utterance?.cancel();
|
|
94
|
+
try {
|
|
95
|
+
await this.activeRun.pumpPromise;
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
// ignore
|
|
99
|
+
}
|
|
100
|
+
this.activeRun = null;
|
|
101
|
+
}
|
|
102
|
+
try {
|
|
103
|
+
await this.publishEvent({ type: 'bridge.bye', reason });
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
// ignore — may already be disconnected
|
|
107
|
+
}
|
|
108
|
+
this.options.permissionBroker.detachPublisher();
|
|
109
|
+
this.options.permissionBroker.cancelAll('deny');
|
|
110
|
+
await this.options.driver.close();
|
|
111
|
+
if (this.audio)
|
|
112
|
+
await this.audio.close();
|
|
113
|
+
if (this.tts)
|
|
114
|
+
await this.tts.close();
|
|
115
|
+
try {
|
|
116
|
+
await this.room.disconnect();
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
// ignore
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
handleDisconnect = () => {
|
|
123
|
+
log.info('bridge_room_disconnected');
|
|
124
|
+
if (!this.shuttingDown) {
|
|
125
|
+
void this.shutdown('error');
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
handleDataReceived = (payload, _participant, _kind, topic) => {
|
|
129
|
+
if (topic !== BRIDGE_TOPIC)
|
|
130
|
+
return;
|
|
131
|
+
const event = decodeBridgeEvent(payload);
|
|
132
|
+
if (!event)
|
|
133
|
+
return;
|
|
134
|
+
if (event.type === 'prompt.user_turn') {
|
|
135
|
+
this.enqueuePrompt(event);
|
|
136
|
+
}
|
|
137
|
+
else if (event.type === 'prompt.interrupt') {
|
|
138
|
+
this.interruptActiveRun();
|
|
139
|
+
}
|
|
140
|
+
else if (event.type === 'prompt.cancel_pending') {
|
|
141
|
+
this.pendingPrompts = [];
|
|
142
|
+
}
|
|
143
|
+
else if (event.type === 'permission.response') {
|
|
144
|
+
const handled = this.options.permissionBroker.resolve(event.requestId, event.decision);
|
|
145
|
+
if (handled) {
|
|
146
|
+
void this.publishEvent({
|
|
147
|
+
type: 'agent.permission_resolved',
|
|
148
|
+
requestId: event.requestId,
|
|
149
|
+
decision: event.decision,
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
enqueuePrompt(event) {
|
|
155
|
+
if (this.activeRun) {
|
|
156
|
+
// Interrupt the active run for the new prompt — matches "interrupt by speaking" UX.
|
|
157
|
+
this.interruptActiveRun();
|
|
158
|
+
}
|
|
159
|
+
this.pendingPrompts.push(event);
|
|
160
|
+
void this.drainPrompts();
|
|
161
|
+
}
|
|
162
|
+
async drainPrompts() {
|
|
163
|
+
if (this.activeRun)
|
|
164
|
+
return;
|
|
165
|
+
const next = this.pendingPrompts.shift();
|
|
166
|
+
if (!next)
|
|
167
|
+
return;
|
|
168
|
+
await this.runPrompt(next);
|
|
169
|
+
if (this.pendingPrompts.length > 0) {
|
|
170
|
+
void this.drainPrompts();
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
interruptActiveRun() {
|
|
174
|
+
if (!this.activeRun)
|
|
175
|
+
return;
|
|
176
|
+
log.info('bridge_run_interrupt', { runId: this.activeRun.runId });
|
|
177
|
+
this.activeRun.abort.abort();
|
|
178
|
+
this.activeRun.utterance?.cancel();
|
|
179
|
+
if (this.audio) {
|
|
180
|
+
void this.audio.flush();
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
async runPrompt(prompt) {
|
|
184
|
+
const abort = new AbortController();
|
|
185
|
+
this.deltaSeq = 0;
|
|
186
|
+
const utterance = this.tts ? this.tts.beginUtterance(prompt.promptId) : null;
|
|
187
|
+
const systemPromptAddendum = buildRoomContextAddendum(prompt);
|
|
188
|
+
const driverIter = this.options.driver.run({
|
|
189
|
+
prompt: prompt.text,
|
|
190
|
+
cwd: this.options.config.cwd,
|
|
191
|
+
systemPromptAddendum,
|
|
192
|
+
}, abort.signal);
|
|
193
|
+
let runId = '';
|
|
194
|
+
let runStarted = false;
|
|
195
|
+
const audioPump = utterance && this.audio ? this.pumpAudio(utterance) : Promise.resolve();
|
|
196
|
+
const pumpPromise = (async () => {
|
|
197
|
+
try {
|
|
198
|
+
for await (const event of driverIter) {
|
|
199
|
+
await this.handleDriverEvent(event, prompt, utterance);
|
|
200
|
+
if (event.type === 'run_start') {
|
|
201
|
+
runId = event.runId;
|
|
202
|
+
runStarted = true;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
log.error('bridge_driver_iter_error', {
|
|
208
|
+
message: error instanceof Error ? error.message : String(error),
|
|
209
|
+
});
|
|
210
|
+
if (runStarted && runId) {
|
|
211
|
+
await this.publishEvent({
|
|
212
|
+
type: 'agent.run_end',
|
|
213
|
+
runId,
|
|
214
|
+
reason: 'error',
|
|
215
|
+
message: error instanceof Error ? error.message : String(error),
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
finally {
|
|
220
|
+
utterance?.finish();
|
|
221
|
+
}
|
|
222
|
+
})();
|
|
223
|
+
this.activeRun = { runId: prompt.promptId, abort, utterance, pumpPromise };
|
|
224
|
+
try {
|
|
225
|
+
await pumpPromise;
|
|
226
|
+
await audioPump;
|
|
227
|
+
}
|
|
228
|
+
finally {
|
|
229
|
+
this.activeRun = null;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
async pumpAudio(utterance) {
|
|
233
|
+
if (!this.audio)
|
|
234
|
+
return;
|
|
235
|
+
try {
|
|
236
|
+
for await (const frame of utterance.frames()) {
|
|
237
|
+
await this.audio.pushFrame(frame);
|
|
238
|
+
}
|
|
239
|
+
await this.audio.waitForPlayout();
|
|
240
|
+
}
|
|
241
|
+
catch (error) {
|
|
242
|
+
log.warn('bridge_audio_pump_failed', {
|
|
243
|
+
message: error instanceof Error ? error.message : String(error),
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
async handleDriverEvent(event, prompt, utterance) {
|
|
248
|
+
switch (event.type) {
|
|
249
|
+
case 'run_start':
|
|
250
|
+
await this.publishEvent({
|
|
251
|
+
type: 'agent.run_start',
|
|
252
|
+
runId: event.runId,
|
|
253
|
+
promptId: prompt.promptId,
|
|
254
|
+
startedAtMs: event.startedAtMs,
|
|
255
|
+
});
|
|
256
|
+
return;
|
|
257
|
+
case 'text_delta': {
|
|
258
|
+
utterance?.pushText(event.delta);
|
|
259
|
+
await this.publishEvent({
|
|
260
|
+
type: 'agent.text_delta',
|
|
261
|
+
runId: event.runId,
|
|
262
|
+
delta: event.delta,
|
|
263
|
+
seq: this.deltaSeq++,
|
|
264
|
+
});
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
case 'text_done':
|
|
268
|
+
await this.publishEvent({ type: 'agent.text_done', runId: event.runId, text: event.text });
|
|
269
|
+
return;
|
|
270
|
+
case 'tool_use_start': {
|
|
271
|
+
await this.publishEvent({
|
|
272
|
+
type: 'agent.tool_use_start',
|
|
273
|
+
runId: event.runId,
|
|
274
|
+
toolUseId: event.toolUseId,
|
|
275
|
+
name: event.name,
|
|
276
|
+
input: event.input,
|
|
277
|
+
});
|
|
278
|
+
void this.ingestActionStart({
|
|
279
|
+
runId: event.runId,
|
|
280
|
+
toolUseId: event.toolUseId,
|
|
281
|
+
name: event.name,
|
|
282
|
+
input: event.input,
|
|
283
|
+
});
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
286
|
+
case 'tool_use_progress':
|
|
287
|
+
await this.publishEvent({
|
|
288
|
+
type: 'agent.tool_use_progress',
|
|
289
|
+
runId: event.runId,
|
|
290
|
+
toolUseId: event.toolUseId,
|
|
291
|
+
chunk: event.chunk,
|
|
292
|
+
});
|
|
293
|
+
return;
|
|
294
|
+
case 'tool_use_end': {
|
|
295
|
+
await this.publishEvent({
|
|
296
|
+
type: 'agent.tool_use_end',
|
|
297
|
+
runId: event.runId,
|
|
298
|
+
toolUseId: event.toolUseId,
|
|
299
|
+
status: event.status,
|
|
300
|
+
output: event.output,
|
|
301
|
+
...(event.latencyMs !== undefined ? { latencyMs: event.latencyMs } : {}),
|
|
302
|
+
});
|
|
303
|
+
void this.ingestActionEnd({
|
|
304
|
+
toolUseId: event.toolUseId,
|
|
305
|
+
status: event.status,
|
|
306
|
+
output: event.output,
|
|
307
|
+
latencyMs: event.latencyMs,
|
|
308
|
+
});
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
case 'thinking_delta':
|
|
312
|
+
await this.publishEvent({
|
|
313
|
+
type: 'agent.thinking_delta',
|
|
314
|
+
runId: event.runId,
|
|
315
|
+
delta: event.delta,
|
|
316
|
+
});
|
|
317
|
+
return;
|
|
318
|
+
case 'run_end':
|
|
319
|
+
await this.publishEvent({
|
|
320
|
+
type: 'agent.run_end',
|
|
321
|
+
runId: event.runId,
|
|
322
|
+
reason: event.reason,
|
|
323
|
+
...(event.message ? { message: event.message } : {}),
|
|
324
|
+
...(event.totalLatencyMs !== undefined ? { totalLatencyMs: event.totalLatencyMs } : {}),
|
|
325
|
+
});
|
|
326
|
+
return;
|
|
327
|
+
default: {
|
|
328
|
+
const exhaustive = event;
|
|
329
|
+
log.warn('bridge_unknown_driver_event', { event: exhaustive });
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
async publishEvent(event) {
|
|
334
|
+
try {
|
|
335
|
+
const local = this.room.localParticipant;
|
|
336
|
+
if (!local)
|
|
337
|
+
return;
|
|
338
|
+
await local.publishData(encodeBridgeEvent(event), {
|
|
339
|
+
reliable: true,
|
|
340
|
+
topic: BRIDGE_TOPIC,
|
|
341
|
+
});
|
|
342
|
+
}
|
|
343
|
+
catch (error) {
|
|
344
|
+
log.warn('bridge_publish_failed', {
|
|
345
|
+
type: event.type,
|
|
346
|
+
message: error instanceof Error ? error.message : String(error),
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
async ingestActionStart(payload) {
|
|
351
|
+
await this.callIngest('start', payload);
|
|
352
|
+
}
|
|
353
|
+
async ingestActionEnd(payload) {
|
|
354
|
+
await this.callIngest('end', payload);
|
|
355
|
+
}
|
|
356
|
+
async callIngest(phase, payload) {
|
|
357
|
+
const url = `${this.options.config.apiBaseUrl}/api/ai/actions/ingest`;
|
|
358
|
+
try {
|
|
359
|
+
const response = await request(url, {
|
|
360
|
+
method: 'POST',
|
|
361
|
+
headers: {
|
|
362
|
+
'content-type': 'application/json',
|
|
363
|
+
authorization: `Bearer ${this.options.pair.bridgeJwt}`,
|
|
364
|
+
},
|
|
365
|
+
body: JSON.stringify({ phase, ...payload }),
|
|
366
|
+
});
|
|
367
|
+
// Drain to free socket
|
|
368
|
+
await response.body.dump();
|
|
369
|
+
if (response.statusCode >= 400) {
|
|
370
|
+
log.debug('bridge_ingest_non_2xx', { status: response.statusCode, phase });
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
catch (error) {
|
|
374
|
+
log.debug('bridge_ingest_failed', {
|
|
375
|
+
phase,
|
|
376
|
+
message: error instanceof Error ? error.message : String(error),
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
function buildRoomContextAddendum(prompt) {
|
|
382
|
+
const transcriptLines = prompt.transcriptWindow
|
|
383
|
+
.slice(-8)
|
|
384
|
+
.map((entry) => `${entry.speaker}: ${entry.text}`)
|
|
385
|
+
.join('\n');
|
|
386
|
+
return [
|
|
387
|
+
'You are running on the host\'s machine, paired into a live voice meeting room.',
|
|
388
|
+
`Active room: "${prompt.room.name}".`,
|
|
389
|
+
`Participants: ${prompt.room.participants.join(', ') || 'unknown'}.`,
|
|
390
|
+
'Most recent transcript context:',
|
|
391
|
+
transcriptLines || '(no prior transcript)',
|
|
392
|
+
'',
|
|
393
|
+
'Output rules — your reply is spoken aloud and shown as captions:',
|
|
394
|
+
'- Reply in plain prose. Talk the way a person talks.',
|
|
395
|
+
'- No markdown: no **bold**, no *italics*, no headings, no bullet lists, no code fences, no tables.',
|
|
396
|
+
'- Keep replies to 1-3 short sentences when answering.',
|
|
397
|
+
'- When you take an action, narrate it briefly so the room hears progress (e.g. "Reading the file now.").',
|
|
398
|
+
'- Use short code blocks only when the user explicitly asks to see code.',
|
|
399
|
+
].join('\n');
|
|
400
|
+
}
|
|
401
|
+
//# sourceMappingURL=room.js.map
|
package/dist/room.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"room.js","sourceRoot":"","sources":["../src/room.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file ElevenLabs streaming TTS via WebSocket.
|
|
3
|
+
*
|
|
4
|
+
* Requests raw PCM at a configurable sample rate so we can push samples
|
|
5
|
+
* directly into LiveKit's AudioSource without an MP3 decode step. The
|
|
6
|
+
* default is `pcm_16000` (Starter tier and above); higher rates require
|
|
7
|
+
* Creator/Pro tiers — pass `audioFormat` to opt up.
|
|
8
|
+
*
|
|
9
|
+
* Tier reference (as of 2026-04):
|
|
10
|
+
* pcm_16000 — Starter+
|
|
11
|
+
* pcm_22050 — Creator+
|
|
12
|
+
* pcm_24000 — Pro+
|
|
13
|
+
* pcm_44100 — Pro+
|
|
14
|
+
*/
|
|
15
|
+
import WebSocket from 'undici/types/websocket.js';
|
|
16
|
+
import type { TtsEngine, TtsUtterance } from './types.js';
|
|
17
|
+
export type ElevenLabsAudioFormat = 'pcm_16000' | 'pcm_22050' | 'pcm_24000' | 'pcm_44100';
|
|
18
|
+
export interface ElevenLabsEngineOptions {
|
|
19
|
+
apiKey: string;
|
|
20
|
+
voiceId: string;
|
|
21
|
+
modelId: string;
|
|
22
|
+
/** Output format — defaults to `pcm_16000` for broadest tier compatibility. */
|
|
23
|
+
audioFormat?: ElevenLabsAudioFormat;
|
|
24
|
+
/** Optional voice tuning. */
|
|
25
|
+
voiceSettings?: {
|
|
26
|
+
stability?: number;
|
|
27
|
+
similarityBoost?: number;
|
|
28
|
+
style?: number;
|
|
29
|
+
useSpeakerBoost?: boolean;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export declare class ElevenLabsEngine implements TtsEngine {
|
|
33
|
+
private readonly options;
|
|
34
|
+
readonly sampleRate: number;
|
|
35
|
+
readonly numChannels = 1;
|
|
36
|
+
readonly audioFormat: ElevenLabsAudioFormat;
|
|
37
|
+
readonly frameSamples: number;
|
|
38
|
+
constructor(options: ElevenLabsEngineOptions);
|
|
39
|
+
beginUtterance(utteranceId: string): TtsUtterance;
|
|
40
|
+
close(): Promise<void>;
|
|
41
|
+
}
|
|
42
|
+
export type { WebSocket };
|
|
43
|
+
//# sourceMappingURL=elevenlabs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"elevenlabs.d.ts","sourceRoot":"","sources":["../../src/tts/elevenlabs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,SAAS,MAAM,2BAA2B,CAAC;AAGlD,OAAO,KAAK,EAAE,SAAS,EAAY,YAAY,EAAE,MAAM,YAAY,CAAC;AAKpE,MAAM,MAAM,qBAAqB,GAC7B,WAAW,GACX,WAAW,GACX,WAAW,GACX,WAAW,CAAC;AAchB,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,+EAA+E;IAC/E,WAAW,CAAC,EAAE,qBAAqB,CAAC;IACpC,6BAA6B;IAC7B,aAAa,CAAC,EAAE;QACd,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,eAAe,CAAC,EAAE,OAAO,CAAC;KAC3B,CAAC;CACH;AASD,qBAAa,gBAAiB,YAAW,SAAS;IAMpC,OAAO,CAAC,QAAQ,CAAC,OAAO;IALpC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,KAAgB;IACpC,QAAQ,CAAC,WAAW,EAAE,qBAAqB,CAAC;IAC5C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;gBAED,OAAO,EAAE,uBAAuB;IAM7D,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,YAAY;IAI3C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B;AA6OD,YAAY,EAAE,SAAS,EAAE,CAAC"}
|