@supertone/supertone 0.1.1 → 0.1.3
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 +119 -69
- package/custom_test/realtime_tts_player.ts +177 -12
- package/custom_test/test_pronunciation_dictionary.ts +227 -0
- package/custom_test/test_real_api.ts +1677 -162
- package/custom_test/test_text_utils_chunk_text_punctuation.ts +55 -0
- package/dist/commonjs/lib/config.d.ts +2 -2
- package/dist/commonjs/lib/config.d.ts.map +1 -1
- package/dist/commonjs/lib/config.js +2 -2
- package/dist/commonjs/lib/config.js.map +1 -1
- package/dist/commonjs/lib/custom_utils/index.d.ts +1 -0
- package/dist/commonjs/lib/custom_utils/index.d.ts.map +1 -1
- package/dist/commonjs/lib/custom_utils/index.js +5 -1
- package/dist/commonjs/lib/custom_utils/index.js.map +1 -1
- package/dist/commonjs/lib/custom_utils/pronunciation_utils.d.ts +24 -0
- package/dist/commonjs/lib/custom_utils/pronunciation_utils.d.ts.map +1 -0
- package/dist/commonjs/lib/custom_utils/pronunciation_utils.js +145 -0
- package/dist/commonjs/lib/custom_utils/pronunciation_utils.js.map +1 -0
- package/dist/commonjs/lib/custom_utils/text_utils.d.ts +8 -1
- package/dist/commonjs/lib/custom_utils/text_utils.d.ts.map +1 -1
- package/dist/commonjs/lib/custom_utils/text_utils.js +125 -7
- package/dist/commonjs/lib/custom_utils/text_utils.js.map +1 -1
- package/dist/commonjs/models/apiconverttexttospeechusingcharacterrequest.d.ts +92 -1
- package/dist/commonjs/models/apiconverttexttospeechusingcharacterrequest.d.ts.map +1 -1
- package/dist/commonjs/models/apiconverttexttospeechusingcharacterrequest.js +48 -3
- package/dist/commonjs/models/apiconverttexttospeechusingcharacterrequest.js.map +1 -1
- package/dist/commonjs/models/predictttsdurationusingcharacterrequest.d.ts +92 -1
- package/dist/commonjs/models/predictttsdurationusingcharacterrequest.d.ts.map +1 -1
- package/dist/commonjs/models/predictttsdurationusingcharacterrequest.js +46 -3
- package/dist/commonjs/models/predictttsdurationusingcharacterrequest.js.map +1 -1
- package/dist/commonjs/sdk/texttospeech.d.ts +17 -6
- package/dist/commonjs/sdk/texttospeech.d.ts.map +1 -1
- package/dist/commonjs/sdk/texttospeech.js +48 -25
- package/dist/commonjs/sdk/texttospeech.js.map +1 -1
- package/dist/esm/lib/config.d.ts +2 -2
- package/dist/esm/lib/config.d.ts.map +1 -1
- package/dist/esm/lib/config.js +2 -2
- package/dist/esm/lib/config.js.map +1 -1
- package/dist/esm/lib/custom_utils/index.d.ts +1 -0
- package/dist/esm/lib/custom_utils/index.d.ts.map +1 -1
- package/dist/esm/lib/custom_utils/index.js +2 -0
- package/dist/esm/lib/custom_utils/index.js.map +1 -1
- package/dist/esm/lib/custom_utils/pronunciation_utils.d.ts +24 -0
- package/dist/esm/lib/custom_utils/pronunciation_utils.d.ts.map +1 -0
- package/dist/esm/lib/custom_utils/pronunciation_utils.js +140 -0
- package/dist/esm/lib/custom_utils/pronunciation_utils.js.map +1 -0
- package/dist/esm/lib/custom_utils/text_utils.d.ts +8 -1
- package/dist/esm/lib/custom_utils/text_utils.d.ts.map +1 -1
- package/dist/esm/lib/custom_utils/text_utils.js +125 -7
- package/dist/esm/lib/custom_utils/text_utils.js.map +1 -1
- package/dist/esm/models/apiconverttexttospeechusingcharacterrequest.d.ts +92 -1
- package/dist/esm/models/apiconverttexttospeechusingcharacterrequest.d.ts.map +1 -1
- package/dist/esm/models/apiconverttexttospeechusingcharacterrequest.js +47 -2
- package/dist/esm/models/apiconverttexttospeechusingcharacterrequest.js.map +1 -1
- package/dist/esm/models/predictttsdurationusingcharacterrequest.d.ts +92 -1
- package/dist/esm/models/predictttsdurationusingcharacterrequest.d.ts.map +1 -1
- package/dist/esm/models/predictttsdurationusingcharacterrequest.js +45 -2
- package/dist/esm/models/predictttsdurationusingcharacterrequest.js.map +1 -1
- package/dist/esm/sdk/texttospeech.d.ts +17 -6
- package/dist/esm/sdk/texttospeech.d.ts.map +1 -1
- package/dist/esm/sdk/texttospeech.js +49 -26
- package/dist/esm/sdk/texttospeech.js.map +1 -1
- package/examples/custom_voices/create_cloned_voice.ts +4 -3
- package/examples/custom_voices/delete_custom_voice.ts +2 -7
- package/examples/custom_voices/edit_custom_voice.ts +2 -6
- package/examples/custom_voices/get_custom_voice.ts +2 -7
- package/examples/custom_voices/list_custom_voices.ts +2 -7
- package/examples/custom_voices/search_custom_voices.ts +2 -6
- package/examples/text_to_speech/create_speech.ts +3 -8
- package/examples/text_to_speech/create_speech_long_text.ts +3 -7
- package/examples/text_to_speech/create_speech_with_phonemes.ts +3 -7
- package/examples/text_to_speech/create_speech_with_voice_settings.ts +3 -8
- package/examples/text_to_speech/predict_duration.ts +3 -7
- package/examples/text_to_speech/stream_speech.ts +3 -7
- package/examples/text_to_speech/stream_speech_long_text.ts +3 -7
- package/examples/text_to_speech/stream_speech_with_phonemes.ts +3 -7
- package/examples/text_to_speech/stream_speech_with_voice_settings.ts +3 -7
- package/examples/usage/get_credit_balance.ts +2 -6
- package/examples/usage/get_usage.ts +2 -6
- package/examples/usage/get_voice_usage.ts +2 -7
- package/examples/voices/get_voice.ts +2 -6
- package/examples/voices/list_voices.ts +2 -6
- package/examples/voices/search_voices.ts +2 -7
- package/jsr.json +1 -1
- package/openapi.json +101 -9
- package/package.json +1 -1
- package/src/lib/config.ts +41 -41
- package/src/lib/custom_utils/index.ts +7 -0
- package/src/lib/custom_utils/pronunciation_utils.ts +193 -0
- package/src/lib/custom_utils/text_utils.ts +138 -7
- package/src/models/apiconverttexttospeechusingcharacterrequest.ts +62 -3
- package/src/models/predictttsdurationusingcharacterrequest.ts +64 -3
- package/src/sdk/texttospeech.ts +99 -68
package/src/sdk/texttospeech.ts
CHANGED
|
@@ -21,9 +21,23 @@ import {
|
|
|
21
21
|
detectAudioFormat,
|
|
22
22
|
mergeMp3Binary,
|
|
23
23
|
mergeWavBinary,
|
|
24
|
+
applyPronunciationDictionary,
|
|
25
|
+
type PronunciationDictionaryEntry,
|
|
24
26
|
removeMp3Header,
|
|
25
27
|
removeWavHeader,
|
|
26
28
|
} from "../lib/custom_utils/index.js";
|
|
29
|
+
|
|
30
|
+
type CreateSpeechOptions = RequestOptions & {
|
|
31
|
+
acceptHeaderOverride?: CreateSpeechAcceptEnum;
|
|
32
|
+
maxTextLength?: number;
|
|
33
|
+
pronunciationDictionary?: PronunciationDictionaryEntry[];
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
type StreamSpeechOptions = RequestOptions & {
|
|
37
|
+
acceptHeaderOverride?: StreamSpeechAcceptEnum;
|
|
38
|
+
maxTextLength?: number;
|
|
39
|
+
pronunciationDictionary?: PronunciationDictionaryEntry[];
|
|
40
|
+
};
|
|
27
41
|
// #endregion imports
|
|
28
42
|
|
|
29
43
|
export { CreateSpeechAcceptEnum } from "../funcs/textToSpeechCreateSpeech.js";
|
|
@@ -53,11 +67,22 @@ export class TextToSpeech extends ClientSDK {
|
|
|
53
67
|
return text.length > maxLength;
|
|
54
68
|
}
|
|
55
69
|
|
|
70
|
+
/**
|
|
71
|
+
* Apply pronunciation dictionary before chunking (opt-in).
|
|
72
|
+
*/
|
|
73
|
+
private applyPronunciationDictionary(
|
|
74
|
+
text: string,
|
|
75
|
+
pronunciationDictionary?: PronunciationDictionaryEntry[]
|
|
76
|
+
): string {
|
|
77
|
+
if (!pronunciationDictionary) return text;
|
|
78
|
+
return applyPronunciationDictionary(text, pronunciationDictionary);
|
|
79
|
+
}
|
|
80
|
+
|
|
56
81
|
/**
|
|
57
82
|
* Extract audio data from response
|
|
58
83
|
*/
|
|
59
84
|
private async extractAudioFromResponse(
|
|
60
|
-
response: operations.CreateSpeechResponse | operations.StreamSpeechResponse
|
|
85
|
+
response: operations.CreateSpeechResponse | operations.StreamSpeechResponse
|
|
61
86
|
): Promise<Uint8Array> {
|
|
62
87
|
const result = response.result;
|
|
63
88
|
|
|
@@ -74,9 +99,9 @@ export class TextToSpeech extends ClientSDK {
|
|
|
74
99
|
}
|
|
75
100
|
|
|
76
101
|
if (
|
|
77
|
-
typeof result === "object"
|
|
78
|
-
|
|
79
|
-
|
|
102
|
+
typeof result === "object" &&
|
|
103
|
+
result !== null &&
|
|
104
|
+
"getReader" in result
|
|
80
105
|
) {
|
|
81
106
|
// ReadableStream
|
|
82
107
|
const reader = (result as ReadableStream<Uint8Array>).getReader();
|
|
@@ -131,14 +156,15 @@ export class TextToSpeech extends ClientSDK {
|
|
|
131
156
|
// Enhanced error message with object inspection
|
|
132
157
|
const resultType = typeof result;
|
|
133
158
|
const resultConstructor = result?.constructor?.name || "unknown";
|
|
134
|
-
const resultKeys =
|
|
135
|
-
|
|
136
|
-
|
|
159
|
+
const resultKeys =
|
|
160
|
+
result && typeof result === "object"
|
|
161
|
+
? Object.keys(result).join(", ")
|
|
162
|
+
: "N/A";
|
|
137
163
|
|
|
138
164
|
throw new Error(
|
|
139
|
-
`Unsupported result type: ${resultType}, `
|
|
140
|
-
|
|
141
|
-
|
|
165
|
+
`Unsupported result type: ${resultType}, ` +
|
|
166
|
+
`constructor: ${resultConstructor}, ` +
|
|
167
|
+
`keys: [${resultKeys}]`
|
|
142
168
|
);
|
|
143
169
|
}
|
|
144
170
|
|
|
@@ -146,7 +172,7 @@ export class TextToSpeech extends ClientSDK {
|
|
|
146
172
|
* Merge multiple audio responses into one
|
|
147
173
|
*/
|
|
148
174
|
private async mergeAudioResponses(
|
|
149
|
-
responses: operations.CreateSpeechResponse[]
|
|
175
|
+
responses: operations.CreateSpeechResponse[]
|
|
150
176
|
): Promise<operations.CreateSpeechResponse> {
|
|
151
177
|
if (responses.length === 0) {
|
|
152
178
|
throw new Error("No responses to merge");
|
|
@@ -163,7 +189,7 @@ export class TextToSpeech extends ClientSDK {
|
|
|
163
189
|
|
|
164
190
|
// Extract audio data from all responses
|
|
165
191
|
const audioChunks: Uint8Array[] = await Promise.all(
|
|
166
|
-
responses.map((r) => this.extractAudioFromResponse(r))
|
|
192
|
+
responses.map((r) => this.extractAudioFromResponse(r))
|
|
167
193
|
);
|
|
168
194
|
|
|
169
195
|
const firstChunk = audioChunks[0];
|
|
@@ -208,14 +234,14 @@ export class TextToSpeech extends ClientSDK {
|
|
|
208
234
|
originalRequest: operations.StreamSpeechRequest,
|
|
209
235
|
options?: RequestOptions & {
|
|
210
236
|
acceptHeaderOverride?: StreamSpeechAcceptEnum;
|
|
211
|
-
}
|
|
237
|
+
}
|
|
212
238
|
): operations.StreamSpeechResponse {
|
|
213
239
|
let audioFormat: "wav" | "mp3" | null = null;
|
|
214
240
|
let isFirstAudioChunk = true;
|
|
215
241
|
|
|
216
242
|
// Use arrow function to preserve 'this' context
|
|
217
243
|
const processStream = async (
|
|
218
|
-
controller: ReadableStreamDefaultController<Uint8Array
|
|
244
|
+
controller: ReadableStreamDefaultController<Uint8Array>
|
|
219
245
|
) => {
|
|
220
246
|
try {
|
|
221
247
|
// Stream first response (first text chunk)
|
|
@@ -263,7 +289,7 @@ export class TextToSpeech extends ClientSDK {
|
|
|
263
289
|
}
|
|
264
290
|
const chunkResponse = await this._streamSpeechOriginal(
|
|
265
291
|
chunkRequest,
|
|
266
|
-
options
|
|
292
|
+
options
|
|
267
293
|
);
|
|
268
294
|
|
|
269
295
|
// Stream this text chunk's audio
|
|
@@ -323,40 +349,51 @@ export class TextToSpeech extends ClientSDK {
|
|
|
323
349
|
*/
|
|
324
350
|
private async createSpeechWithChunking(
|
|
325
351
|
request: operations.CreateSpeechRequest,
|
|
326
|
-
options?:
|
|
327
|
-
acceptHeaderOverride?: CreateSpeechAcceptEnum;
|
|
328
|
-
maxTextLength?: number;
|
|
329
|
-
},
|
|
352
|
+
options?: CreateSpeechOptions
|
|
330
353
|
): Promise<operations.CreateSpeechResponse> {
|
|
354
|
+
const { pronunciationDictionary, ...restOptions } = options ?? {};
|
|
331
355
|
const maxLength = options?.maxTextLength ?? DEFAULT_MAX_TEXT_LENGTH;
|
|
332
|
-
const text =
|
|
333
|
-
?? "";
|
|
356
|
+
const text =
|
|
357
|
+
request.apiConvertTextToSpeechUsingCharacterRequest?.text ?? "";
|
|
358
|
+
const normalizedText = this.applyPronunciationDictionary(
|
|
359
|
+
text,
|
|
360
|
+
pronunciationDictionary
|
|
361
|
+
);
|
|
362
|
+
|
|
363
|
+
const baseRequest: operations.CreateSpeechRequest = {
|
|
364
|
+
...request,
|
|
365
|
+
apiConvertTextToSpeechUsingCharacterRequest: {
|
|
366
|
+
...request.apiConvertTextToSpeechUsingCharacterRequest,
|
|
367
|
+
text: normalizedText,
|
|
368
|
+
},
|
|
369
|
+
};
|
|
334
370
|
|
|
335
371
|
// Short text: call original method directly
|
|
336
|
-
if (!this.shouldChunkText(
|
|
372
|
+
if (!this.shouldChunkText(normalizedText, maxLength)) {
|
|
337
373
|
if (!this._createSpeechOriginal) {
|
|
338
374
|
throw new Error("Original createSpeech method not found");
|
|
339
375
|
}
|
|
340
|
-
return this._createSpeechOriginal(
|
|
376
|
+
return this._createSpeechOriginal(baseRequest, restOptions);
|
|
341
377
|
}
|
|
342
378
|
|
|
343
379
|
// Long text: chunk, process sequentially (to avoid schema parsing issues), and merge
|
|
344
|
-
const textChunks = chunkText(
|
|
380
|
+
const textChunks = chunkText(normalizedText, maxLength);
|
|
345
381
|
|
|
346
382
|
// Determine Accept header based on output format
|
|
347
|
-
const outputFormat =
|
|
348
|
-
?.outputFormat;
|
|
349
|
-
const acceptHeader: CreateSpeechAcceptEnum =
|
|
350
|
-
|
|
351
|
-
|
|
383
|
+
const outputFormat =
|
|
384
|
+
baseRequest.apiConvertTextToSpeechUsingCharacterRequest?.outputFormat;
|
|
385
|
+
const acceptHeader: CreateSpeechAcceptEnum =
|
|
386
|
+
outputFormat === "mp3"
|
|
387
|
+
? CreateSpeechAcceptEnum.audioMpeg
|
|
388
|
+
: CreateSpeechAcceptEnum.audioWav;
|
|
352
389
|
|
|
353
390
|
// Process chunks sequentially to avoid race conditions in schema parsing
|
|
354
391
|
const responses: operations.CreateSpeechResponse[] = [];
|
|
355
392
|
for (const chunk of textChunks) {
|
|
356
393
|
const chunkRequest: operations.CreateSpeechRequest = {
|
|
357
|
-
...
|
|
394
|
+
...baseRequest,
|
|
358
395
|
apiConvertTextToSpeechUsingCharacterRequest: {
|
|
359
|
-
...
|
|
396
|
+
...baseRequest.apiConvertTextToSpeechUsingCharacterRequest,
|
|
360
397
|
text: chunk,
|
|
361
398
|
},
|
|
362
399
|
};
|
|
@@ -364,7 +401,7 @@ export class TextToSpeech extends ClientSDK {
|
|
|
364
401
|
throw new Error("Original createSpeech method not found");
|
|
365
402
|
}
|
|
366
403
|
const response = await this._createSpeechOriginal(chunkRequest, {
|
|
367
|
-
...
|
|
404
|
+
...restOptions,
|
|
368
405
|
acceptHeaderOverride: acceptHeader,
|
|
369
406
|
});
|
|
370
407
|
responses.push(response);
|
|
@@ -378,25 +415,35 @@ export class TextToSpeech extends ClientSDK {
|
|
|
378
415
|
*/
|
|
379
416
|
private async streamSpeechWithChunking(
|
|
380
417
|
request: operations.StreamSpeechRequest,
|
|
381
|
-
options?:
|
|
382
|
-
acceptHeaderOverride?: StreamSpeechAcceptEnum;
|
|
383
|
-
maxTextLength?: number;
|
|
384
|
-
},
|
|
418
|
+
options?: StreamSpeechOptions
|
|
385
419
|
): Promise<operations.StreamSpeechResponse> {
|
|
420
|
+
const { pronunciationDictionary, ...restOptions } = options ?? {};
|
|
386
421
|
const maxLength = options?.maxTextLength ?? DEFAULT_MAX_TEXT_LENGTH;
|
|
387
|
-
const text =
|
|
388
|
-
?? "";
|
|
422
|
+
const text =
|
|
423
|
+
request.apiConvertTextToSpeechUsingCharacterRequest?.text ?? "";
|
|
424
|
+
const normalizedText = this.applyPronunciationDictionary(
|
|
425
|
+
text,
|
|
426
|
+
pronunciationDictionary
|
|
427
|
+
);
|
|
428
|
+
|
|
429
|
+
const baseRequest: operations.StreamSpeechRequest = {
|
|
430
|
+
...request,
|
|
431
|
+
apiConvertTextToSpeechUsingCharacterRequest: {
|
|
432
|
+
...request.apiConvertTextToSpeechUsingCharacterRequest,
|
|
433
|
+
text: normalizedText,
|
|
434
|
+
},
|
|
435
|
+
};
|
|
389
436
|
|
|
390
437
|
// Short text: call original method directly
|
|
391
|
-
if (!this.shouldChunkText(
|
|
438
|
+
if (!this.shouldChunkText(normalizedText, maxLength)) {
|
|
392
439
|
if (!this._streamSpeechOriginal) {
|
|
393
440
|
throw new Error("Original streamSpeech method not found");
|
|
394
441
|
}
|
|
395
|
-
return this._streamSpeechOriginal(
|
|
442
|
+
return this._streamSpeechOriginal(baseRequest, restOptions);
|
|
396
443
|
}
|
|
397
444
|
|
|
398
445
|
// Long text: chunk and stream sequentially
|
|
399
|
-
const textChunks = chunkText(
|
|
446
|
+
const textChunks = chunkText(normalizedText, maxLength);
|
|
400
447
|
|
|
401
448
|
if (textChunks.length === 0) {
|
|
402
449
|
throw new Error("No text chunks to process");
|
|
@@ -409,9 +456,9 @@ export class TextToSpeech extends ClientSDK {
|
|
|
409
456
|
|
|
410
457
|
// Get first response to start streaming
|
|
411
458
|
const firstChunkRequest: operations.StreamSpeechRequest = {
|
|
412
|
-
...
|
|
459
|
+
...baseRequest,
|
|
413
460
|
apiConvertTextToSpeechUsingCharacterRequest: {
|
|
414
|
-
...
|
|
461
|
+
...baseRequest.apiConvertTextToSpeechUsingCharacterRequest,
|
|
415
462
|
text: firstChunk,
|
|
416
463
|
},
|
|
417
464
|
};
|
|
@@ -421,7 +468,7 @@ export class TextToSpeech extends ClientSDK {
|
|
|
421
468
|
}
|
|
422
469
|
const firstResponse = await this._streamSpeechOriginal(
|
|
423
470
|
firstChunkRequest,
|
|
424
|
-
|
|
471
|
+
restOptions
|
|
425
472
|
);
|
|
426
473
|
|
|
427
474
|
// Single chunk: return as-is
|
|
@@ -434,8 +481,8 @@ export class TextToSpeech extends ClientSDK {
|
|
|
434
481
|
return this.createExtendedStreamingResponse(
|
|
435
482
|
firstResponse,
|
|
436
483
|
remainingChunks,
|
|
437
|
-
|
|
438
|
-
|
|
484
|
+
baseRequest,
|
|
485
|
+
restOptions
|
|
439
486
|
);
|
|
440
487
|
}
|
|
441
488
|
// #endregion sdk-class-body
|
|
@@ -448,15 +495,9 @@ export class TextToSpeech extends ClientSDK {
|
|
|
448
495
|
*/
|
|
449
496
|
async createSpeech(
|
|
450
497
|
request: operations.CreateSpeechRequest,
|
|
451
|
-
options?:
|
|
452
|
-
acceptHeaderOverride?: CreateSpeechAcceptEnum;
|
|
453
|
-
},
|
|
498
|
+
options?: CreateSpeechOptions
|
|
454
499
|
): Promise<operations.CreateSpeechResponse> {
|
|
455
|
-
return unwrapAsync(textToSpeechCreateSpeech(
|
|
456
|
-
this,
|
|
457
|
-
request,
|
|
458
|
-
options,
|
|
459
|
-
));
|
|
500
|
+
return unwrapAsync(textToSpeechCreateSpeech(this, request, options));
|
|
460
501
|
}
|
|
461
502
|
|
|
462
503
|
/**
|
|
@@ -467,15 +508,9 @@ export class TextToSpeech extends ClientSDK {
|
|
|
467
508
|
*/
|
|
468
509
|
async streamSpeech(
|
|
469
510
|
request: operations.StreamSpeechRequest,
|
|
470
|
-
options?:
|
|
471
|
-
acceptHeaderOverride?: StreamSpeechAcceptEnum;
|
|
472
|
-
},
|
|
511
|
+
options?: StreamSpeechOptions
|
|
473
512
|
): Promise<operations.StreamSpeechResponse> {
|
|
474
|
-
return unwrapAsync(textToSpeechStreamSpeech(
|
|
475
|
-
this,
|
|
476
|
-
request,
|
|
477
|
-
options,
|
|
478
|
-
));
|
|
513
|
+
return unwrapAsync(textToSpeechStreamSpeech(this, request, options));
|
|
479
514
|
}
|
|
480
515
|
|
|
481
516
|
/**
|
|
@@ -486,12 +521,8 @@ export class TextToSpeech extends ClientSDK {
|
|
|
486
521
|
*/
|
|
487
522
|
async predictDuration(
|
|
488
523
|
request: operations.PredictDurationRequest,
|
|
489
|
-
options?: RequestOptions
|
|
524
|
+
options?: RequestOptions
|
|
490
525
|
): Promise<operations.PredictDurationResponse> {
|
|
491
|
-
return unwrapAsync(textToSpeechPredictDuration(
|
|
492
|
-
this,
|
|
493
|
-
request,
|
|
494
|
-
options,
|
|
495
|
-
));
|
|
526
|
+
return unwrapAsync(textToSpeechPredictDuration(this, request, options));
|
|
496
527
|
}
|
|
497
528
|
}
|