@livekit/agents-plugin-elevenlabs 0.1.0 → 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.
- package/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +12 -0
- package/LICENSE +201 -0
- package/dist/models.d.ts +2 -1
- package/dist/models.d.ts.map +1 -1
- package/dist/tts.d.ts +17 -28
- package/dist/tts.d.ts.map +1 -1
- package/dist/tts.js +138 -180
- package/dist/tts.js.map +1 -1
- package/package.json +7 -7
- package/src/models.ts +12 -1
- package/src/tts.ts +160 -217
- package/tsconfig.json +6 -0
- package/tsconfig.tsbuildinfo +1 -0
package/dist/tts.js
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
var _a;
|
|
1
2
|
// SPDX-FileCopyrightText: 2024 LiveKit, Inc.
|
|
2
3
|
//
|
|
3
4
|
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
-
import { log, tts } from '@livekit/agents';
|
|
5
|
+
import { AsyncIterableQueue, log, tokenize, tts } from '@livekit/agents';
|
|
5
6
|
import { AudioFrame } from '@livekit/rtc-node';
|
|
6
|
-
import {
|
|
7
|
+
import { randomUUID } from 'node:crypto';
|
|
8
|
+
import { URL } from 'node:url';
|
|
7
9
|
import { WebSocket } from 'ws';
|
|
8
10
|
const DEFAULT_VOICE = {
|
|
9
11
|
id: 'EXAVITQu4vr4xnSDxMaL',
|
|
@@ -16,30 +18,34 @@ const DEFAULT_VOICE = {
|
|
|
16
18
|
use_speaker_boost: true,
|
|
17
19
|
},
|
|
18
20
|
};
|
|
19
|
-
const API_BASE_URL_V1 = 'https://api.elevenlabs.io/v1';
|
|
21
|
+
const API_BASE_URL_V1 = 'https://api.elevenlabs.io/v1/';
|
|
20
22
|
const AUTHORIZATION_HEADER = 'xi-api-key';
|
|
21
|
-
const
|
|
23
|
+
const defaultTTSOptions = {
|
|
24
|
+
apiKey: process.env.ELEVEN_API_KEY,
|
|
25
|
+
voice: DEFAULT_VOICE,
|
|
26
|
+
modelID: 'eleven_turbo_v2_5',
|
|
27
|
+
baseURL: API_BASE_URL_V1,
|
|
28
|
+
encoding: 'pcm_22050',
|
|
29
|
+
streamingLatency: 3,
|
|
30
|
+
wordTokenizer: new tokenize.basic.WordTokenizer(false),
|
|
31
|
+
chunkLengthSchedule: [],
|
|
32
|
+
enableSsmlParsing: false,
|
|
33
|
+
};
|
|
22
34
|
export class TTS extends tts.TTS {
|
|
23
|
-
|
|
24
|
-
constructor(
|
|
25
|
-
super(
|
|
26
|
-
|
|
27
|
-
|
|
35
|
+
#opts;
|
|
36
|
+
constructor(opts = defaultTTSOptions) {
|
|
37
|
+
super(sampleRateFromFormat(opts.encoding || defaultTTSOptions.encoding), 1, {
|
|
38
|
+
streaming: true,
|
|
39
|
+
});
|
|
40
|
+
if (opts.apiKey === undefined) {
|
|
28
41
|
throw new Error('ElevenLabs API key is required, whether as an argument or as $ELEVEN_API_KEY');
|
|
29
42
|
}
|
|
30
|
-
this
|
|
31
|
-
voice,
|
|
32
|
-
modelID,
|
|
33
|
-
apiKey,
|
|
34
|
-
baseURL: baseURL || API_BASE_URL_V1,
|
|
35
|
-
sampleRate,
|
|
36
|
-
latency,
|
|
37
|
-
};
|
|
43
|
+
this.#opts = { ...defaultTTSOptions, ...opts };
|
|
38
44
|
}
|
|
39
45
|
async listVoices() {
|
|
40
|
-
return fetch(this.
|
|
46
|
+
return fetch(this.#opts.baseURL + '/voices', {
|
|
41
47
|
headers: {
|
|
42
|
-
[AUTHORIZATION_HEADER]: this.
|
|
48
|
+
[AUTHORIZATION_HEADER]: this.#opts.apiKey,
|
|
43
49
|
},
|
|
44
50
|
})
|
|
45
51
|
.then((data) => data.json())
|
|
@@ -56,54 +62,67 @@ export class TTS extends tts.TTS {
|
|
|
56
62
|
return voices;
|
|
57
63
|
});
|
|
58
64
|
}
|
|
59
|
-
async synthesize(text) {
|
|
60
|
-
return new ChunkedStream(text, this.config);
|
|
61
|
-
}
|
|
62
65
|
stream() {
|
|
63
|
-
return new SynthesizeStream(this
|
|
66
|
+
return new SynthesizeStream(this.#opts);
|
|
64
67
|
}
|
|
65
68
|
}
|
|
66
69
|
export class SynthesizeStream extends tts.SynthesizeStream {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
queue = [];
|
|
72
|
-
eventQueue = [];
|
|
73
|
-
constructor(config) {
|
|
70
|
+
#opts;
|
|
71
|
+
#logger = log();
|
|
72
|
+
streamURL;
|
|
73
|
+
constructor(opts) {
|
|
74
74
|
super();
|
|
75
|
-
this
|
|
75
|
+
this.#opts = opts;
|
|
76
76
|
this.closed = false;
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
77
|
+
// add trailing slash to URL if needed
|
|
78
|
+
const baseURL = opts.baseURL + (opts.baseURL.endsWith('/') ? '' : '/');
|
|
79
|
+
this.streamURL = new URL(`text-to-speech/${opts.voice.id}/stream-input`, baseURL);
|
|
80
|
+
const params = {
|
|
81
|
+
model_id: opts.modelID,
|
|
82
|
+
output_format: opts.encoding,
|
|
83
|
+
optimize_streaming_latency: `${opts.streamingLatency}`,
|
|
84
|
+
enable_ssml_parsing: `${opts.enableSsmlParsing}`,
|
|
83
85
|
};
|
|
86
|
+
Object.entries(params).forEach(([k, v]) => this.streamURL.searchParams.append(k, v));
|
|
87
|
+
this.streamURL.protocol = this.streamURL.protocol.replace('http', 'ws');
|
|
88
|
+
this.#run();
|
|
89
|
+
}
|
|
90
|
+
async #run() {
|
|
91
|
+
const segments = new AsyncIterableQueue();
|
|
92
|
+
const tokenizeInput = async () => {
|
|
93
|
+
let stream = null;
|
|
94
|
+
for await (const text of this.input) {
|
|
95
|
+
if (text === _a.FLUSH_SENTINEL) {
|
|
96
|
+
if (stream) {
|
|
97
|
+
stream.close();
|
|
98
|
+
}
|
|
99
|
+
stream = null;
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
if (!stream) {
|
|
103
|
+
stream = this.#opts.wordTokenizer.stream();
|
|
104
|
+
segments.put(stream);
|
|
105
|
+
}
|
|
106
|
+
stream.pushText(text);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
segments.close();
|
|
110
|
+
};
|
|
111
|
+
const runStream = async () => {
|
|
112
|
+
for await (const stream of segments) {
|
|
113
|
+
await this.#runWS(stream);
|
|
114
|
+
this.queue.put(_a.END_OF_STREAM);
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
await Promise.all([tokenizeInput(), runStream()]);
|
|
118
|
+
this.close();
|
|
84
119
|
}
|
|
85
|
-
|
|
86
|
-
return `${this.config.baseURL}/text-to-speech/${this.config.voice.id}/stream-input?model_id=${this.config.modelID}&optimize_streaming_latency=${this.config.latency}`;
|
|
87
|
-
}
|
|
88
|
-
pushText(token) {
|
|
89
|
-
if (this.closed)
|
|
90
|
-
throw new Error('cannot push to a closed stream');
|
|
91
|
-
if (!token || token.length === 0)
|
|
92
|
-
return;
|
|
93
|
-
const splitters = '.,?!;:—-()[]} ';
|
|
94
|
-
this.text += token;
|
|
95
|
-
if (splitters.includes(token[token.length - 1])) {
|
|
96
|
-
this.queue.push(this.text);
|
|
97
|
-
this.text = '';
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
async run(maxRetry) {
|
|
120
|
+
async #runWS(stream, maxRetry = 3) {
|
|
101
121
|
let retries = 0;
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
headers: { [AUTHORIZATION_HEADER]: this.config.apiKey },
|
|
122
|
+
let ws;
|
|
123
|
+
while (true) {
|
|
124
|
+
ws = new WebSocket(this.streamURL, {
|
|
125
|
+
headers: { [AUTHORIZATION_HEADER]: this.#opts.apiKey },
|
|
107
126
|
});
|
|
108
127
|
try {
|
|
109
128
|
await new Promise((resolve, reject) => {
|
|
@@ -111,36 +130,7 @@ export class SynthesizeStream extends tts.SynthesizeStream {
|
|
|
111
130
|
ws.on('error', (error) => reject(error));
|
|
112
131
|
ws.on('close', (code) => reject(`WebSocket returned ${code}`));
|
|
113
132
|
});
|
|
114
|
-
|
|
115
|
-
let started = false;
|
|
116
|
-
const retryQueue = [];
|
|
117
|
-
const task = this.listenTask(ws);
|
|
118
|
-
while (ws.readyState !== ws.CLOSED) {
|
|
119
|
-
let text = undefined;
|
|
120
|
-
if (retryQueue.length === 0) {
|
|
121
|
-
text = this.queue.shift();
|
|
122
|
-
}
|
|
123
|
-
else {
|
|
124
|
-
text = retryQueue.shift();
|
|
125
|
-
}
|
|
126
|
-
if (!started) {
|
|
127
|
-
this.eventQueue.push(new tts.SynthesisEvent(tts.SynthesisEventType.STARTED));
|
|
128
|
-
started = true;
|
|
129
|
-
}
|
|
130
|
-
try {
|
|
131
|
-
ws.send(JSON.stringify({ text, try_trigger_generation: true }));
|
|
132
|
-
}
|
|
133
|
-
catch (e) {
|
|
134
|
-
// XI closes idle connections after a while.
|
|
135
|
-
retryQueue.push(text);
|
|
136
|
-
break;
|
|
137
|
-
}
|
|
138
|
-
if (text == STREAM_EOS) {
|
|
139
|
-
await task;
|
|
140
|
-
this.eventQueue.push(new tts.SynthesisEvent(tts.SynthesisEventType.FINISHED));
|
|
141
|
-
break;
|
|
142
|
-
}
|
|
143
|
-
}
|
|
133
|
+
break;
|
|
144
134
|
}
|
|
145
135
|
catch (e) {
|
|
146
136
|
if (retries >= maxRetry) {
|
|
@@ -148,104 +138,72 @@ export class SynthesizeStream extends tts.SynthesizeStream {
|
|
|
148
138
|
}
|
|
149
139
|
const delay = Math.min(retries * 5, 5);
|
|
150
140
|
retries++;
|
|
151
|
-
|
|
141
|
+
this.#logger.warn(`failed to connect to ElevenLabs, retrying in ${delay} seconds: ${e} (${retries}/${maxRetry})`);
|
|
152
142
|
await new Promise((resolve) => setTimeout(resolve, delay * 1000));
|
|
153
143
|
}
|
|
154
144
|
}
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
145
|
+
const requestId = randomUUID();
|
|
146
|
+
const segmentId = randomUUID();
|
|
147
|
+
ws.send(JSON.stringify({
|
|
148
|
+
text: ' ',
|
|
149
|
+
voice_settings: this.#opts.voice.settings,
|
|
150
|
+
try_trigger_generation: true,
|
|
151
|
+
chunk_length_schedule: this.#opts.chunkLengthSchedule,
|
|
152
|
+
}));
|
|
153
|
+
let eosSent = false;
|
|
154
|
+
const sendTask = async () => {
|
|
155
|
+
let xmlContent = [];
|
|
156
|
+
for await (const data of stream) {
|
|
157
|
+
let text = data.token;
|
|
158
|
+
if ((this.#opts.enableSsmlParsing && text.startsWith('<phoneme')) || xmlContent.length) {
|
|
159
|
+
xmlContent.push(text);
|
|
160
|
+
if (text.indexOf('</phoneme>') !== -1) {
|
|
161
|
+
text = xmlContent.join(' ');
|
|
162
|
+
xmlContent = [];
|
|
169
163
|
}
|
|
170
|
-
|
|
164
|
+
else {
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
ws.send(JSON.stringify({ text: text + ' ', try_trigger_generation: false }));
|
|
171
169
|
}
|
|
172
|
-
|
|
173
|
-
|
|
170
|
+
if (xmlContent.length) {
|
|
171
|
+
this.#logger.warn('ElevenLabs stream ended with incomplete XML content');
|
|
174
172
|
}
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
text;
|
|
206
|
-
queue = [];
|
|
207
|
-
constructor(text, config) {
|
|
208
|
-
super();
|
|
209
|
-
this.config = config;
|
|
210
|
-
this.text = text;
|
|
211
|
-
}
|
|
212
|
-
async next() {
|
|
213
|
-
await this.run();
|
|
214
|
-
const audio = this.queue.shift();
|
|
215
|
-
if (audio) {
|
|
216
|
-
return { done: false, value: audio };
|
|
217
|
-
}
|
|
218
|
-
else {
|
|
219
|
-
return { done: true, value: undefined };
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
async close() {
|
|
223
|
-
this.queue.push(undefined);
|
|
224
|
-
}
|
|
225
|
-
async run() {
|
|
226
|
-
const voice = this.config.voice;
|
|
227
|
-
const url = new URL(`${this.config.baseURL}/text-to-speech/${voice.id}/stream`);
|
|
228
|
-
url.searchParams.append('output_format', 'pcm_' + this.config.sampleRate);
|
|
229
|
-
url.searchParams.append('optimize_streaming_latency', this.config.latency.toString());
|
|
230
|
-
await fetch(url.toString(), {
|
|
231
|
-
method: 'POST',
|
|
232
|
-
headers: {
|
|
233
|
-
[AUTHORIZATION_HEADER]: this.config.apiKey,
|
|
234
|
-
'Content-Type': 'application/json',
|
|
235
|
-
},
|
|
236
|
-
body: JSON.stringify({
|
|
237
|
-
text: this.text,
|
|
238
|
-
model_id: this.config.modelID,
|
|
239
|
-
voice_settings: this.config.voice.settings || undefined,
|
|
240
|
-
}),
|
|
241
|
-
})
|
|
242
|
-
.then((data) => data.arrayBuffer())
|
|
243
|
-
.then((data) => new DataView(data, 0, data.byteLength))
|
|
244
|
-
.then((data) => this.queue.push({
|
|
245
|
-
text: this.text,
|
|
246
|
-
data: new AudioFrame(new Uint16Array(data.buffer), this.config.sampleRate, 1, data.byteLength / 2),
|
|
247
|
-
}, undefined))
|
|
248
|
-
.catch(() => this.queue.push(undefined));
|
|
173
|
+
ws.send(JSON.stringify({ text: '' }));
|
|
174
|
+
eosSent = true;
|
|
175
|
+
};
|
|
176
|
+
const listenTask = async () => {
|
|
177
|
+
while (!this.closed) {
|
|
178
|
+
try {
|
|
179
|
+
await new Promise((resolve, reject) => {
|
|
180
|
+
ws.removeAllListeners();
|
|
181
|
+
ws.on('message', (data) => resolve(data));
|
|
182
|
+
ws.on('close', (code, reason) => {
|
|
183
|
+
if (!eosSent) {
|
|
184
|
+
this.#logger.error(`WebSocket closed with code ${code}: ${reason}`);
|
|
185
|
+
}
|
|
186
|
+
reject();
|
|
187
|
+
});
|
|
188
|
+
}).then((msg) => {
|
|
189
|
+
const json = JSON.parse(msg.toString());
|
|
190
|
+
if ('audio' in json) {
|
|
191
|
+
const data = new Int16Array(Buffer.from(json.audio, 'base64').buffer);
|
|
192
|
+
const frame = new AudioFrame(data, sampleRateFromFormat(this.#opts.encoding), 1, data.length);
|
|
193
|
+
this.queue.put({ requestId, segmentId, frame });
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
break;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
};
|
|
202
|
+
await Promise.all([sendTask(), listenTask()]);
|
|
249
203
|
}
|
|
250
204
|
}
|
|
205
|
+
_a = SynthesizeStream;
|
|
206
|
+
const sampleRateFromFormat = (encoding) => {
|
|
207
|
+
return Number(encoding.split('_')[1]);
|
|
208
|
+
};
|
|
251
209
|
//# sourceMappingURL=tts.js.map
|
package/dist/tts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tts.js","sourceRoot":"","sources":["../src/tts.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,EAAE;AACF,sCAAsC;AACtC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"tts.js","sourceRoot":"","sources":["../src/tts.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@livekit/agents-plugin-elevenlabs",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "ElevenLabs plugin for LiveKit Node Agents",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
|
-
"author": "
|
|
7
|
+
"author": "LiveKit",
|
|
8
8
|
"type": "module",
|
|
9
9
|
"devDependencies": {
|
|
10
10
|
"@microsoft/api-extractor": "^7.35.0",
|
|
11
|
-
"@types/ws": "^8.5.10"
|
|
12
|
-
},
|
|
13
|
-
"peerDependencies": {
|
|
11
|
+
"@types/ws": "^8.5.10",
|
|
14
12
|
"typescript": "^5.0.0"
|
|
15
13
|
},
|
|
16
14
|
"dependencies": {
|
|
17
|
-
"@livekit/rtc-node": "^0.1
|
|
15
|
+
"@livekit/rtc-node": "^0.11.1",
|
|
18
16
|
"ws": "^8.16.0",
|
|
19
|
-
"@livekit/agents": "0.
|
|
17
|
+
"@livekit/agents": "0.4.0"
|
|
20
18
|
},
|
|
21
19
|
"scripts": {
|
|
22
20
|
"build": "tsc",
|
|
21
|
+
"clean": "rm -rf dist",
|
|
22
|
+
"clean:build": "pnpm clean && pnpm build",
|
|
23
23
|
"lint": "eslint -f unix \"src/**/*.{ts,js}\"",
|
|
24
24
|
"api:check": "api-extractor run --typescript-compiler-folder ../../node_modules/typescript",
|
|
25
25
|
"api:update": "api-extractor run --local --typescript-compiler-folder ../../node_modules/typescript --verbose"
|
package/src/models.ts
CHANGED
|
@@ -6,4 +6,15 @@ export type TTSModels =
|
|
|
6
6
|
| 'eleven_monolingual_v1'
|
|
7
7
|
| 'eleven_multilingual_v1'
|
|
8
8
|
| 'eleven_multilingual_v2'
|
|
9
|
-
| 'eleven_turbo_v2'
|
|
9
|
+
| 'eleven_turbo_v2'
|
|
10
|
+
| 'eleven_turbo_v2_5';
|
|
11
|
+
|
|
12
|
+
export type TTSEncoding =
|
|
13
|
+
// XXX(nbsp): MP3 is not yet supported
|
|
14
|
+
// | 'mp3_22050_32'
|
|
15
|
+
// | 'mp3_44100_32'
|
|
16
|
+
// | 'mp3_44100_64'
|
|
17
|
+
// | 'mp3_44100_96'
|
|
18
|
+
// | 'mp3_44100_128'
|
|
19
|
+
// | 'mp3_44100_192'
|
|
20
|
+
'pcm_16000' | 'pcm_22050' | 'pcm_44100';
|