@breeze.blue/sdk 0.10.0 → 0.11.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/CHANGELOG.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.11.0
4
+
5
+ - Added canonical Voice `tags`, personal tag overrides, favorite management,
6
+ exact tag filters, and `voices.updateTags()` / `favorite()` / `unfavorite()`.
7
+ - `voices.savePreview(...)` now requires `languageCode`, preventing saved
8
+ voices from being created without explicit reference-language metadata.
9
+ - Added `voices.metadataOptions()` and the typed `VoiceLanguageCode` contract
10
+ for discovering Voice Metadata codes and language-to-accent constraints.
11
+ - Sync and async TTS accept explicit sample-rate and bitrate output profiles,
12
+ such as `wav_48000` and `mp3_44100_128`.
13
+
3
14
  ## 0.10.0
4
15
 
5
16
  - Added typed Voice Metadata codes and camelCase response fields for gender,
@@ -205,7 +216,7 @@
205
216
 
206
217
  ## 0.1.2
207
218
 
208
- - Breaking: all request and response field names are now camelCase (e.g. `modelId`, `voiceId`, `voiceSettings`, `historyItemId`). The SDK transparently translates to the snake_case HTTP wire format on send and from snake_case on receive. `labels: Record<string, string>` is preserved verbatim.
219
+ - Breaking: all request and response field names are now camelCase (e.g. `modelId`, `voiceId`, `voiceSettings`, `historyItemId`). The SDK transparently translates to the snake_case HTTP wire format on send and from snake_case on receive.
209
220
  - Removed remaining ElevenLabs-positioning copy from the README and package keywords. Quickstart and reference examples use the published packages only.
210
221
 
211
222
  ## 0.1.1
package/README.md CHANGED
@@ -393,6 +393,10 @@ Streaming text-to-speech defaults to `pcm` to reduce time to first audio. Pass
393
393
  `{ outputFormat: "wav" }` or `{ outputFormat: "mp3" }` when you need that wire
394
394
  format explicitly.
395
395
 
396
+ Sync and async text-to-speech also take a sample rate and, for the lossy encodings, a bitrate, such as
397
+ `{ outputFormat: "wav_48000" }`. Breeze resamples its native 24000 Hz output for
398
+ downstream compatibility; profiles carrying a sample rate are not available for streaming.
399
+
396
400
  ## Voices
397
401
 
398
402
  Search every voice available to the account and inspect a single voice. Public
@@ -402,6 +406,10 @@ or voice ID.
402
406
 
403
407
  ```ts
404
408
  const voices = await client.voices.search({ search: "calm documentary narrator" });
409
+ const taggedFavorites = await client.voices.search({
410
+ favoritesOnly: true,
411
+ tags: ["narration", "novel=三体"],
412
+ });
405
413
  const firstVoiceId = voices.voices[0].voiceId;
406
414
 
407
415
  const voice = await client.voices.get(firstVoiceId);
@@ -409,6 +417,11 @@ const settings = await client.voices.getSettings(firstVoiceId);
409
417
 
410
418
  const randomVoice = await client.voices.random();
411
419
  console.log(randomVoice.voiceId, randomVoice.name);
420
+
421
+ // Discover the current code-only Voice Metadata contract before building a form.
422
+ const metadataOptions = await client.voices.metadataOptions();
423
+ console.log(metadataOptions.languageCodes);
424
+ console.log(metadataOptions.accentCodesByLanguage.en);
412
425
  ```
413
426
 
414
427
  Breeze voice creation is always two steps: produce a **preview**, let the
@@ -454,6 +467,7 @@ const saved = await client.voices.savePreview({
454
467
  age: "middle_aged",
455
468
  tone: ["warm", "articulate"],
456
469
  accent: "american",
470
+ tags: ["narration", "novel=三体"],
457
471
  });
458
472
  ```
459
473
 
@@ -468,12 +482,18 @@ await client.voices.edit(saved.voiceId, {
468
482
  // null clears nullable metadata; [] clears tone. Omitted fields remain unchanged.
469
483
  await client.voices.edit(saved.voiceId, { accent: null, tone: [] });
470
484
  await client.voices.editSettings(saved.voiceId, { guidanceScale: 1.2 });
485
+ await client.voices.favorite(firstVoiceId);
486
+ await client.voices.updateTags(firstVoiceId, ["narration", "novel=三体"]);
487
+ await client.voices.updateTags(firstVoiceId, []); // Resume owner tag inheritance.
488
+ await client.voices.unfavorite(firstVoiceId);
471
489
  await client.voices.delete(saved.voiceId);
472
490
  ```
473
491
 
474
492
  Voice Metadata uses stable code values. `gender`, `age`, and `accent` may be
475
493
  `null`; `tone` contains up to three distinct codes. English and Chinese use
476
494
  different accent code sets, and other languages require `accent: null`.
495
+ Call `client.voices.metadataOptions()` to discover every accepted code and the
496
+ language-to-accent cascade at runtime.
477
497
 
478
498
  ## History, Models, and Account
479
499
 
@@ -1,6 +1,3 @@
1
- // Keys whose values are user-defined dictionaries; we transform the key itself
2
- // but never recurse into the value.
3
- const OPAQUE_VALUE_KEYS = new Set(["labels"]);
4
1
  function snakeToCamel(key) {
5
2
  return key.replace(/_([a-z0-9])/g, (_, c) => c.toUpperCase());
6
3
  }
@@ -15,24 +12,22 @@ function isPlainObject(value) {
15
12
  const proto = Object.getPrototypeOf(value);
16
13
  return proto === Object.prototype || proto === null;
17
14
  }
18
- function transform(value, keyFn, opaqueKey) {
15
+ function transform(value, keyFn) {
19
16
  if (Array.isArray(value)) {
20
- return value.map((item) => transform(item, keyFn, false));
17
+ return value.map((item) => transform(item, keyFn));
21
18
  }
22
19
  if (isPlainObject(value)) {
23
- if (opaqueKey)
24
- return value;
25
20
  const out = {};
26
21
  for (const [k, v] of Object.entries(value)) {
27
- out[keyFn(k)] = transform(v, keyFn, OPAQUE_VALUE_KEYS.has(k));
22
+ out[keyFn(k)] = transform(v, keyFn);
28
23
  }
29
24
  return out;
30
25
  }
31
26
  return value;
32
27
  }
33
28
  export function camelizeKeys(value) {
34
- return transform(value, snakeToCamel, false);
29
+ return transform(value, snakeToCamel);
35
30
  }
36
31
  export function snakeizeKeys(value) {
37
- return transform(value, camelToSnake, false);
32
+ return transform(value, camelToSnake);
38
33
  }
package/dist/client.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { AudioResponse } from "./audio.js";
2
- import type { AudioRequestOptions, BreezeBlueWebSocket, AsyncTextToSpeechJob, Balance, BreezeBlueClientOptions, GenericStatus, GenerationJob, HistoryItem, HistoryList, HistoryListParams, Model, RequestOptions, RealtimeTextToSpeechConnectOptions, RealtimeTextToSpeechEvent, RealtimeTextToSpeechManagedConnectOptions, RealtimeTextToSpeechMessage, RealtimeTextToSpeechSession, RealtimeTextToSpeechSessionRequest, SavedVoice, SaveVoiceRequest, StreamTextToSpeechOptions, TextToSpeechRequest, TtsEnhanceRequest, TtsEnhanceResponse, Usage, UsageParams, Voice, VoiceClonePreview, VoiceClonePreviewRequest, VoiceDesignRequest, VoiceDesignResponse, VoiceEditRequest, VoiceList, VoiceSearchParams, VoiceSettings } from "./types.js";
2
+ import type { AudioRequestOptions, BreezeBlueWebSocket, AsyncTextToSpeechJob, Balance, BreezeBlueClientOptions, GenericStatus, GenerationJob, HistoryItem, HistoryList, HistoryListParams, Model, RequestOptions, RealtimeTextToSpeechConnectOptions, RealtimeTextToSpeechEvent, RealtimeTextToSpeechManagedConnectOptions, RealtimeTextToSpeechMessage, RealtimeTextToSpeechSession, RealtimeTextToSpeechSessionRequest, SavedVoice, SaveVoiceRequest, StreamTextToSpeechOptions, TextToSpeechRequest, TtsEnhanceRequest, TtsEnhanceResponse, Usage, UsageParams, Voice, VoiceClonePreview, VoiceClonePreviewRequest, VoiceDesignRequest, VoiceDesignResponse, VoiceEditRequest, VoiceList, VoiceMetadataOptions, VoiceSearchParams, VoiceSettings } from "./types.js";
3
3
  export declare class BreezeBlueClient {
4
4
  readonly apiKey: string | undefined;
5
5
  readonly baseUrl: string;
@@ -212,7 +212,12 @@ declare class VoicesResource {
212
212
  search(params?: VoiceSearchParams, options?: RequestOptions): Promise<VoiceList>;
213
213
  get(voiceId: string, options?: RequestOptions): Promise<Voice>;
214
214
  random(options?: RequestOptions): Promise<Voice>;
215
+ /** Return stable Voice Metadata codes and language-accent constraints. */
216
+ metadataOptions(options?: RequestOptions): Promise<VoiceMetadataOptions>;
215
217
  edit(voiceId: string, request: VoiceEditRequest, options?: RequestOptions): Promise<GenericStatus>;
218
+ updateTags(voiceId: string, tags: string[], options?: RequestOptions): Promise<Voice>;
219
+ favorite(voiceId: string, options?: RequestOptions): Promise<Voice>;
220
+ unfavorite(voiceId: string, options?: RequestOptions): Promise<Voice>;
216
221
  delete(voiceId: string, options?: RequestOptions): Promise<GenericStatus>;
217
222
  getSettings(voiceId: string, options?: RequestOptions): Promise<Required<VoiceSettings>>;
218
223
  editSettings(voiceId: string, settings: VoiceSettings, options?: RequestOptions): Promise<Required<VoiceSettings>>;
package/dist/client.js CHANGED
@@ -1494,18 +1494,39 @@ class VoicesResource {
1494
1494
  * semantic and text relevance; personal voices match by name, description,
1495
1495
  * or identifier.
1496
1496
  */
1497
- search(params = {}, options) {
1498
- return this.client.requestJson("GET", "/v1/voices", params, undefined, options);
1497
+ async search(params = {}, options) {
1498
+ const result = await this.client.requestJson("GET", "/v1/voices", params, undefined, options);
1499
+ return Array.isArray(result.voices)
1500
+ ? { ...result, voices: result.voices.map(stripHiddenVoiceFields) }
1501
+ : result;
1499
1502
  }
1500
- get(voiceId, options) {
1501
- return this.client.requestJson("GET", `/v1/voices/${encodeURIComponent(voiceId)}`, undefined, undefined, options);
1503
+ async get(voiceId, options) {
1504
+ const result = await this.client.requestJson("GET", `/v1/voices/${encodeURIComponent(voiceId)}`, undefined, undefined, options);
1505
+ return stripHiddenVoiceFields(result);
1502
1506
  }
1503
- random(options) {
1504
- return this.client.requestJson("GET", "/v1/voices/random", undefined, undefined, options);
1507
+ async random(options) {
1508
+ const result = await this.client.requestJson("GET", "/v1/voices/random", undefined, undefined, options);
1509
+ return stripHiddenVoiceFields(result);
1510
+ }
1511
+ /** Return stable Voice Metadata codes and language-accent constraints. */
1512
+ metadataOptions(options) {
1513
+ return this.client.requestJson("GET", "/v1/voice-metadata/options", undefined, undefined, options);
1505
1514
  }
1506
1515
  edit(voiceId, request, options) {
1507
1516
  return this.client.requestJson("PATCH", `/v1/voices/${encodeURIComponent(voiceId)}`, undefined, voiceEditForm(request), options);
1508
1517
  }
1518
+ async updateTags(voiceId, tags, options) {
1519
+ const result = await this.client.requestJson("PUT", `/v1/voices/${encodeURIComponent(voiceId)}/tags`, undefined, { tags }, options);
1520
+ return stripHiddenVoiceFields(result);
1521
+ }
1522
+ async favorite(voiceId, options) {
1523
+ const result = await this.client.requestJson("PUT", `/v1/voices/${encodeURIComponent(voiceId)}/favorite`, undefined, undefined, options);
1524
+ return stripHiddenVoiceFields(result);
1525
+ }
1526
+ async unfavorite(voiceId, options) {
1527
+ const result = await this.client.requestJson("DELETE", `/v1/voices/${encodeURIComponent(voiceId)}/favorite`, undefined, undefined, options);
1528
+ return stripHiddenVoiceFields(result);
1529
+ }
1509
1530
  delete(voiceId, options) {
1510
1531
  return this.client.requestJson("DELETE", `/v1/voices/${encodeURIComponent(voiceId)}`, undefined, undefined, options);
1511
1532
  }
@@ -1538,11 +1559,11 @@ class VoicesResource {
1538
1559
  return this.client.requestAudio("GET", `/v1/voice-previews/${encodeURIComponent(generatedVoiceId)}/stream`, { outputFormat: options.outputFormat }, undefined, options);
1539
1560
  }
1540
1561
  /** Persist a clone or design preview as a real voice asset. */
1541
- savePreview(request, options) {
1542
- return this.client.requestJson("POST", `/v1/voice-previews/${encodeURIComponent(request.generatedVoiceId)}/save`, undefined, {
1562
+ async savePreview(request, options) {
1563
+ const result = await this.client.requestJson("POST", `/v1/voice-previews/${encodeURIComponent(request.generatedVoiceId)}/save`, undefined, {
1543
1564
  voiceName: request.voiceName,
1544
1565
  voiceDescription: request.voiceDescription,
1545
- labels: request.labels,
1566
+ tags: request.tags,
1546
1567
  primaryCategoryCode: request.primaryCategoryCode,
1547
1568
  visibility: request.visibility,
1548
1569
  playedNotSelectedVoiceIds: request.playedNotSelectedVoiceIds,
@@ -1552,6 +1573,7 @@ class VoicesResource {
1552
1573
  tone: request.tone,
1553
1574
  accent: request.accent,
1554
1575
  }, options);
1576
+ return stripHiddenVoiceFields(result);
1555
1577
  }
1556
1578
  }
1557
1579
  class HistoryResource {
@@ -1654,7 +1676,13 @@ function buildUrl(baseUrl, path, params) {
1654
1676
  for (const [key, value] of Object.entries(params ?? {})) {
1655
1677
  if (value === undefined || value === null)
1656
1678
  continue;
1657
- url.searchParams.set(key, String(value));
1679
+ if (Array.isArray(value)) {
1680
+ for (const item of value)
1681
+ url.searchParams.append(key, String(item));
1682
+ }
1683
+ else {
1684
+ url.searchParams.set(key, String(value));
1685
+ }
1658
1686
  }
1659
1687
  return url.toString();
1660
1688
  }
@@ -1684,7 +1712,7 @@ function clonePreviewForm(request) {
1684
1712
  const form = new FormData();
1685
1713
  form.set("name", request.name);
1686
1714
  appendOptional(form, "description", request.description);
1687
- appendOptional(form, "labels", request.labels ? JSON.stringify(request.labels) : undefined);
1715
+ appendOptional(form, "language_code", request.languageCode);
1688
1716
  appendOptional(form, "text", request.text);
1689
1717
  appendOptional(form, "instructions", request.instructions);
1690
1718
  for (const file of normalizeFiles(request.file, request.files, { required: true })) {
@@ -1696,7 +1724,10 @@ function voiceEditForm(request) {
1696
1724
  const form = new FormData();
1697
1725
  appendOptional(form, "name", request.name);
1698
1726
  appendOptional(form, "description", request.description);
1699
- appendOptional(form, "labels", request.labels ? JSON.stringify(request.labels) : undefined);
1727
+ if (request.tags !== undefined) {
1728
+ for (const tag of request.tags)
1729
+ form.append("tags", tag);
1730
+ }
1700
1731
  appendOptional(form, "primary_category_code", request.primaryCategoryCode);
1701
1732
  appendOptional(form, "visibility", request.visibility);
1702
1733
  appendOptional(form, "language_code", request.languageCode);
@@ -1717,6 +1748,11 @@ function voiceEditForm(request) {
1717
1748
  }
1718
1749
  return form;
1719
1750
  }
1751
+ function stripHiddenVoiceFields(voice) {
1752
+ const result = { ...voice };
1753
+ delete result.labels;
1754
+ return result;
1755
+ }
1720
1756
  function appendNullable(form, key, value) {
1721
1757
  if (value === undefined)
1722
1758
  return;
package/dist/types.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { VoiceAccent, VoiceAge, VoiceGender, VoiceTone } from "./voice-metadata.js";
1
+ import type { VoiceAccent, VoiceAge, VoiceGender, VoiceLanguageCode, VoiceTone } from "./voice-metadata.js";
2
2
  export type JsonObject = Record<string, unknown>;
3
3
  export type BreezeBlueFetch = typeof fetch;
4
4
  export interface BreezeBlueClientOptions {
@@ -303,14 +303,15 @@ export interface Voice {
303
303
  name: string;
304
304
  origin: string;
305
305
  voiceType: string;
306
- labels: Record<string, string>;
306
+ tags: string[];
307
+ isFavorited: boolean;
307
308
  previewUrl?: string | null;
308
309
  settings: Required<VoiceSettings>;
309
310
  description?: string | null;
310
311
  createdAtUnix?: number | null;
311
312
  primaryCategoryCode?: string | null;
312
313
  visibility?: string | null;
313
- languageCode: string;
314
+ languageCode: VoiceLanguageCode;
314
315
  gender: VoiceGender | null;
315
316
  age: VoiceAge | null;
316
317
  tone: VoiceTone[];
@@ -321,12 +322,14 @@ export interface SavedVoice {
321
322
  voiceId: string;
322
323
  name: string;
323
324
  origin: string;
325
+ tags: string[];
326
+ isFavorited: boolean;
324
327
  previewUrl?: string | null;
325
328
  description?: string | null;
326
329
  createdAtUnix?: number | null;
327
330
  primaryCategoryCode?: string | null;
328
331
  visibility?: string | null;
329
- languageCode: string;
332
+ languageCode: VoiceLanguageCode;
330
333
  gender: VoiceGender | null;
331
334
  age: VoiceAge | null;
332
335
  tone: VoiceTone[];
@@ -340,9 +343,17 @@ export interface VoiceList {
340
343
  page: number;
341
344
  pageSize: number;
342
345
  }
346
+ export interface VoiceMetadataOptions {
347
+ languageCodes: VoiceLanguageCode[];
348
+ genderCodes: VoiceGender[];
349
+ ageCodes: VoiceAge[];
350
+ toneCodes: VoiceTone[];
351
+ toneMaxItems: number;
352
+ accentCodesByLanguage: Record<VoiceLanguageCode, VoiceAccent[]>;
353
+ }
343
354
  export interface VoiceSearchParams {
344
355
  search?: string;
345
- languageCode?: string;
356
+ languageCode?: VoiceLanguageCode;
346
357
  origin?: "designed" | "cloned" | string;
347
358
  voiceType?: "all" | "default" | "personal" | string;
348
359
  sort?: "created_at_unix" | "name" | string;
@@ -350,6 +361,8 @@ export interface VoiceSearchParams {
350
361
  nextPageToken?: string;
351
362
  page?: number;
352
363
  pageSize?: number;
364
+ favoritesOnly?: boolean;
365
+ tags?: string[];
353
366
  }
354
367
  export interface GenericStatus {
355
368
  status: string;
@@ -365,8 +378,8 @@ export interface VoiceClonePreviewRequest {
365
378
  file?: UploadData | UploadFile;
366
379
  files?: Array<UploadData | UploadFile>;
367
380
  description?: string;
368
- labels?: Record<string, string>;
369
381
  removeBackgroundNoise?: boolean;
382
+ languageCode?: VoiceLanguageCode;
370
383
  text?: string;
371
384
  instructions?: string;
372
385
  }
@@ -377,10 +390,10 @@ export interface VoiceClonePreview {
377
390
  export interface VoiceEditRequest {
378
391
  name?: string;
379
392
  description?: string;
380
- labels?: Record<string, string>;
393
+ tags?: string[];
381
394
  primaryCategoryCode?: string;
382
395
  visibility?: "private" | "public" | string;
383
- languageCode?: string;
396
+ languageCode?: VoiceLanguageCode;
384
397
  gender?: VoiceGender | null;
385
398
  age?: VoiceAge | null;
386
399
  tone?: VoiceTone[];
@@ -392,7 +405,7 @@ export interface VoiceDesignRequest {
392
405
  voiceDescription: string;
393
406
  text?: string;
394
407
  modelId?: string;
395
- languageCode?: string;
408
+ languageCode?: VoiceLanguageCode;
396
409
  autoGenerateText?: boolean;
397
410
  loudness?: number;
398
411
  quality?: number;
@@ -414,11 +427,11 @@ export interface SaveVoiceRequest {
414
427
  generatedVoiceId: string;
415
428
  voiceName: string;
416
429
  voiceDescription?: string | null;
417
- labels?: Record<string, string>;
430
+ tags?: string[];
418
431
  primaryCategoryCode?: string;
419
432
  visibility?: "private" | "public" | string;
420
433
  playedNotSelectedVoiceIds?: string[];
421
- languageCode?: string;
434
+ languageCode: VoiceLanguageCode;
422
435
  gender?: VoiceGender | null;
423
436
  age?: VoiceAge | null;
424
437
  tone?: VoiceTone[];
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const SDK_VERSION = "0.10.0";
1
+ export declare const SDK_VERSION = "0.11.0";
2
2
  export declare const SDK_NAME = "@breeze.blue/sdk";
package/dist/version.js CHANGED
@@ -1,2 +1,2 @@
1
- export const SDK_VERSION = "0.10.0";
1
+ export const SDK_VERSION = "0.11.0";
2
2
  export const SDK_NAME = "@breeze.blue/sdk";
@@ -1,6 +1,8 @@
1
1
  export declare const VOICE_GENDER_CODES: readonly ["male", "female", "neutral"];
2
2
  export declare const VOICE_AGE_CODES: readonly ["child", "young", "middle_aged", "old"];
3
3
  export declare const VOICE_TONE_CODES: readonly ["warm", "calm", "bright", "gentle", "energetic", "authoritative", "sincere", "weary", "precise", "refined", "urgent", "friendly", "articulate", "steady", "playful", "compassionate", "reflective", "measured", "rhythmic", "passionate"];
4
+ export declare const VOICE_LANGUAGE_CODES: readonly ["ar", "cs", "de", "el", "en", "es", "fi", "fr", "hi", "id", "it", "ja", "ko", "nl", "pl", "pt", "ro", "ru", "th", "tr", "uk", "vi", "zh"];
5
+ export declare const VOICE_TONE_MAX_ITEMS: 3;
4
6
  export declare const VOICE_ACCENT_CODES_BY_LANGUAGE: {
5
7
  readonly en: readonly ["american", "british", "scottish", "irish", "australian", "canadian", "us_southern", "us_new_york", "indian", "south_african", "russian", "japanese", "korean", "chinese"];
6
8
  readonly zh: readonly ["mandarin_guangdong", "mandarin_northeastern", "mandarin_shaanxi", "mandarin_shanghai", "mandarin_sichuan", "mandarin_yunnan", "mandarin_henan", "cantonese"];
@@ -8,4 +10,5 @@ export declare const VOICE_ACCENT_CODES_BY_LANGUAGE: {
8
10
  export type VoiceGender = (typeof VOICE_GENDER_CODES)[number];
9
11
  export type VoiceAge = (typeof VOICE_AGE_CODES)[number];
10
12
  export type VoiceTone = (typeof VOICE_TONE_CODES)[number];
13
+ export type VoiceLanguageCode = (typeof VOICE_LANGUAGE_CODES)[number];
11
14
  export type VoiceAccent = (typeof VOICE_ACCENT_CODES_BY_LANGUAGE)[keyof typeof VOICE_ACCENT_CODES_BY_LANGUAGE][number];
@@ -2,6 +2,8 @@
2
2
  export const VOICE_GENDER_CODES = ["male", "female", "neutral"];
3
3
  export const VOICE_AGE_CODES = ["child", "young", "middle_aged", "old"];
4
4
  export const VOICE_TONE_CODES = ["warm", "calm", "bright", "gentle", "energetic", "authoritative", "sincere", "weary", "precise", "refined", "urgent", "friendly", "articulate", "steady", "playful", "compassionate", "reflective", "measured", "rhythmic", "passionate"];
5
+ export const VOICE_LANGUAGE_CODES = ["ar", "cs", "de", "el", "en", "es", "fi", "fr", "hi", "id", "it", "ja", "ko", "nl", "pl", "pt", "ro", "ru", "th", "tr", "uk", "vi", "zh"];
6
+ export const VOICE_TONE_MAX_ITEMS = 3;
5
7
  export const VOICE_ACCENT_CODES_BY_LANGUAGE = {
6
8
  en: ["american", "british", "scottish", "irish", "australian", "canadian", "us_southern", "us_new_york", "indian", "south_african", "russian", "japanese", "korean", "chinese"],
7
9
  zh: ["mandarin_guangdong", "mandarin_northeastern", "mandarin_shaanxi", "mandarin_shanghai", "mandarin_sichuan", "mandarin_yunnan", "mandarin_henan", "cantonese"],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@breeze.blue/sdk",
3
- "version": "0.10.0",
3
+ "version": "0.11.0",
4
4
  "description": "ESM-first TypeScript SDK for the Breeze Blue Developer API.",
5
5
  "license": "MIT",
6
6
  "author": "Breeze Blue <support@breeze.blue>",