@breeze.blue/sdk 0.10.0 → 0.12.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,22 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.12.0
4
+
5
+ - Voice listings preserve the `created_at_unix desc` default and support the
6
+ shared Daily Trend with `{ sort: "trend", voiceType: "default" }`, signed
7
+ snapshot pagination, and language/category/gender/age/tone/accent filters.
8
+
9
+ ## 0.11.0
10
+
11
+ - Added canonical Voice `tags`, personal tag overrides, favorite management,
12
+ exact tag filters, and `voices.updateTags()` / `favorite()` / `unfavorite()`.
13
+ - `voices.savePreview(...)` now requires `languageCode`, preventing saved
14
+ voices from being created without explicit reference-language metadata.
15
+ - Added `voices.metadataOptions()` and the typed `VoiceLanguageCode` contract
16
+ for discovering Voice Metadata codes and language-to-accent constraints.
17
+ - Sync and async TTS accept explicit sample-rate and bitrate output profiles,
18
+ such as `wav_48000` and `mp3_44100_128`.
19
+
3
20
  ## 0.10.0
4
21
 
5
22
  - Added typed Voice Metadata codes and camelCase response fields for gender,
@@ -205,7 +222,7 @@
205
222
 
206
223
  ## 0.1.2
207
224
 
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.
225
+ - 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
226
  - Removed remaining ElevenLabs-positioning copy from the README and package keywords. Quickstart and reference examples use the published packages only.
210
227
 
211
228
  ## 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,18 @@ or voice ID.
402
406
 
403
407
  ```ts
404
408
  const voices = await client.voices.search({ search: "calm documentary narrator" });
409
+ const newestFirst = await client.voices.search();
410
+ const dailyTrend = await client.voices.search({
411
+ voiceType: "default",
412
+ sort: "trend",
413
+ languageCode: "zh",
414
+ gender: ["female", "neutral"],
415
+ tone: ["warm"],
416
+ });
417
+ const taggedFavorites = await client.voices.search({
418
+ favoritesOnly: true,
419
+ tags: ["narration", "novel=三体"],
420
+ });
405
421
  const firstVoiceId = voices.voices[0].voiceId;
406
422
 
407
423
  const voice = await client.voices.get(firstVoiceId);
@@ -409,8 +425,18 @@ const settings = await client.voices.getSettings(firstVoiceId);
409
425
 
410
426
  const randomVoice = await client.voices.random();
411
427
  console.log(randomVoice.voiceId, randomVoice.name);
428
+
429
+ // Discover the current code-only Voice Metadata contract before building a form.
430
+ const metadataOptions = await client.voices.metadataOptions();
431
+ console.log(metadataOptions.languageCodes);
432
+ console.log(metadataOptions.accentCodesByLanguage.en);
412
433
  ```
413
434
 
435
+ Voice listings keep the published default of stable creation-time order from
436
+ newest to oldest. Use `{ sort: "trend", voiceType: "default" }` for the shared
437
+ Daily Trend order. Search queries remain relevance-ranked; Trend is only a
438
+ weak prior within the same relevance tier.
439
+
414
440
  Breeze voice creation is always two steps: produce a **preview**, let the
415
441
  user accept it, then **save the preview** as a real voice. Two ways to
416
442
  produce a preview:
@@ -454,6 +480,7 @@ const saved = await client.voices.savePreview({
454
480
  age: "middle_aged",
455
481
  tone: ["warm", "articulate"],
456
482
  accent: "american",
483
+ tags: ["narration", "novel=三体"],
457
484
  });
458
485
  ```
459
486
 
@@ -468,12 +495,18 @@ await client.voices.edit(saved.voiceId, {
468
495
  // null clears nullable metadata; [] clears tone. Omitted fields remain unchanged.
469
496
  await client.voices.edit(saved.voiceId, { accent: null, tone: [] });
470
497
  await client.voices.editSettings(saved.voiceId, { guidanceScale: 1.2 });
498
+ await client.voices.favorite(firstVoiceId);
499
+ await client.voices.updateTags(firstVoiceId, ["narration", "novel=三体"]);
500
+ await client.voices.updateTags(firstVoiceId, []); // Resume owner tag inheritance.
501
+ await client.voices.unfavorite(firstVoiceId);
471
502
  await client.voices.delete(saved.voiceId);
472
503
  ```
473
504
 
474
505
  Voice Metadata uses stable code values. `gender`, `age`, and `accent` may be
475
506
  `null`; `tone` contains up to three distinct codes. English and Chinese use
476
507
  different accent code sets, and other languages require `accent: null`.
508
+ Call `client.voices.metadataOptions()` to discover every accepted code and the
509
+ language-to-accent cascade at runtime.
477
510
 
478
511
  ## History, Models, and Account
479
512
 
@@ -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;
@@ -207,12 +207,19 @@ declare class VoicesResource {
207
207
  /**
208
208
  * Search every voice visible to the account. Catalog results use hybrid
209
209
  * semantic and text relevance; personal voices match by name, description,
210
- * or identifier.
210
+ * or identifier. Listings default to stable creation-time order from newest
211
+ * to oldest. Pass sort: "trend" with voiceType: "default" for the shared
212
+ * Daily Trend order.
211
213
  */
212
214
  search(params?: VoiceSearchParams, options?: RequestOptions): Promise<VoiceList>;
213
215
  get(voiceId: string, options?: RequestOptions): Promise<Voice>;
214
216
  random(options?: RequestOptions): Promise<Voice>;
217
+ /** Return stable Voice Metadata codes and language-accent constraints. */
218
+ metadataOptions(options?: RequestOptions): Promise<VoiceMetadataOptions>;
215
219
  edit(voiceId: string, request: VoiceEditRequest, options?: RequestOptions): Promise<GenericStatus>;
220
+ updateTags(voiceId: string, tags: string[], options?: RequestOptions): Promise<Voice>;
221
+ favorite(voiceId: string, options?: RequestOptions): Promise<Voice>;
222
+ unfavorite(voiceId: string, options?: RequestOptions): Promise<Voice>;
216
223
  delete(voiceId: string, options?: RequestOptions): Promise<GenericStatus>;
217
224
  getSettings(voiceId: string, options?: RequestOptions): Promise<Required<VoiceSettings>>;
218
225
  editSettings(voiceId: string, settings: VoiceSettings, options?: RequestOptions): Promise<Required<VoiceSettings>>;
package/dist/client.js CHANGED
@@ -1492,20 +1492,43 @@ class VoicesResource {
1492
1492
  /**
1493
1493
  * Search every voice visible to the account. Catalog results use hybrid
1494
1494
  * semantic and text relevance; personal voices match by name, description,
1495
- * or identifier.
1495
+ * or identifier. Listings default to stable creation-time order from newest
1496
+ * to oldest. Pass sort: "trend" with voiceType: "default" for the shared
1497
+ * Daily Trend order.
1496
1498
  */
1497
- search(params = {}, options) {
1498
- return this.client.requestJson("GET", "/v1/voices", params, undefined, options);
1499
+ async search(params = {}, options) {
1500
+ const result = await this.client.requestJson("GET", "/v1/voices", { sort: "created_at_unix", sortDirection: "desc", ...params }, undefined, options);
1501
+ return Array.isArray(result.voices)
1502
+ ? { ...result, voices: result.voices.map(stripHiddenVoiceFields) }
1503
+ : result;
1499
1504
  }
1500
- get(voiceId, options) {
1501
- return this.client.requestJson("GET", `/v1/voices/${encodeURIComponent(voiceId)}`, undefined, undefined, options);
1505
+ async get(voiceId, options) {
1506
+ const result = await this.client.requestJson("GET", `/v1/voices/${encodeURIComponent(voiceId)}`, undefined, undefined, options);
1507
+ return stripHiddenVoiceFields(result);
1502
1508
  }
1503
- random(options) {
1504
- return this.client.requestJson("GET", "/v1/voices/random", undefined, undefined, options);
1509
+ async random(options) {
1510
+ const result = await this.client.requestJson("GET", "/v1/voices/random", undefined, undefined, options);
1511
+ return stripHiddenVoiceFields(result);
1512
+ }
1513
+ /** Return stable Voice Metadata codes and language-accent constraints. */
1514
+ metadataOptions(options) {
1515
+ return this.client.requestJson("GET", "/v1/voice-metadata/options", undefined, undefined, options);
1505
1516
  }
1506
1517
  edit(voiceId, request, options) {
1507
1518
  return this.client.requestJson("PATCH", `/v1/voices/${encodeURIComponent(voiceId)}`, undefined, voiceEditForm(request), options);
1508
1519
  }
1520
+ async updateTags(voiceId, tags, options) {
1521
+ const result = await this.client.requestJson("PUT", `/v1/voices/${encodeURIComponent(voiceId)}/tags`, undefined, { tags }, options);
1522
+ return stripHiddenVoiceFields(result);
1523
+ }
1524
+ async favorite(voiceId, options) {
1525
+ const result = await this.client.requestJson("PUT", `/v1/voices/${encodeURIComponent(voiceId)}/favorite`, undefined, undefined, options);
1526
+ return stripHiddenVoiceFields(result);
1527
+ }
1528
+ async unfavorite(voiceId, options) {
1529
+ const result = await this.client.requestJson("DELETE", `/v1/voices/${encodeURIComponent(voiceId)}/favorite`, undefined, undefined, options);
1530
+ return stripHiddenVoiceFields(result);
1531
+ }
1509
1532
  delete(voiceId, options) {
1510
1533
  return this.client.requestJson("DELETE", `/v1/voices/${encodeURIComponent(voiceId)}`, undefined, undefined, options);
1511
1534
  }
@@ -1538,11 +1561,11 @@ class VoicesResource {
1538
1561
  return this.client.requestAudio("GET", `/v1/voice-previews/${encodeURIComponent(generatedVoiceId)}/stream`, { outputFormat: options.outputFormat }, undefined, options);
1539
1562
  }
1540
1563
  /** 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, {
1564
+ async savePreview(request, options) {
1565
+ const result = await this.client.requestJson("POST", `/v1/voice-previews/${encodeURIComponent(request.generatedVoiceId)}/save`, undefined, {
1543
1566
  voiceName: request.voiceName,
1544
1567
  voiceDescription: request.voiceDescription,
1545
- labels: request.labels,
1568
+ tags: request.tags,
1546
1569
  primaryCategoryCode: request.primaryCategoryCode,
1547
1570
  visibility: request.visibility,
1548
1571
  playedNotSelectedVoiceIds: request.playedNotSelectedVoiceIds,
@@ -1552,6 +1575,7 @@ class VoicesResource {
1552
1575
  tone: request.tone,
1553
1576
  accent: request.accent,
1554
1577
  }, options);
1578
+ return stripHiddenVoiceFields(result);
1555
1579
  }
1556
1580
  }
1557
1581
  class HistoryResource {
@@ -1654,7 +1678,13 @@ function buildUrl(baseUrl, path, params) {
1654
1678
  for (const [key, value] of Object.entries(params ?? {})) {
1655
1679
  if (value === undefined || value === null)
1656
1680
  continue;
1657
- url.searchParams.set(key, String(value));
1681
+ if (Array.isArray(value)) {
1682
+ for (const item of value)
1683
+ url.searchParams.append(key, String(item));
1684
+ }
1685
+ else {
1686
+ url.searchParams.set(key, String(value));
1687
+ }
1658
1688
  }
1659
1689
  return url.toString();
1660
1690
  }
@@ -1684,7 +1714,7 @@ function clonePreviewForm(request) {
1684
1714
  const form = new FormData();
1685
1715
  form.set("name", request.name);
1686
1716
  appendOptional(form, "description", request.description);
1687
- appendOptional(form, "labels", request.labels ? JSON.stringify(request.labels) : undefined);
1717
+ appendOptional(form, "language_code", request.languageCode);
1688
1718
  appendOptional(form, "text", request.text);
1689
1719
  appendOptional(form, "instructions", request.instructions);
1690
1720
  for (const file of normalizeFiles(request.file, request.files, { required: true })) {
@@ -1696,7 +1726,10 @@ function voiceEditForm(request) {
1696
1726
  const form = new FormData();
1697
1727
  appendOptional(form, "name", request.name);
1698
1728
  appendOptional(form, "description", request.description);
1699
- appendOptional(form, "labels", request.labels ? JSON.stringify(request.labels) : undefined);
1729
+ if (request.tags !== undefined) {
1730
+ for (const tag of request.tags)
1731
+ form.append("tags", tag);
1732
+ }
1700
1733
  appendOptional(form, "primary_category_code", request.primaryCategoryCode);
1701
1734
  appendOptional(form, "visibility", request.visibility);
1702
1735
  appendOptional(form, "language_code", request.languageCode);
@@ -1717,6 +1750,11 @@ function voiceEditForm(request) {
1717
1750
  }
1718
1751
  return form;
1719
1752
  }
1753
+ function stripHiddenVoiceFields(voice) {
1754
+ const result = { ...voice };
1755
+ delete result.labels;
1756
+ return result;
1757
+ }
1720
1758
  function appendNullable(form, key, value) {
1721
1759
  if (value === undefined)
1722
1760
  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,16 +343,31 @@ 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;
357
+ primaryCategoryCode?: string;
358
+ gender?: VoiceGender[];
359
+ age?: VoiceAge[];
360
+ tone?: VoiceTone[];
361
+ accent?: VoiceAccent;
346
362
  origin?: "designed" | "cloned" | string;
347
363
  voiceType?: "all" | "default" | "personal" | string;
348
- sort?: "created_at_unix" | "name" | string;
364
+ sort?: "created_at_unix" | "name" | "trend" | string;
349
365
  sortDirection?: "asc" | "desc";
350
366
  nextPageToken?: string;
351
367
  page?: number;
352
368
  pageSize?: number;
369
+ favoritesOnly?: boolean;
370
+ tags?: string[];
353
371
  }
354
372
  export interface GenericStatus {
355
373
  status: string;
@@ -365,8 +383,8 @@ export interface VoiceClonePreviewRequest {
365
383
  file?: UploadData | UploadFile;
366
384
  files?: Array<UploadData | UploadFile>;
367
385
  description?: string;
368
- labels?: Record<string, string>;
369
386
  removeBackgroundNoise?: boolean;
387
+ languageCode?: VoiceLanguageCode;
370
388
  text?: string;
371
389
  instructions?: string;
372
390
  }
@@ -377,10 +395,10 @@ export interface VoiceClonePreview {
377
395
  export interface VoiceEditRequest {
378
396
  name?: string;
379
397
  description?: string;
380
- labels?: Record<string, string>;
398
+ tags?: string[];
381
399
  primaryCategoryCode?: string;
382
400
  visibility?: "private" | "public" | string;
383
- languageCode?: string;
401
+ languageCode?: VoiceLanguageCode;
384
402
  gender?: VoiceGender | null;
385
403
  age?: VoiceAge | null;
386
404
  tone?: VoiceTone[];
@@ -392,7 +410,7 @@ export interface VoiceDesignRequest {
392
410
  voiceDescription: string;
393
411
  text?: string;
394
412
  modelId?: string;
395
- languageCode?: string;
413
+ languageCode?: VoiceLanguageCode;
396
414
  autoGenerateText?: boolean;
397
415
  loudness?: number;
398
416
  quality?: number;
@@ -414,11 +432,11 @@ export interface SaveVoiceRequest {
414
432
  generatedVoiceId: string;
415
433
  voiceName: string;
416
434
  voiceDescription?: string | null;
417
- labels?: Record<string, string>;
435
+ tags?: string[];
418
436
  primaryCategoryCode?: string;
419
437
  visibility?: "private" | "public" | string;
420
438
  playedNotSelectedVoiceIds?: string[];
421
- languageCode?: string;
439
+ languageCode: VoiceLanguageCode;
422
440
  gender?: VoiceGender | null;
423
441
  age?: VoiceAge | null;
424
442
  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.12.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.12.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,9 +1,9 @@
1
1
  {
2
2
  "name": "@breeze.blue/sdk",
3
- "version": "0.10.0",
3
+ "version": "0.12.0",
4
4
  "description": "ESM-first TypeScript SDK for the Breeze Blue Developer API.",
5
5
  "license": "MIT",
6
- "author": "Breeze Blue <support@breeze.blue>",
6
+ "author": "Breeze Blue <support@breezeblue.ai>",
7
7
  "homepage": "https://breezeblue.ai",
8
8
  "repository": {
9
9
  "type": "git",