@mastra/voice-speechify 0.14.0 → 0.14.1-alpha.1

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/dist/index.cjs CHANGED
@@ -1,1073 +1,1173 @@
1
- 'use strict';
2
-
3
- var stream = require('stream');
4
- var apiSdk = require('@speechify/api-sdk');
5
-
6
- // src/index.ts
7
-
8
- // ../../packages/_internal-core/dist/chunk-3M4SEWMI.js
9
- var RegisteredLogger = {
10
- LLM: "LLM"};
11
- var LogLevel = {
12
- DEBUG: "debug",
13
- INFO: "info",
14
- WARN: "warn",
15
- ERROR: "error"};
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ let stream = require("stream");
3
+ let _speechify_api_sdk = require("@speechify/api-sdk");
4
+ //#region ../../packages/_internal-core/dist/logger/index.js
5
+ /**
6
+ * Export a tracked exception through the adapter sink, mirroring the
7
+ * DualLogger dual-write shape (`errorId`/`domain`/`category`/`details`/`cause`
8
+ * when present on a MastraError-like value). Never throws into the caller.
9
+ */
10
+ function exportTrackedException(ctx, error, metadata) {
11
+ if (!ctx?.options.export) return;
12
+ try {
13
+ const mastraError = error;
14
+ ctx.getLogSink()?.error(error.message, {
15
+ ...mastraError.id !== void 0 ? { errorId: mastraError.id } : {},
16
+ ...mastraError.domain !== void 0 ? { domain: mastraError.domain } : {},
17
+ ...mastraError.category !== void 0 ? { category: mastraError.category } : {},
18
+ ...mastraError.details !== void 0 ? { details: mastraError.details } : {},
19
+ ...error.cause instanceof Error ? { cause: error.cause.message } : {},
20
+ ...metadata
21
+ });
22
+ } catch {}
23
+ }
24
+ /**
25
+ * Adapt IMastraLogger's variadic args into the structured `data` payload of
26
+ * an exported log record. Extracts the first plain object as data,
27
+ * serializes an Error arg, and collects remaining primitives under `args`
28
+ * so the derived record preserves all context from the native call.
29
+ */
30
+ function buildLogRecordData(args) {
31
+ const objectData = args.find((arg) => arg !== null && typeof arg === "object" && !Array.isArray(arg) && !(arg instanceof Error));
32
+ const errorArg = args.find((arg) => arg instanceof Error);
33
+ const extraArgs = args.filter((arg) => arg !== objectData && arg !== errorArg);
34
+ if (!objectData && !errorArg && extraArgs.length === 0) return void 0;
35
+ return {
36
+ ...objectData ?? {},
37
+ ...errorArg ? { error: {
38
+ name: errorArg.name,
39
+ message: errorArg.message,
40
+ stack: errorArg.stack
41
+ } } : {},
42
+ ...extraArgs.length > 0 ? { args: extraArgs } : {}
43
+ };
44
+ }
45
+ const RegisteredLogger = {
46
+ AGENT: "AGENT",
47
+ OBSERVABILITY: "OBSERVABILITY",
48
+ AUTH: "AUTH",
49
+ BROWSER: "BROWSER",
50
+ NETWORK: "NETWORK",
51
+ WORKFLOW: "WORKFLOW",
52
+ LLM: "LLM",
53
+ TTS: "TTS",
54
+ VOICE: "VOICE",
55
+ VECTOR: "VECTOR",
56
+ BUNDLER: "BUNDLER",
57
+ DEPLOYER: "DEPLOYER",
58
+ MEMORY: "MEMORY",
59
+ STORAGE: "STORAGE",
60
+ EMBEDDINGS: "EMBEDDINGS",
61
+ MCP_SERVER: "MCP_SERVER",
62
+ SERVER_CACHE: "SERVER_CACHE",
63
+ SERVER: "SERVER",
64
+ WORKSPACE: "WORKSPACE",
65
+ CHANNEL: "CHANNEL"
66
+ };
67
+ const LogLevel = {
68
+ DEBUG: "debug",
69
+ INFO: "info",
70
+ WARN: "warn",
71
+ ERROR: "error",
72
+ NONE: "silent"
73
+ };
16
74
  var MastraLogger = class {
17
- name;
18
- level;
19
- transports;
20
- constructor(options = {}) {
21
- this.name = options.name || "Mastra";
22
- this.level = options.level || LogLevel.ERROR;
23
- this.transports = new Map(Object.entries(options.transports || {}));
24
- }
25
- getTransports() {
26
- return this.transports;
27
- }
28
- trackException(_error, _metadata) {
29
- }
30
- async listLogs(transportId, params) {
31
- if (!transportId || !this.transports.has(transportId)) {
32
- return { logs: [], total: 0, page: params?.page ?? 1, perPage: params?.perPage ?? 100, hasMore: false };
33
- }
34
- return this.transports.get(transportId).listLogs?.(params) ?? {
35
- logs: [],
36
- total: 0,
37
- page: params?.page ?? 1,
38
- perPage: params?.perPage ?? 100,
39
- hasMore: false
40
- };
41
- }
42
- async listLogsByRunId({
43
- transportId,
44
- runId,
45
- fromDate,
46
- toDate,
47
- logLevel,
48
- filters,
49
- page,
50
- perPage
51
- }) {
52
- if (!transportId || !this.transports.has(transportId) || !runId) {
53
- return { logs: [], total: 0, page: page ?? 1, perPage: perPage ?? 100, hasMore: false };
54
- }
55
- return this.transports.get(transportId).listLogsByRunId?.({ runId, fromDate, toDate, logLevel, filters, page, perPage }) ?? {
56
- logs: [],
57
- total: 0,
58
- page: page ?? 1,
59
- perPage: perPage ?? 100,
60
- hasMore: false
61
- };
62
- }
75
+ name;
76
+ level;
77
+ transports;
78
+ constructor(options = {}) {
79
+ this.name = options.name || "Mastra";
80
+ this.level = options.level || LogLevel.ERROR;
81
+ this.transports = new Map(Object.entries(options.transports || {}));
82
+ }
83
+ getTransports() {
84
+ return this.transports;
85
+ }
86
+ trackException(_error, _metadata) {}
87
+ async listLogs(transportId, params) {
88
+ if (!transportId || !this.transports.has(transportId)) return {
89
+ logs: [],
90
+ total: 0,
91
+ page: params?.page ?? 1,
92
+ perPage: params?.perPage ?? 100,
93
+ hasMore: false
94
+ };
95
+ return this.transports.get(transportId).listLogs?.(params) ?? {
96
+ logs: [],
97
+ total: 0,
98
+ page: params?.page ?? 1,
99
+ perPage: params?.perPage ?? 100,
100
+ hasMore: false
101
+ };
102
+ }
103
+ async listLogsByRunId({ transportId, runId, fromDate, toDate, logLevel, filters, page, perPage }) {
104
+ if (!transportId || !this.transports.has(transportId) || !runId) return {
105
+ logs: [],
106
+ total: 0,
107
+ page: page ?? 1,
108
+ perPage: perPage ?? 100,
109
+ hasMore: false
110
+ };
111
+ return this.transports.get(transportId).listLogsByRunId?.({
112
+ runId,
113
+ fromDate,
114
+ toDate,
115
+ logLevel,
116
+ filters,
117
+ page,
118
+ perPage
119
+ }) ?? {
120
+ logs: [],
121
+ total: 0,
122
+ page: page ?? 1,
123
+ perPage: perPage ?? 100,
124
+ hasMore: false
125
+ };
126
+ }
63
127
  };
64
- var ConsoleLogger = class _ConsoleLogger extends MastraLogger {
65
- component;
66
- filter;
67
- constructor(options = {}) {
68
- super(options);
69
- this.component = options.component;
70
- this.filter = options.filter;
71
- }
72
- child(componentOrBindings) {
73
- const component = typeof componentOrBindings === "string" ? componentOrBindings : componentOrBindings?.component ?? this.component;
74
- return new _ConsoleLogger({
75
- name: this.name,
76
- level: this.level,
77
- component,
78
- filter: this.filter
79
- });
80
- }
81
- shouldLog(level, message, args) {
82
- if (!this.filter) return true;
83
- try {
84
- return this.filter({ component: this.component, level, message, args });
85
- } catch (e) {
86
- console.error(`[Logger] Filter error for component=${this.component} level=${level}:`, e);
87
- return true;
88
- }
89
- }
90
- prefix() {
91
- return this.component ? `[${this.component}] ` : "";
92
- }
93
- debug(message, ...args) {
94
- if (this.level === LogLevel.DEBUG && this.shouldLog(LogLevel.DEBUG, message, args)) {
95
- console.info(`${this.prefix()}${message}`, ...args);
96
- }
97
- }
98
- info(message, ...args) {
99
- if ((this.level === LogLevel.INFO || this.level === LogLevel.DEBUG) && this.shouldLog(LogLevel.INFO, message, args)) {
100
- console.info(`${this.prefix()}${message}`, ...args);
101
- }
102
- }
103
- warn(message, ...args) {
104
- if ((this.level === LogLevel.WARN || this.level === LogLevel.INFO || this.level === LogLevel.DEBUG) && this.shouldLog(LogLevel.WARN, message, args)) {
105
- console.warn(`${this.prefix()}${message}`, ...args);
106
- }
107
- }
108
- error(message, ...args) {
109
- if ((this.level === LogLevel.ERROR || this.level === LogLevel.WARN || this.level === LogLevel.INFO || this.level === LogLevel.DEBUG) && this.shouldLog(LogLevel.ERROR, message, args)) {
110
- console.error(`${this.prefix()}${message}`, ...args);
111
- }
112
- }
113
- async listLogs(_transportId, _params) {
114
- return { logs: [], total: 0, page: _params?.page ?? 1, perPage: _params?.perPage ?? 100, hasMore: false };
115
- }
116
- async listLogsByRunId(_args) {
117
- return { logs: [], total: 0, page: _args.page ?? 1, perPage: _args.perPage ?? 100, hasMore: false };
118
- }
128
+ var ConsoleLogger = class ConsoleLogger extends MastraLogger {
129
+ component;
130
+ filter;
131
+ #adapterContext;
132
+ constructor(options = {}) {
133
+ super(options);
134
+ this.component = options.component;
135
+ this.filter = options.filter;
136
+ }
137
+ /**
138
+ * Adapter hook (see `AdaptableLogger`): enables native trace correlation
139
+ * (trace_id/span_id appended to console output) and observability export
140
+ * derived from the same record. Called by Mastra during setup.
141
+ */
142
+ __attachObservability(ctx) {
143
+ this.#adapterContext = ctx;
144
+ }
145
+ child(componentOrBindings) {
146
+ const component = typeof componentOrBindings === "string" ? componentOrBindings : componentOrBindings?.component ?? this.component;
147
+ const child = new ConsoleLogger({
148
+ name: this.name,
149
+ level: this.level,
150
+ component,
151
+ filter: this.filter
152
+ });
153
+ if (this.#adapterContext) child.__attachObservability(this.#adapterContext);
154
+ return child;
155
+ }
156
+ /**
157
+ * Native-record correlation: when a span is active, append the trace
158
+ * fields object to the console args so every destination sees them.
159
+ */
160
+ #correlate(args) {
161
+ const ctx = this.#adapterContext;
162
+ if (!ctx?.options.correlation) return args;
163
+ try {
164
+ const fields = ctx.resolveTraceFields();
165
+ return fields ? [...args, fields] : args;
166
+ } catch {
167
+ return args;
168
+ }
169
+ }
170
+ /**
171
+ * Export the record derived from the same native call to observability.
172
+ * Mirrors DualLogger semantics: export is independent of the console
173
+ * level filter, and never throws into the caller.
174
+ */
175
+ #export(level, message, args) {
176
+ const ctx = this.#adapterContext;
177
+ if (!ctx?.options.export) return;
178
+ try {
179
+ ctx.getLogSink()?.[level](message, buildLogRecordData(args));
180
+ } catch {}
181
+ }
182
+ shouldLog(level, message, args) {
183
+ if (!this.filter) return true;
184
+ try {
185
+ return this.filter({
186
+ component: this.component,
187
+ level,
188
+ message,
189
+ args
190
+ });
191
+ } catch (e) {
192
+ console.error(`[Logger] Filter error for component=${this.component} level=${level}:`, e);
193
+ return true;
194
+ }
195
+ }
196
+ prefix() {
197
+ return this.component ? `[${this.component}] ` : "";
198
+ }
199
+ debug(message, ...args) {
200
+ if (this.level === LogLevel.DEBUG && this.shouldLog(LogLevel.DEBUG, message, args)) console.info(`${this.prefix()}${message}`, ...this.#correlate(args));
201
+ this.#export("debug", message, args);
202
+ }
203
+ info(message, ...args) {
204
+ if ((this.level === LogLevel.INFO || this.level === LogLevel.DEBUG) && this.shouldLog(LogLevel.INFO, message, args)) console.info(`${this.prefix()}${message}`, ...this.#correlate(args));
205
+ this.#export("info", message, args);
206
+ }
207
+ warn(message, ...args) {
208
+ if ((this.level === LogLevel.WARN || this.level === LogLevel.INFO || this.level === LogLevel.DEBUG) && this.shouldLog(LogLevel.WARN, message, args)) console.warn(`${this.prefix()}${message}`, ...this.#correlate(args));
209
+ this.#export("warn", message, args);
210
+ }
211
+ error(message, ...args) {
212
+ if ((this.level === LogLevel.ERROR || this.level === LogLevel.WARN || this.level === LogLevel.INFO || this.level === LogLevel.DEBUG) && this.shouldLog(LogLevel.ERROR, message, args)) console.error(`${this.prefix()}${message}`, ...this.#correlate(args));
213
+ this.#export("error", message, args);
214
+ }
215
+ trackException(error, metadata) {
216
+ exportTrackedException(this.#adapterContext, error, metadata);
217
+ }
218
+ async listLogs(_transportId, _params) {
219
+ return {
220
+ logs: [],
221
+ total: 0,
222
+ page: _params?.page ?? 1,
223
+ perPage: _params?.perPage ?? 100,
224
+ hasMore: false
225
+ };
226
+ }
227
+ async listLogsByRunId(_args) {
228
+ return {
229
+ logs: [],
230
+ total: 0,
231
+ page: _args.page ?? 1,
232
+ perPage: _args.perPage ?? 100,
233
+ hasMore: false
234
+ };
235
+ }
119
236
  };
120
-
121
- // ../../packages/_internal-core/dist/base/index.js
237
+ //#endregion
238
+ //#region ../../packages/_internal-core/dist/base/index.js
122
239
  var MastraBase = class {
123
- component = RegisteredLogger.LLM;
124
- logger;
125
- name;
126
- #rawConfig;
127
- constructor({
128
- component,
129
- name,
130
- rawConfig
131
- }) {
132
- this.component = component || RegisteredLogger.LLM;
133
- this.name = name;
134
- this.#rawConfig = rawConfig;
135
- this.logger = new ConsoleLogger({ name: `${this.component} - ${this.name}` });
136
- }
137
- /**
138
- * Returns the raw storage configuration this primitive was created from,
139
- * or undefined if it was created from code.
140
- */
141
- toRawConfig() {
142
- return this.#rawConfig;
143
- }
144
- /**
145
- * Sets the raw storage configuration for this primitive.
146
- * @internal
147
- */
148
- __setRawConfig(rawConfig) {
149
- this.#rawConfig = rawConfig;
150
- }
151
- /**
152
- * Set the logger for the agent
153
- * @param logger
154
- */
155
- __setLogger(logger) {
156
- this.logger = "child" in logger && typeof logger.child === "function" ? logger.child({ component: this.component }) : logger;
157
- }
240
+ component = RegisteredLogger.LLM;
241
+ logger;
242
+ name;
243
+ #rawConfig;
244
+ constructor({ component, name, rawConfig }) {
245
+ this.component = component || RegisteredLogger.LLM;
246
+ this.name = name;
247
+ this.#rawConfig = rawConfig;
248
+ this.logger = new ConsoleLogger({ name: `${this.component} - ${this.name}` });
249
+ }
250
+ /**
251
+ * Returns the raw storage configuration this primitive was created from,
252
+ * or undefined if it was created from code.
253
+ */
254
+ toRawConfig() {
255
+ return this.#rawConfig;
256
+ }
257
+ /**
258
+ * Sets the raw storage configuration for this primitive.
259
+ * @internal
260
+ */
261
+ __setRawConfig(rawConfig) {
262
+ this.#rawConfig = rawConfig;
263
+ }
264
+ /**
265
+ * Set the logger for the agent
266
+ * @param logger
267
+ */
268
+ __setLogger(logger) {
269
+ this.logger = "child" in logger && typeof logger.child === "function" ? logger.child({ component: this.component }) : logger;
270
+ }
158
271
  };
159
-
160
- // ../../packages/_internals/voice/dist/chunk-NWNKSBZV.js
272
+ //#endregion
273
+ //#region ../../packages/_internals/voice/dist/aisdk-C_K-VCwq.js
161
274
  var MastraVoice = class extends MastraBase {
162
- listeningModel;
163
- speechModel;
164
- speaker;
165
- realtimeConfig;
166
- constructor({ listeningModel, speechModel, speaker, realtimeConfig, name } = {}) {
167
- super({
168
- component: "VOICE",
169
- name
170
- });
171
- this.listeningModel = listeningModel;
172
- this.speechModel = speechModel;
173
- this.speaker = speaker;
174
- this.realtimeConfig = realtimeConfig;
175
- }
176
- /**
177
- * Custom serialization for tracing/observability spans.
178
- * Excludes `apiKey` from listeningModel / speechModel / realtimeConfig
179
- * and any provider-specific state held by subclasses. Subclasses that
180
- * need to expose additional non-sensitive fields can override.
181
- */
182
- serializeForSpan() {
183
- return {
184
- component: "VOICE",
185
- name: this.name,
186
- speaker: this.speaker,
187
- listeningModel: this.listeningModel ? { name: this.listeningModel.name } : void 0,
188
- speechModel: this.speechModel ? { name: this.speechModel.name } : void 0,
189
- realtimeModel: this.realtimeConfig?.model
190
- };
191
- }
192
- updateConfig(_options) {
193
- this.logger.debug("updateConfig not implemented by this voice provider");
194
- }
195
- /**
196
- * Initializes a WebSocket or WebRTC connection for real-time communication
197
- * @returns Promise that resolves when the connection is established
198
- */
199
- async connect(_options) {
200
- this.logger.debug("connect not implemented by this voice provider");
201
- }
202
- /**
203
- * Relay audio data to the voice provider for real-time processing
204
- * @param audioData Audio data to relay
205
- */
206
- async send(_audioData) {
207
- this.logger.debug("relay not implemented by this voice provider");
208
- }
209
- /**
210
- * Trigger voice providers to respond
211
- */
212
- async answer(_options) {
213
- this.logger.debug("answer not implemented by this voice provider");
214
- }
215
- /**
216
- * Equip the voice provider with instructions
217
- * @param instructions Instructions to add
218
- */
219
- addInstructions(_instructions) {
220
- }
221
- /**
222
- * Equip the voice provider with tools
223
- * @param tools Array of tools to add
224
- */
225
- addTools(_tools) {
226
- }
227
- /**
228
- * Disconnect from the WebSocket or WebRTC connection
229
- */
230
- close() {
231
- this.logger.debug("close not implemented by this voice provider");
232
- }
233
- /**
234
- * Register an event listener
235
- * @param event Event name (e.g., 'speaking', 'writing', 'error')
236
- * @param callback Callback function that receives event data
237
- */
238
- on(_event, _callback) {
239
- this.logger.debug("on not implemented by this voice provider");
240
- }
241
- /**
242
- * Remove an event listener
243
- * @param event Event name (e.g., 'speaking', 'writing', 'error')
244
- * @param callback Callback function to remove
245
- */
246
- off(_event, _callback) {
247
- this.logger.debug("off not implemented by this voice provider");
248
- }
249
- /**
250
- * Get available speakers/voices
251
- * @returns Array of available voice IDs and their metadata
252
- */
253
- getSpeakers() {
254
- this.logger.debug("getSpeakers not implemented by this voice provider");
255
- return Promise.resolve([]);
256
- }
257
- /**
258
- * Get available speakers/voices
259
- * @returns Array of available voice IDs and their metadata
260
- */
261
- getListener() {
262
- this.logger.debug("getListener not implemented by this voice provider");
263
- return Promise.resolve({ enabled: false });
264
- }
275
+ listeningModel;
276
+ speechModel;
277
+ speaker;
278
+ realtimeConfig;
279
+ constructor({ listeningModel, speechModel, speaker, realtimeConfig, name } = {}) {
280
+ super({
281
+ component: "VOICE",
282
+ name
283
+ });
284
+ this.listeningModel = listeningModel;
285
+ this.speechModel = speechModel;
286
+ this.speaker = speaker;
287
+ this.realtimeConfig = realtimeConfig;
288
+ }
289
+ /**
290
+ * Custom serialization for tracing/observability spans.
291
+ * Excludes `apiKey` from listeningModel / speechModel / realtimeConfig
292
+ * and any provider-specific state held by subclasses. Subclasses that
293
+ * need to expose additional non-sensitive fields can override.
294
+ */
295
+ serializeForSpan() {
296
+ return {
297
+ component: "VOICE",
298
+ name: this.name,
299
+ speaker: this.speaker,
300
+ listeningModel: this.listeningModel ? { name: this.listeningModel.name } : void 0,
301
+ speechModel: this.speechModel ? { name: this.speechModel.name } : void 0,
302
+ realtimeModel: this.realtimeConfig?.model
303
+ };
304
+ }
305
+ updateConfig(_options) {
306
+ this.logger.debug("updateConfig not implemented by this voice provider");
307
+ }
308
+ /**
309
+ * Initializes a WebSocket or WebRTC connection for real-time communication
310
+ * @returns Promise that resolves when the connection is established
311
+ */
312
+ async connect(_options) {
313
+ this.logger.debug("connect not implemented by this voice provider");
314
+ }
315
+ /**
316
+ * Relay audio data to the voice provider for real-time processing
317
+ * @param audioData Audio data to relay
318
+ */
319
+ async send(_audioData) {
320
+ this.logger.debug("relay not implemented by this voice provider");
321
+ }
322
+ /**
323
+ * Trigger voice providers to respond
324
+ */
325
+ async answer(_options) {
326
+ this.logger.debug("answer not implemented by this voice provider");
327
+ }
328
+ /**
329
+ * Equip the voice provider with instructions
330
+ * @param instructions Instructions to add
331
+ */
332
+ addInstructions(_instructions) {}
333
+ /**
334
+ * Equip the voice provider with tools
335
+ * @param tools Array of tools to add
336
+ */
337
+ addTools(_tools) {}
338
+ /**
339
+ * Disconnect from the WebSocket or WebRTC connection
340
+ */
341
+ close() {
342
+ this.logger.debug("close not implemented by this voice provider");
343
+ }
344
+ /**
345
+ * Register an event listener
346
+ * @param event Event name (e.g., 'speaking', 'writing', 'error')
347
+ * @param callback Callback function that receives event data
348
+ */
349
+ on(_event, _callback) {
350
+ this.logger.debug("on not implemented by this voice provider");
351
+ }
352
+ /**
353
+ * Remove an event listener
354
+ * @param event Event name (e.g., 'speaking', 'writing', 'error')
355
+ * @param callback Callback function to remove
356
+ */
357
+ off(_event, _callback) {
358
+ this.logger.debug("off not implemented by this voice provider");
359
+ }
360
+ /**
361
+ * Get available speakers/voices
362
+ * @returns Array of available voice IDs and their metadata
363
+ */
364
+ getSpeakers() {
365
+ this.logger.debug("getSpeakers not implemented by this voice provider");
366
+ return Promise.resolve([]);
367
+ }
368
+ /**
369
+ * Get available speakers/voices
370
+ * @returns Array of available voice IDs and their metadata
371
+ */
372
+ getListener() {
373
+ this.logger.debug("getListener not implemented by this voice provider");
374
+ return Promise.resolve({ enabled: false });
375
+ }
265
376
  };
266
-
267
- // src/voices.ts
268
- var SIMBA_3_VOICES = [
269
- "beatrice_32",
270
- "dominic_32",
271
- "edmund_32",
272
- "geffen_32",
273
- "harper_32",
274
- "hugh_32",
275
- "imogen_32",
276
- "wyatt_32"
377
+ //#endregion
378
+ //#region src/voices.ts
379
+ /**
380
+ * Curated voices served by the Simba 3 generation models (`simba-3.0` and
381
+ * `simba-3.2`). The classic catalog voices in `SPEECHIFY_VOICES` are not
382
+ * served by those models and return an error. `simba-3.2` additionally
383
+ * accepts cloned voices manually approved by Speechify.
384
+ */
385
+ const SIMBA_3_VOICES = [
386
+ "beatrice_32",
387
+ "dominic_32",
388
+ "edmund_32",
389
+ "geffen_32",
390
+ "harper_32",
391
+ "hugh_32",
392
+ "imogen_32",
393
+ "wyatt_32"
277
394
  ];
278
- var SPEECHIFY_VOICES = [
279
- "henry",
280
- "bwyneth",
281
- "carly",
282
- "kristy",
283
- "oliver",
284
- "tasha",
285
- "joe",
286
- "lisa",
287
- "george",
288
- "emily",
289
- "rob",
290
- "russell",
291
- "benjamin",
292
- "michael",
293
- "kim",
294
- "ankit",
295
- "arun",
296
- "carol",
297
- "helen",
298
- "julie",
299
- "linda",
300
- "mark",
301
- "nick",
302
- "elijah",
303
- "beverly",
304
- "collin",
305
- "erin",
306
- "jack",
307
- "jesse",
308
- "ken",
309
- "lindsey",
310
- "monica",
311
- "phil",
312
- "ron",
313
- "stacy",
314
- "archie",
315
- "evelyn",
316
- "freddie",
317
- "harper",
318
- "jacob",
319
- "james",
320
- "mason",
321
- "victoria",
322
- "christina",
323
- "douglas",
324
- "lauren",
325
- "patricia",
326
- "jennifer",
327
- "robert",
328
- "peter",
329
- "jeremy",
330
- "barbara",
331
- "susan",
332
- "charles",
333
- "harold",
334
- "sarah",
335
- "karen",
336
- "anthony",
337
- "donald",
338
- "paul",
339
- "steven",
340
- "andrew",
341
- "kenneth",
342
- "joshua",
343
- "betty",
344
- "margaret",
345
- "kyle",
346
- "edward",
347
- "ronald",
348
- "timothy",
349
- "sandra",
350
- "dorothy",
351
- "jeffrey",
352
- "kimberly",
353
- "donna",
354
- "walter",
355
- "megan",
356
- "richard",
357
- "amanda",
358
- "melissa",
359
- "deborah",
360
- "gary",
361
- "rebecca",
362
- "sharon",
363
- "cynthia",
364
- "kathleen",
365
- "joan",
366
- "shirley",
367
- "angela",
368
- "anna",
369
- "brenda",
370
- "larry",
371
- "keith",
372
- "scott",
373
- "pamela",
374
- "samuel",
375
- "gregory",
376
- "samantha",
377
- "katherine",
378
- "christine",
379
- "frank",
380
- "alexander",
381
- "raymond",
382
- "debra",
383
- "patrick",
384
- "catherine",
385
- "carolyn",
386
- "janet",
387
- "ruth",
388
- "zachary",
389
- "heather",
390
- "diane",
391
- "dennis",
392
- "jerry",
393
- "tyler",
394
- "aaron",
395
- "virginia",
396
- "joyce",
397
- "judith",
398
- "kelly",
399
- "nathan",
400
- "terry",
401
- "carl",
402
- "gerald",
403
- "jaqueline",
404
- "cheryl",
405
- "christian",
406
- "rohit",
407
- "gloria",
408
- "arthur",
409
- "austin",
410
- "sean",
411
- "martha",
412
- "randy",
413
- "ralph",
414
- "roy",
415
- "alan",
416
- "logan",
417
- "willie",
418
- "kathryn",
419
- "frances",
420
- "madison",
421
- "bruce",
422
- "billy",
423
- "jordan",
424
- "bryan",
425
- "dylan",
426
- "vincent",
427
- "eugene",
428
- "janice",
429
- "jean",
430
- "abigail",
431
- "alice",
432
- "bobby",
433
- "julia",
434
- "johnny",
435
- "judy",
436
- "bradley",
437
- "hunter",
438
- "dale",
439
- "howard",
440
- "fred",
441
- "danielle",
442
- "marilyn",
443
- "blake",
444
- "doris",
445
- "denise",
446
- "issac",
447
- "theresa",
448
- "natalie",
449
- "aiden",
450
- "brittany",
451
- "charlotte",
452
- "marie",
453
- "kayla",
454
- "alexis",
455
- "lori",
456
- "landon",
457
- "tiffany",
458
- "marcus",
459
- "martin",
460
- "curtis",
461
- "kathy",
462
- "todd",
463
- "leonard",
464
- "calvin",
465
- "rose",
466
- "ava",
467
- "bonnie",
468
- "peggy",
469
- "edwin",
470
- "don",
471
- "ruby",
472
- "crystal",
473
- "craig",
474
- "norma",
475
- "paula",
476
- "annie",
477
- "shawn",
478
- "lillian",
479
- "robin",
480
- "evan",
481
- "garrette",
482
- "francis",
483
- "danny",
484
- "stanley",
485
- "lucy",
486
- "jeffery",
487
- "herbert",
488
- "lee",
489
- "april",
490
- "anne",
491
- "tammy",
492
- "trevor",
493
- "eleanor",
494
- "regina",
495
- "carrie",
496
- "leah",
497
- "beth",
498
- "cody",
499
- "shane",
500
- "dana",
501
- "allison",
502
- "dawn",
503
- "julian",
504
- "wendy",
505
- "travis",
506
- "florence",
507
- "tracy",
508
- "adrian",
509
- "phillis",
510
- "carole",
511
- "mildred",
512
- "cameron",
513
- "chad",
514
- "connie",
515
- "gladys",
516
- "arlene",
517
- "jana",
518
- "leona",
519
- "miriam",
520
- "lorrie",
521
- "velma",
522
- "eduardo",
523
- "bennie",
524
- "rene",
525
- "ed",
526
- "stuart",
527
- "terrence",
528
- "delbert",
529
- "colin",
530
- "susanne",
531
- "hugo",
532
- "ignacio",
533
- "sheldon",
534
- "josefina",
535
- "corinne",
536
- "lana",
537
- "cherry",
538
- "erick",
539
- "frankie",
540
- "stewart",
541
- "claudette",
542
- "doyle",
543
- "darrel",
544
- "janine",
545
- "simone",
546
- "casey",
547
- "leta",
548
- "rogelio",
549
- "lorraine",
550
- "terence",
551
- "santiago",
552
- "alonzo",
553
- "benny",
554
- "elisa",
555
- "dee",
556
- "bert",
557
- "elbert",
558
- "charmaine",
559
- "roslyn",
560
- "shelley",
561
- "ramiro",
562
- "noel",
563
- "mercedes",
564
- "christie",
565
- "laurel",
566
- "spencer",
567
- "pat",
568
- "dorthy",
569
- "jeanie",
570
- "clare",
571
- "aileen",
572
- "grady",
573
- "deana",
574
- "cornelius",
575
- "cecelia",
576
- "maryann",
577
- "rolando",
578
- "lamar",
579
- "susana",
580
- "katharine",
581
- "clay",
582
- "liza",
583
- "jerri",
584
- "rochelle",
585
- "cathy",
586
- "percy",
587
- "dexter",
588
- "maribel",
589
- "rosemarie",
590
- "bradford",
591
- "kari",
592
- "nikki",
593
- "bernadette",
594
- "eugenia",
595
- "merie",
596
- "darie",
597
- "amon",
598
- "moses",
599
- "concetta",
600
- "irvin",
601
- "rodolfo",
602
- "christi",
603
- "roman",
604
- "janie",
605
- "marcy",
606
- "lindy",
607
- "tommie",
608
- "darnell",
609
- "randal",
610
- "selena",
611
- "shari",
612
- "antoinette",
613
- "timmy",
614
- "darrin",
615
- "margo",
616
- "sherri",
617
- "erika",
618
- "robbie",
619
- "marcella",
620
- "lela",
621
- "winston",
622
- "jeannine",
623
- "brendan",
624
- "christa",
625
- "deloris",
626
- "toby",
627
- "elva",
628
- "van",
629
- "abel",
630
- "myron",
631
- "gracie",
632
- "gwen",
633
- "melba",
634
- "boyd",
635
- "shawna",
636
- "courtney",
637
- "marlena",
638
- "cathie",
639
- "ramesh",
640
- "rita",
641
- "joel",
642
- "derek",
643
- "earl",
644
- "brett",
645
- "ellis",
646
- "ian",
647
- "oscar",
648
- "edna",
649
- "ethel",
650
- "gene",
651
- "shannon",
652
- "sheila",
653
- "dustin",
654
- "ellen",
655
- "hilda",
656
- "ray",
657
- "marjorie",
658
- "sylvia",
659
- "barry",
660
- "melvin",
661
- "thelma",
662
- "cindy",
663
- "miranda",
664
- "bernard",
665
- "carlton",
666
- "juanita",
667
- "darrell",
668
- "erik",
669
- "jeremiah",
670
- "nicolas",
671
- "gordon",
672
- "violet",
673
- "mona",
674
- "glen",
675
- "willis",
676
- "harvey",
677
- "rudolph",
678
- "preston",
679
- "cole",
680
- "june",
681
- "pauline",
682
- "leo",
683
- "earnest",
684
- "devin",
685
- "audrey",
686
- "claire",
687
- "vivian",
688
- "goldie",
689
- "tommy",
690
- "allen",
691
- "glenn",
692
- "wilson",
693
- "jill",
694
- "loretta",
695
- "mabel",
696
- "marsha",
697
- "lillie",
698
- "minnie",
699
- "essie",
700
- "madge",
701
- "viola",
702
- "nellie",
703
- "pearl",
704
- "marvin",
705
- "mae",
706
- "levi",
707
- "lucille",
708
- "hazel",
709
- "nathaniel",
710
- "lydia",
711
- "bertha",
712
- "ursula",
713
- "kay",
714
- "sue",
715
- "dean",
716
- "verna",
717
- "teri",
718
- "edith",
719
- "dan",
720
- "lewis",
721
- "harriett",
722
- "clifford",
723
- "genevieve",
724
- "colleen",
725
- "gilbert",
726
- "patrice",
727
- "jared",
728
- "elaine",
729
- "maureen",
730
- "edmund",
731
- "nina",
732
- "georgia",
733
- "garrett",
734
- "renee",
735
- "bessie",
736
- "leslie",
737
- "max",
738
- "leon",
739
- "fannie",
740
- "lowell",
741
- "veronica",
742
- "vanessa",
743
- "joy",
744
- "jim",
745
- "faith",
746
- "valerie",
747
- "wanda",
748
- "steve",
749
- "naomi",
750
- "miles",
751
- "marcia",
752
- "brent",
753
- "clinton",
754
- "jon",
755
- "marshall",
756
- "roberta",
757
- "alexandra",
758
- "doreen",
759
- "daisy",
760
- "della",
761
- "minerva",
762
- "cedric",
763
- "patsy",
764
- "kerry",
765
- "lena",
766
- "gregg",
767
- "lois",
768
- "kurt",
769
- "lorene",
770
- "susie",
771
- "nora",
772
- "lucinda",
773
- "mathew",
774
- "flora",
775
- "rosie",
776
- "sherman",
777
- "lance",
778
- "darcy",
779
- "mattie",
780
- "madeline",
781
- "sylvester",
782
- "cory",
783
- "anita",
784
- "allan",
785
- "lula",
786
- "nell",
787
- "priscilla",
788
- "kristin",
789
- "rosemary",
790
- "roosevelt",
791
- "geneva",
792
- "jeannette",
793
- "bob",
794
- "esther",
795
- "michele",
796
- "forrest",
797
- "wilbert",
798
- "cathleen",
799
- "jaime",
800
- "dwayne",
801
- "inez",
802
- "alberto",
803
- "lynne",
804
- "maxine",
805
- "wilma",
806
- "taylor",
807
- "angelina",
808
- "hope",
809
- "margie",
810
- "myrtle",
811
- "misty",
812
- "jimmie",
813
- "eunice",
814
- "everett",
815
- "miracle",
816
- "billie",
817
- "leland",
818
- "jackie",
819
- "kristina",
820
- "johnnie",
821
- "isaac",
822
- "bobbie",
823
- "tonya",
824
- "reba",
825
- "kristine",
826
- "amelia",
827
- "cassandra",
828
- "angie",
829
- "maude",
830
- "nichole",
831
- "marguerite",
832
- "justine",
833
- "kelli",
834
- "mandy",
835
- "jeri",
836
- "darla",
837
- "shelia",
838
- "jacquelin",
839
- "cara",
840
- "kellie",
841
- "jolene",
842
- "chelsea",
843
- "autumn",
844
- "glenda",
845
- "lolita",
846
- "jeanne",
847
- "sherrie",
848
- "toni",
849
- "becky",
850
- "jennie",
851
- "jenna",
852
- "leigh",
853
- "cristina",
854
- "blanche",
855
- "clarissa",
856
- "betsy",
857
- "bridget",
858
- "ginger",
859
- "faye",
860
- "candice",
861
- "jaclyn",
862
- "krista",
863
- "marisa",
864
- "gayle",
865
- "meredith",
866
- "angelica",
867
- "rachael",
868
- "candy",
869
- "trisha",
870
- "sandy",
871
- "holly",
872
- "alicia",
873
- "melinda",
874
- "geraldine",
875
- "tara",
876
- "isabel",
877
- "adrienne",
878
- "terra",
879
- "rubye",
880
- "antonia",
881
- "guadalupe",
882
- "cheri",
883
- "janelle",
884
- "constance",
885
- "robyn",
886
- "jodi",
887
- "krystal",
888
- "rosalie",
889
- "deanna",
890
- "debbie",
891
- "josie",
892
- "ronda",
893
- "paulette",
894
- "belinda",
895
- "alton",
896
- "rudy",
897
- "kelvin",
898
- "damon",
899
- "johnathan",
900
- "cesar",
901
- "ira",
902
- "horace",
903
- "grant",
904
- "lionel",
905
- "wilbur",
906
- "jake",
907
- "jody",
908
- "rickey",
909
- "lester",
910
- "pablo",
911
- "neal",
912
- "mack",
913
- "orlando",
914
- "alfonso",
915
- "ernesto",
916
- "rex",
917
- "lynn",
918
- "matt",
919
- "lyle",
920
- "kristopher",
921
- "hubert",
922
- "kenny",
923
- "doug",
924
- "sammy",
925
- "homer",
926
- "wendell",
927
- "woodrow",
928
- "felipe",
929
- "garry",
930
- "pete",
931
- "marco",
932
- "rufus",
933
- "owen",
934
- "bryant",
935
- "abraham",
936
- "irving",
937
- "jermaine",
938
- "julius",
939
- "marty",
940
- "alejandro",
941
- "carmen",
942
- "carlos",
943
- "celia",
944
- "lucas",
945
- "luiza",
946
- "diogo",
947
- "agueda",
948
- "raphael",
949
- "elise",
950
- "frederick",
951
- "andra",
952
- "frederik",
953
- "freja",
954
- "daan",
955
- "lotte",
956
- "eino",
957
- "helmi",
958
- "jakob",
959
- "frida",
960
- "kostas",
961
- "eleni",
962
- "lazzaro",
963
- "alessia",
964
- "mart",
965
- "liis",
966
- "trinh",
967
- "thoa",
968
- "lesya",
969
- "taras",
970
- "mikhail",
971
- "olga",
972
- "axel",
973
- "ebba",
974
- "hemant",
975
- "priya",
976
- "aicha",
977
- "ismail",
978
- "moshe",
979
- "inbar",
980
- "gil",
981
- "lital",
982
- "yusuf",
983
- "elif",
984
- "dominika",
985
- "michal"
395
+ const SPEECHIFY_VOICES = [
396
+ "henry",
397
+ "bwyneth",
398
+ "carly",
399
+ "kristy",
400
+ "oliver",
401
+ "tasha",
402
+ "joe",
403
+ "lisa",
404
+ "george",
405
+ "emily",
406
+ "rob",
407
+ "russell",
408
+ "benjamin",
409
+ "michael",
410
+ "kim",
411
+ "ankit",
412
+ "arun",
413
+ "carol",
414
+ "helen",
415
+ "julie",
416
+ "linda",
417
+ "mark",
418
+ "nick",
419
+ "elijah",
420
+ "beverly",
421
+ "collin",
422
+ "erin",
423
+ "jack",
424
+ "jesse",
425
+ "ken",
426
+ "lindsey",
427
+ "monica",
428
+ "phil",
429
+ "ron",
430
+ "stacy",
431
+ "archie",
432
+ "evelyn",
433
+ "freddie",
434
+ "harper",
435
+ "jacob",
436
+ "james",
437
+ "mason",
438
+ "victoria",
439
+ "christina",
440
+ "douglas",
441
+ "lauren",
442
+ "patricia",
443
+ "jennifer",
444
+ "robert",
445
+ "peter",
446
+ "jeremy",
447
+ "barbara",
448
+ "susan",
449
+ "charles",
450
+ "harold",
451
+ "sarah",
452
+ "karen",
453
+ "anthony",
454
+ "donald",
455
+ "paul",
456
+ "steven",
457
+ "andrew",
458
+ "kenneth",
459
+ "joshua",
460
+ "betty",
461
+ "margaret",
462
+ "kyle",
463
+ "edward",
464
+ "ronald",
465
+ "timothy",
466
+ "sandra",
467
+ "dorothy",
468
+ "jeffrey",
469
+ "kimberly",
470
+ "donna",
471
+ "walter",
472
+ "megan",
473
+ "richard",
474
+ "amanda",
475
+ "melissa",
476
+ "deborah",
477
+ "gary",
478
+ "rebecca",
479
+ "sharon",
480
+ "cynthia",
481
+ "kathleen",
482
+ "joan",
483
+ "shirley",
484
+ "angela",
485
+ "anna",
486
+ "brenda",
487
+ "larry",
488
+ "keith",
489
+ "scott",
490
+ "pamela",
491
+ "samuel",
492
+ "gregory",
493
+ "samantha",
494
+ "katherine",
495
+ "christine",
496
+ "frank",
497
+ "alexander",
498
+ "raymond",
499
+ "debra",
500
+ "patrick",
501
+ "catherine",
502
+ "carolyn",
503
+ "janet",
504
+ "ruth",
505
+ "zachary",
506
+ "heather",
507
+ "diane",
508
+ "dennis",
509
+ "jerry",
510
+ "tyler",
511
+ "aaron",
512
+ "virginia",
513
+ "joyce",
514
+ "judith",
515
+ "kelly",
516
+ "nathan",
517
+ "terry",
518
+ "carl",
519
+ "gerald",
520
+ "jaqueline",
521
+ "cheryl",
522
+ "christian",
523
+ "rohit",
524
+ "gloria",
525
+ "arthur",
526
+ "austin",
527
+ "sean",
528
+ "martha",
529
+ "randy",
530
+ "ralph",
531
+ "roy",
532
+ "alan",
533
+ "logan",
534
+ "willie",
535
+ "kathryn",
536
+ "frances",
537
+ "madison",
538
+ "bruce",
539
+ "billy",
540
+ "jordan",
541
+ "bryan",
542
+ "dylan",
543
+ "vincent",
544
+ "eugene",
545
+ "janice",
546
+ "jean",
547
+ "abigail",
548
+ "alice",
549
+ "bobby",
550
+ "julia",
551
+ "johnny",
552
+ "judy",
553
+ "bradley",
554
+ "hunter",
555
+ "dale",
556
+ "howard",
557
+ "fred",
558
+ "danielle",
559
+ "marilyn",
560
+ "blake",
561
+ "doris",
562
+ "denise",
563
+ "issac",
564
+ "theresa",
565
+ "natalie",
566
+ "aiden",
567
+ "brittany",
568
+ "charlotte",
569
+ "marie",
570
+ "kayla",
571
+ "alexis",
572
+ "lori",
573
+ "landon",
574
+ "tiffany",
575
+ "marcus",
576
+ "martin",
577
+ "curtis",
578
+ "kathy",
579
+ "todd",
580
+ "leonard",
581
+ "calvin",
582
+ "rose",
583
+ "ava",
584
+ "bonnie",
585
+ "peggy",
586
+ "edwin",
587
+ "don",
588
+ "ruby",
589
+ "crystal",
590
+ "craig",
591
+ "norma",
592
+ "paula",
593
+ "annie",
594
+ "shawn",
595
+ "lillian",
596
+ "robin",
597
+ "evan",
598
+ "garrette",
599
+ "francis",
600
+ "danny",
601
+ "stanley",
602
+ "lucy",
603
+ "jeffery",
604
+ "herbert",
605
+ "lee",
606
+ "april",
607
+ "anne",
608
+ "tammy",
609
+ "trevor",
610
+ "eleanor",
611
+ "regina",
612
+ "carrie",
613
+ "leah",
614
+ "beth",
615
+ "cody",
616
+ "shane",
617
+ "dana",
618
+ "allison",
619
+ "dawn",
620
+ "julian",
621
+ "wendy",
622
+ "travis",
623
+ "florence",
624
+ "tracy",
625
+ "adrian",
626
+ "phillis",
627
+ "carole",
628
+ "mildred",
629
+ "cameron",
630
+ "chad",
631
+ "connie",
632
+ "gladys",
633
+ "arlene",
634
+ "jana",
635
+ "leona",
636
+ "miriam",
637
+ "lorrie",
638
+ "velma",
639
+ "eduardo",
640
+ "bennie",
641
+ "rene",
642
+ "ed",
643
+ "stuart",
644
+ "terrence",
645
+ "delbert",
646
+ "colin",
647
+ "susanne",
648
+ "hugo",
649
+ "ignacio",
650
+ "sheldon",
651
+ "josefina",
652
+ "corinne",
653
+ "lana",
654
+ "cherry",
655
+ "erick",
656
+ "frankie",
657
+ "stewart",
658
+ "claudette",
659
+ "doyle",
660
+ "darrel",
661
+ "janine",
662
+ "simone",
663
+ "casey",
664
+ "leta",
665
+ "rogelio",
666
+ "lorraine",
667
+ "terence",
668
+ "santiago",
669
+ "alonzo",
670
+ "benny",
671
+ "elisa",
672
+ "dee",
673
+ "bert",
674
+ "elbert",
675
+ "charmaine",
676
+ "roslyn",
677
+ "shelley",
678
+ "ramiro",
679
+ "noel",
680
+ "mercedes",
681
+ "christie",
682
+ "laurel",
683
+ "spencer",
684
+ "pat",
685
+ "dorthy",
686
+ "jeanie",
687
+ "clare",
688
+ "aileen",
689
+ "grady",
690
+ "deana",
691
+ "cornelius",
692
+ "cecelia",
693
+ "maryann",
694
+ "rolando",
695
+ "lamar",
696
+ "susana",
697
+ "katharine",
698
+ "clay",
699
+ "liza",
700
+ "jerri",
701
+ "rochelle",
702
+ "cathy",
703
+ "percy",
704
+ "dexter",
705
+ "maribel",
706
+ "rosemarie",
707
+ "bradford",
708
+ "kari",
709
+ "nikki",
710
+ "bernadette",
711
+ "eugenia",
712
+ "merie",
713
+ "darie",
714
+ "amon",
715
+ "moses",
716
+ "concetta",
717
+ "irvin",
718
+ "rodolfo",
719
+ "christi",
720
+ "roman",
721
+ "janie",
722
+ "marcy",
723
+ "lindy",
724
+ "tommie",
725
+ "darnell",
726
+ "randal",
727
+ "selena",
728
+ "shari",
729
+ "antoinette",
730
+ "timmy",
731
+ "darrin",
732
+ "margo",
733
+ "sherri",
734
+ "erika",
735
+ "robbie",
736
+ "marcella",
737
+ "lela",
738
+ "winston",
739
+ "jeannine",
740
+ "brendan",
741
+ "christa",
742
+ "deloris",
743
+ "toby",
744
+ "elva",
745
+ "van",
746
+ "abel",
747
+ "myron",
748
+ "gracie",
749
+ "gwen",
750
+ "melba",
751
+ "boyd",
752
+ "shawna",
753
+ "courtney",
754
+ "marlena",
755
+ "cathie",
756
+ "ramesh",
757
+ "rita",
758
+ "joel",
759
+ "derek",
760
+ "earl",
761
+ "brett",
762
+ "ellis",
763
+ "ian",
764
+ "oscar",
765
+ "edna",
766
+ "ethel",
767
+ "gene",
768
+ "shannon",
769
+ "sheila",
770
+ "dustin",
771
+ "ellen",
772
+ "hilda",
773
+ "ray",
774
+ "marjorie",
775
+ "sylvia",
776
+ "barry",
777
+ "melvin",
778
+ "thelma",
779
+ "cindy",
780
+ "miranda",
781
+ "bernard",
782
+ "carlton",
783
+ "juanita",
784
+ "darrell",
785
+ "erik",
786
+ "jeremiah",
787
+ "nicolas",
788
+ "gordon",
789
+ "violet",
790
+ "mona",
791
+ "glen",
792
+ "willis",
793
+ "harvey",
794
+ "rudolph",
795
+ "preston",
796
+ "cole",
797
+ "june",
798
+ "pauline",
799
+ "leo",
800
+ "earnest",
801
+ "devin",
802
+ "audrey",
803
+ "claire",
804
+ "vivian",
805
+ "goldie",
806
+ "tommy",
807
+ "allen",
808
+ "glenn",
809
+ "wilson",
810
+ "jill",
811
+ "loretta",
812
+ "mabel",
813
+ "marsha",
814
+ "lillie",
815
+ "minnie",
816
+ "essie",
817
+ "madge",
818
+ "viola",
819
+ "nellie",
820
+ "pearl",
821
+ "marvin",
822
+ "mae",
823
+ "levi",
824
+ "lucille",
825
+ "hazel",
826
+ "nathaniel",
827
+ "lydia",
828
+ "bertha",
829
+ "ursula",
830
+ "kay",
831
+ "sue",
832
+ "dean",
833
+ "verna",
834
+ "teri",
835
+ "edith",
836
+ "dan",
837
+ "lewis",
838
+ "harriett",
839
+ "clifford",
840
+ "genevieve",
841
+ "colleen",
842
+ "gilbert",
843
+ "patrice",
844
+ "jared",
845
+ "elaine",
846
+ "maureen",
847
+ "edmund",
848
+ "nina",
849
+ "georgia",
850
+ "garrett",
851
+ "renee",
852
+ "bessie",
853
+ "leslie",
854
+ "max",
855
+ "leon",
856
+ "fannie",
857
+ "lowell",
858
+ "veronica",
859
+ "vanessa",
860
+ "joy",
861
+ "jim",
862
+ "faith",
863
+ "valerie",
864
+ "wanda",
865
+ "steve",
866
+ "naomi",
867
+ "miles",
868
+ "marcia",
869
+ "brent",
870
+ "clinton",
871
+ "jon",
872
+ "marshall",
873
+ "roberta",
874
+ "alexandra",
875
+ "doreen",
876
+ "daisy",
877
+ "della",
878
+ "minerva",
879
+ "cedric",
880
+ "patsy",
881
+ "kerry",
882
+ "lena",
883
+ "gregg",
884
+ "lois",
885
+ "kurt",
886
+ "lorene",
887
+ "susie",
888
+ "nora",
889
+ "lucinda",
890
+ "mathew",
891
+ "flora",
892
+ "rosie",
893
+ "sherman",
894
+ "lance",
895
+ "darcy",
896
+ "mattie",
897
+ "madeline",
898
+ "sylvester",
899
+ "cory",
900
+ "anita",
901
+ "allan",
902
+ "lula",
903
+ "nell",
904
+ "priscilla",
905
+ "kristin",
906
+ "rosemary",
907
+ "roosevelt",
908
+ "geneva",
909
+ "jeannette",
910
+ "bob",
911
+ "esther",
912
+ "michele",
913
+ "forrest",
914
+ "wilbert",
915
+ "cathleen",
916
+ "jaime",
917
+ "dwayne",
918
+ "inez",
919
+ "alberto",
920
+ "lynne",
921
+ "maxine",
922
+ "wilma",
923
+ "taylor",
924
+ "angelina",
925
+ "hope",
926
+ "margie",
927
+ "myrtle",
928
+ "misty",
929
+ "jimmie",
930
+ "eunice",
931
+ "everett",
932
+ "miracle",
933
+ "billie",
934
+ "leland",
935
+ "jackie",
936
+ "kristina",
937
+ "johnnie",
938
+ "isaac",
939
+ "bobbie",
940
+ "tonya",
941
+ "reba",
942
+ "kristine",
943
+ "amelia",
944
+ "cassandra",
945
+ "angie",
946
+ "maude",
947
+ "nichole",
948
+ "marguerite",
949
+ "justine",
950
+ "kelli",
951
+ "mandy",
952
+ "jeri",
953
+ "darla",
954
+ "shelia",
955
+ "jacquelin",
956
+ "cara",
957
+ "kellie",
958
+ "jolene",
959
+ "chelsea",
960
+ "autumn",
961
+ "glenda",
962
+ "lolita",
963
+ "jeanne",
964
+ "sherrie",
965
+ "toni",
966
+ "becky",
967
+ "jennie",
968
+ "jenna",
969
+ "leigh",
970
+ "cristina",
971
+ "blanche",
972
+ "clarissa",
973
+ "betsy",
974
+ "bridget",
975
+ "ginger",
976
+ "faye",
977
+ "candice",
978
+ "jaclyn",
979
+ "krista",
980
+ "marisa",
981
+ "gayle",
982
+ "meredith",
983
+ "angelica",
984
+ "rachael",
985
+ "candy",
986
+ "trisha",
987
+ "sandy",
988
+ "holly",
989
+ "alicia",
990
+ "melinda",
991
+ "geraldine",
992
+ "tara",
993
+ "isabel",
994
+ "adrienne",
995
+ "terra",
996
+ "rubye",
997
+ "antonia",
998
+ "guadalupe",
999
+ "cheri",
1000
+ "janelle",
1001
+ "constance",
1002
+ "robyn",
1003
+ "jodi",
1004
+ "krystal",
1005
+ "rosalie",
1006
+ "deanna",
1007
+ "debbie",
1008
+ "josie",
1009
+ "ronda",
1010
+ "paulette",
1011
+ "belinda",
1012
+ "alton",
1013
+ "rudy",
1014
+ "kelvin",
1015
+ "damon",
1016
+ "johnathan",
1017
+ "cesar",
1018
+ "ira",
1019
+ "horace",
1020
+ "grant",
1021
+ "lionel",
1022
+ "wilbur",
1023
+ "jake",
1024
+ "jody",
1025
+ "rickey",
1026
+ "lester",
1027
+ "pablo",
1028
+ "neal",
1029
+ "mack",
1030
+ "orlando",
1031
+ "alfonso",
1032
+ "ernesto",
1033
+ "rex",
1034
+ "lynn",
1035
+ "matt",
1036
+ "lyle",
1037
+ "kristopher",
1038
+ "hubert",
1039
+ "kenny",
1040
+ "doug",
1041
+ "sammy",
1042
+ "homer",
1043
+ "wendell",
1044
+ "woodrow",
1045
+ "felipe",
1046
+ "garry",
1047
+ "pete",
1048
+ "marco",
1049
+ "rufus",
1050
+ "owen",
1051
+ "bryant",
1052
+ "abraham",
1053
+ "irving",
1054
+ "jermaine",
1055
+ "julius",
1056
+ "marty",
1057
+ "alejandro",
1058
+ "carmen",
1059
+ "carlos",
1060
+ "celia",
1061
+ "lucas",
1062
+ "luiza",
1063
+ "diogo",
1064
+ "agueda",
1065
+ "raphael",
1066
+ "elise",
1067
+ "frederick",
1068
+ "andra",
1069
+ "frederik",
1070
+ "freja",
1071
+ "daan",
1072
+ "lotte",
1073
+ "eino",
1074
+ "helmi",
1075
+ "jakob",
1076
+ "frida",
1077
+ "kostas",
1078
+ "eleni",
1079
+ "lazzaro",
1080
+ "alessia",
1081
+ "mart",
1082
+ "liis",
1083
+ "trinh",
1084
+ "thoa",
1085
+ "lesya",
1086
+ "taras",
1087
+ "mikhail",
1088
+ "olga",
1089
+ "axel",
1090
+ "ebba",
1091
+ "hemant",
1092
+ "priya",
1093
+ "aicha",
1094
+ "ismail",
1095
+ "moshe",
1096
+ "inbar",
1097
+ "gil",
1098
+ "lital",
1099
+ "yusuf",
1100
+ "elif",
1101
+ "dominika",
1102
+ "michal"
986
1103
  ];
987
-
988
- // src/index.ts
989
- var isSimba3Model = (model) => model === "simba-3.0" || model === "simba-3.2";
1104
+ //#endregion
1105
+ //#region src/index.ts
1106
+ const isSimba3Model = (model) => model === "simba-3.0" || model === "simba-3.2";
990
1107
  var SpeechifyVoice = class extends MastraVoice {
991
- client;
992
- constructor({ speechModel, speaker } = {}) {
993
- const modelName = speechModel?.name ?? "simba-english";
994
- super({
995
- speechModel: {
996
- name: modelName,
997
- apiKey: speechModel?.apiKey ?? process.env.SPEECHIFY_API_KEY
998
- },
999
- // The Simba 3 models serve only the curated SIMBA_3_VOICES, so the
1000
- // default speaker has to follow the configured model.
1001
- speaker: speaker ?? (isSimba3Model(modelName) ? "harper_32" : "george")
1002
- });
1003
- const apiKey = speechModel?.apiKey ?? process.env.SPEECHIFY_API_KEY;
1004
- if (!apiKey) {
1005
- throw new Error("SPEECHIFY_API_KEY is not set");
1006
- }
1007
- this.client = new apiSdk.Speechify({ apiKey });
1008
- }
1009
- async getSpeakers() {
1010
- return [...SIMBA_3_VOICES, ...SPEECHIFY_VOICES].map((voice) => ({
1011
- voiceId: voice,
1012
- name: voice
1013
- }));
1014
- }
1015
- async streamToString(stream) {
1016
- const chunks = [];
1017
- for await (const chunk of stream) {
1018
- if (typeof chunk === "string") {
1019
- chunks.push(Buffer.from(chunk));
1020
- } else {
1021
- chunks.push(chunk);
1022
- }
1023
- }
1024
- return Buffer.concat(chunks).toString("utf-8");
1025
- }
1026
- async speak(input, options) {
1027
- const text = typeof input === "string" ? input : await this.streamToString(input);
1028
- const { speaker, model, ...streamOptions } = options ?? {};
1029
- const request = {
1030
- ...streamOptions,
1031
- input: text,
1032
- // The SDK sends `model` to the API verbatim, so casting the wider
1033
- // SpeechifyModel union into its narrower VoiceModelName is safe.
1034
- model: model || this.speechModel?.name,
1035
- voiceId: speaker || this.speaker
1036
- };
1037
- const webStream = await this.client.audioStream(request);
1038
- const reader = webStream.getReader();
1039
- const nodeStream = new stream.Readable({
1040
- read: async function() {
1041
- try {
1042
- const { done, value } = await reader.read();
1043
- if (done) {
1044
- this.push(null);
1045
- } else {
1046
- this.push(value);
1047
- }
1048
- } catch (error) {
1049
- this.destroy(error);
1050
- }
1051
- }
1052
- });
1053
- nodeStream.on("end", () => {
1054
- reader.releaseLock();
1055
- });
1056
- return nodeStream;
1057
- }
1058
- /**
1059
- * Checks if listening capabilities are enabled.
1060
- *
1061
- * @returns {Promise<{ enabled: boolean }>}
1062
- */
1063
- async getListener() {
1064
- return { enabled: false };
1065
- }
1066
- async listen(_input, _options) {
1067
- throw new Error("Speechify does not support speech recognition");
1068
- }
1108
+ client;
1109
+ constructor({ speechModel, speaker } = {}) {
1110
+ const modelName = speechModel?.name ?? "simba-english";
1111
+ super({
1112
+ speechModel: {
1113
+ name: modelName,
1114
+ apiKey: speechModel?.apiKey ?? process.env.SPEECHIFY_API_KEY
1115
+ },
1116
+ speaker: speaker ?? (isSimba3Model(modelName) ? "harper_32" : "george")
1117
+ });
1118
+ const apiKey = speechModel?.apiKey ?? process.env.SPEECHIFY_API_KEY;
1119
+ if (!apiKey) throw new Error("SPEECHIFY_API_KEY is not set");
1120
+ this.client = new _speechify_api_sdk.Speechify({ apiKey });
1121
+ }
1122
+ async getSpeakers() {
1123
+ return [...SIMBA_3_VOICES, ...SPEECHIFY_VOICES].map((voice) => ({
1124
+ voiceId: voice,
1125
+ name: voice
1126
+ }));
1127
+ }
1128
+ async streamToString(stream$1) {
1129
+ const chunks = [];
1130
+ for await (const chunk of stream$1) if (typeof chunk === "string") chunks.push(Buffer.from(chunk));
1131
+ else chunks.push(chunk);
1132
+ return Buffer.concat(chunks).toString("utf-8");
1133
+ }
1134
+ async speak(input, options) {
1135
+ const text = typeof input === "string" ? input : await this.streamToString(input);
1136
+ const { speaker, model, ...streamOptions } = options ?? {};
1137
+ const request = {
1138
+ ...streamOptions,
1139
+ input: text,
1140
+ model: model || this.speechModel?.name,
1141
+ voiceId: speaker || this.speaker
1142
+ };
1143
+ const reader = (await this.client.audioStream(request)).getReader();
1144
+ const nodeStream = new stream.Readable({ read: async function() {
1145
+ try {
1146
+ const { done, value } = await reader.read();
1147
+ if (done) this.push(null);
1148
+ else this.push(value);
1149
+ } catch (error) {
1150
+ this.destroy(error);
1151
+ }
1152
+ } });
1153
+ nodeStream.on("end", () => {
1154
+ reader.releaseLock();
1155
+ });
1156
+ return nodeStream;
1157
+ }
1158
+ /**
1159
+ * Checks if listening capabilities are enabled.
1160
+ *
1161
+ * @returns {Promise<{ enabled: boolean }>}
1162
+ */
1163
+ async getListener() {
1164
+ return { enabled: false };
1165
+ }
1166
+ async listen(_input, _options) {
1167
+ throw new Error("Speechify does not support speech recognition");
1168
+ }
1069
1169
  };
1070
-
1170
+ //#endregion
1071
1171
  exports.SpeechifyVoice = SpeechifyVoice;
1072
- //# sourceMappingURL=index.cjs.map
1172
+
1073
1173
  //# sourceMappingURL=index.cjs.map