@breeze.blue/sdk 0.17.0 → 0.19.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,15 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.19.0
4
+
5
+ - Create Voice Remix candidates from custom descriptions or curated presets, with automatic input preparation and Expressive (4) as the default strength.
6
+ - List Remix presets, reuse a prepared performance across candidates, and read source metadata and original-audio comparisons.
7
+ - Retry Remix submissions with an idempotency key and save candidates using their source voice's name and description by default.
8
+
9
+ ## 0.18.0
10
+
11
+ - Create asynchronous speech jobs with word timestamps and read timing from completed job results.
12
+
3
13
  ## 0.17.0
4
14
 
5
15
  - Generate synchronous speech or stream audio with word timestamps and safe stream cleanup.
package/README.md CHANGED
@@ -436,7 +436,8 @@ console.log(metadataOptions.accentCodesByLanguage.en);
436
436
 
437
437
  Voice listings keep the published default of stable creation-time order from
438
438
  newest to oldest. Use `{ sort: "trend", voiceType: "default" }` for the shared
439
- Daily Trend order. Search queries remain relevance-ranked; Trend is only a
439
+ Daily Trend order. Eligible voices not yet ranked follow the snapshot members;
440
+ returned page tokens pin the initial supplemental candidates. Search queries remain relevance-ranked; Trend is only a
440
441
  weak prior within the same relevance tier.
441
442
 
442
443
  Breeze voice creation is always two steps: produce a **preview**, let the
@@ -487,6 +488,45 @@ while (localized.status !== "ready") {
487
488
  generatedVoiceId = localized.generatedVoiceId!;
488
489
  ```
489
490
 
491
+ Voice Remix creates a same-language candidate from an owned or official voice
492
+ and a custom description or preset. Each successful candidate uses the Voice Design candidate
493
+ price. The source remains unchanged.
494
+
495
+ ```ts
496
+ const remixJob = await client.voices.createRemixPreview({
497
+ voiceId: firstVoiceId,
498
+ prompt: "Make the voice warmer and more expressive.",
499
+ guidanceScale: 4,
500
+ });
501
+ let remix = await client.voices.getRemixPreview(remixJob.generationJobId);
502
+ while (remix.status !== "ready") {
503
+ if (remix.status === "failed" || remix.status === "cancelled") {
504
+ throw new Error(remix.error?.detail ?? remix.status);
505
+ }
506
+ await new Promise((resolve) => setTimeout(resolve, 2000));
507
+ remix = await client.voices.getRemixPreview(remixJob.generationJobId);
508
+ }
509
+ generatedVoiceId = remix.generatedVoiceId!;
510
+ ```
511
+
512
+ Use `streamPreview` and `savePreview` with the generated ID to audition and save
513
+ a private, independent voice. A client timeout leaves the server job running.
514
+
515
+ Custom input is enhanced into an instruction and matching script in the source
516
+ language. List templates with `client.voices.listRemixPresets()` and pass
517
+ `presetId` instead of `prompt` to use one. Edited templates are enhanced;
518
+ unchanged templates are translated only when the source language differs.
519
+
520
+ To compare strengths, call `client.voices.prepareRemixPreview(...)` first and
521
+ pass its `preparationToken` to each create call with the same input. The token
522
+ lasts 24 hours. Values 2 / 4 / 6 / 8 mean Stable / Expressive / Creative / Intense;
523
+ 4 is the default. Web Auto compares separate candidates at 4, 6, and 8.
524
+ Use `options.headers["Idempotency-Key"]` to retry uncertain submissions safely,
525
+ with a distinct key per candidate. Status includes `comparisonAudioUrl`,
526
+ `comparisonText`, and `sourceVoice`. Saving without `voiceName` or
527
+ `voiceDescription` uses the source values.
528
+ See the [Voice Remix guide](https://docs.breezeblue.ai/guides/voice-remix).
529
+
490
530
  For the fastest first audio, generate one design preview as a live 24 kHz mono
491
531
  PCM response. The Node `stream()` helper consumes the response body directly;
492
532
  a clean end means `generatedVoiceId` is ready to save:
@@ -609,3 +649,7 @@ Pass `voiceSettings: { volume: 1.5 }` to apply a request-level linear amplitude
609
649
  Stream audio and word/token timestamps with `client.textToSpeech.streamWithTimestamps(...)`. Use `for await` to consume chunks containing `audioBase64` and `wordTimestamps`; breaking iteration closes the stream. Decode the audio separately and merge repeated word indices. See [Speech timing](https://docs.breezeblue.ai/guides/speech-timing) for complete examples and timing semantics.
610
650
 
611
651
  For a complete response, use `client.textToSpeech.convertWithTimestamps(...)`. It returns base64 audio, its content type, and the full word/token timestamp list. Decode the audio before saving or playback. See [Speech timing](https://docs.breezeblue.ai/guides/speech-timing) and [Convert with timestamps](https://docs.breezeblue.ai/api-reference/text-to-speech/convert-with-timestamps).
652
+
653
+ For background generation with timing, use `client.textToSpeech.createJobWithTimestamps(...)`. Poll with `client.generationJobs.get(jobId)`; a ready job includes `wordTimestamps` and the audio download URL.
654
+
655
+ Clone preview creation accepts an omitted name. The server uses the filename stem or `Cloned Voice`; saving a Clone preview without a name keeps its preview name. Other preview types still require a save name. Explicit names longer than 80 Unicode characters are rejected.
package/dist/client.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { SpeechTimingStream, type SpeechWithTimestamps } from "./timestamps.js";
2
2
  import { AudioResponse } from "./audio.js";
3
- import type { AudioRequestOptions, BreezeBlueWebSocket, AsyncTextToSpeechJob, Balance, BreezeBlueClientOptions, CurrentApiKeyResponse, 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, VoiceDesignStreamRequest, VoiceEditRequest, VoiceList, VoiceLocalizeJob, VoiceLocalizePreviewRequest, VoiceLocalizePreviewStatus, VoiceMetadataOptions, VoiceRandomParams, VoiceSearchParams, VoiceSettings } from "./types.js";
3
+ import type { AudioRequestOptions, BreezeBlueWebSocket, AsyncTextToSpeechJob, Balance, BreezeBlueClientOptions, CurrentApiKeyResponse, 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, VoiceDesignStreamRequest, VoiceEditRequest, VoiceList, VoiceLocalizeJob, VoiceLocalizePreviewRequest, VoiceLocalizePreviewStatus, VoiceRemixPreviewRequest, VoiceRemixPrepareRequest, VoiceRemixPresets, VoiceRemixPreparation, VoiceRemixJob, VoiceRemixPreviewStatus, VoiceMetadataOptions, VoiceRandomParams, VoiceSearchParams, VoiceSettings } from "./types.js";
4
4
  export declare class BreezeBlueClient {
5
5
  readonly apiKey: string | undefined;
6
6
  readonly baseUrl: string;
@@ -26,6 +26,7 @@ declare class TextToSpeechResource {
26
26
  constructor(client: BreezeBlueClient);
27
27
  convert(voiceId: string, request: TextToSpeechRequest, options?: AudioRequestOptions): Promise<AudioResponse>;
28
28
  createJob(voiceId: string, request: TextToSpeechRequest, options?: AudioRequestOptions): Promise<AsyncTextToSpeechJob>;
29
+ createJobWithTimestamps(voiceId: string, request: TextToSpeechRequest, options?: AudioRequestOptions): Promise<AsyncTextToSpeechJob>;
29
30
  stream(voiceId: string, request: TextToSpeechRequest, options?: StreamTextToSpeechOptions): Promise<AudioResponse>;
30
31
  convertWithTimestamps(voiceId: string, request: TextToSpeechRequest, options?: AudioRequestOptions): Promise<SpeechWithTimestamps>;
31
32
  streamWithTimestamps(voiceId: string, request: TextToSpeechRequest & {
@@ -251,6 +252,14 @@ declare class VoicesResource {
251
252
  * A clean end means `generatedVoiceId` is ready for {@link savePreview}.
252
253
  */
253
254
  streamDesignPreview(request: VoiceDesignStreamRequest, options?: RequestOptions): Promise<AudioResponse>;
255
+ /** List curated voice changes and their sample recordings. */
256
+ listRemixPresets(options?: RequestOptions): Promise<VoiceRemixPresets>;
257
+ /** Prepare once without generating audio; reuse the token for 24 hours with the same input. */
258
+ prepareRemixPreview(request: VoiceRemixPrepareRequest, options?: RequestOptions): Promise<VoiceRemixPreparation>;
259
+ /** Create one candidate. Custom input is enhanced automatically; guidance defaults to 4. */
260
+ createRemixPreview(request: VoiceRemixPreviewRequest, options?: RequestOptions): Promise<VoiceRemixJob>;
261
+ /** A polling timeout does not cancel the server task. Keep the job ID to resume polling. */
262
+ getRemixPreview(generationJobId: string, options?: RequestOptions): Promise<VoiceRemixPreviewStatus>;
254
263
  /**
255
264
  * Start a preview that speaks an existing voice in another language.
256
265
  * Localization runs as a background job: poll the returned
@@ -265,9 +274,9 @@ declare class VoicesResource {
265
274
  * is set only when the job ends in `failed`.
266
275
  */
267
276
  getLocalizePreview(generationJobId: string, options?: RequestOptions): Promise<VoiceLocalizePreviewStatus>;
268
- /** Download the completed audio of a clone or design preview. */
277
+ /** Download a ready Design, Clone, Remix or Localize preview. */
269
278
  streamPreview(generatedVoiceId: string, options?: AudioRequestOptions): Promise<AudioResponse>;
270
- /** Persist a clone or design preview as a real voice asset. */
279
+ /** Save a ready preview; Remix defaults name and description to its source. */
271
280
  savePreview(request: SaveVoiceRequest, options?: RequestOptions): Promise<SavedVoice>;
272
281
  }
273
282
  declare class HistoryResource {
package/dist/client.js CHANGED
@@ -113,6 +113,9 @@ class TextToSpeechResource {
113
113
  createJob(voiceId, request, options = {}) {
114
114
  return this.client.requestJson("POST", `/v1/text-to-speech/${encodeURIComponent(voiceId)}`, { outputFormat: options.outputFormat, delivery: "async" }, request, options);
115
115
  }
116
+ createJobWithTimestamps(voiceId, request, options = {}) {
117
+ return this.client.requestJson("POST", `/v1/text-to-speech/${encodeURIComponent(voiceId)}/with-timestamps`, { outputFormat: options.outputFormat, delivery: "async" }, request, options);
118
+ }
116
119
  stream(voiceId, request, options = {}) {
117
120
  return this.client.requestAudio("POST", `/v1/text-to-speech/${encodeURIComponent(voiceId)}/stream`, {
118
121
  outputFormat: options.outputFormat,
@@ -1577,6 +1580,22 @@ class VoicesResource {
1577
1580
  streamDesignPreview(request, options) {
1578
1581
  return this.client.requestAudio("POST", "/v1/voice-previews/design/stream", undefined, request, options);
1579
1582
  }
1583
+ /** List curated voice changes and their sample recordings. */
1584
+ listRemixPresets(options) {
1585
+ return this.client.requestJson("GET", "/v1/voice-previews/remix/presets", undefined, undefined, options);
1586
+ }
1587
+ /** Prepare once without generating audio; reuse the token for 24 hours with the same input. */
1588
+ prepareRemixPreview(request, options) {
1589
+ return this.client.requestJson("POST", "/v1/voice-previews/remix/prepare", undefined, request, options);
1590
+ }
1591
+ /** Create one candidate. Custom input is enhanced automatically; guidance defaults to 4. */
1592
+ createRemixPreview(request, options) {
1593
+ return this.client.requestJson("POST", "/v1/voice-previews/remix", undefined, request, options);
1594
+ }
1595
+ /** A polling timeout does not cancel the server task. Keep the job ID to resume polling. */
1596
+ getRemixPreview(generationJobId, options) {
1597
+ return this.client.requestJson("GET", `/v1/voice-previews/remix/${encodeURIComponent(generationJobId)}`, undefined, undefined, options);
1598
+ }
1580
1599
  /**
1581
1600
  * Start a preview that speaks an existing voice in another language.
1582
1601
  * Localization runs as a background job: poll the returned
@@ -1595,11 +1614,11 @@ class VoicesResource {
1595
1614
  getLocalizePreview(generationJobId, options) {
1596
1615
  return this.client.requestJson("GET", `/v1/voice-previews/localize/${encodeURIComponent(generationJobId)}`, undefined, undefined, options);
1597
1616
  }
1598
- /** Download the completed audio of a clone or design preview. */
1617
+ /** Download a ready Design, Clone, Remix or Localize preview. */
1599
1618
  streamPreview(generatedVoiceId, options = {}) {
1600
1619
  return this.client.requestAudio("GET", `/v1/voice-previews/${encodeURIComponent(generatedVoiceId)}/stream`, { outputFormat: options.outputFormat }, undefined, options);
1601
1620
  }
1602
- /** Persist a clone or design preview as a real voice asset. */
1621
+ /** Save a ready preview; Remix defaults name and description to its source. */
1603
1622
  async savePreview(request, options) {
1604
1623
  const result = await this.client.requestJson("POST", `/v1/voice-previews/${encodeURIComponent(request.generatedVoiceId)}/save`, undefined, {
1605
1624
  voiceName: request.voiceName,
@@ -1751,6 +1770,9 @@ function mergeHeaders(headers, input) {
1751
1770
  new Headers(input).forEach((value, key) => headers.set(key, value));
1752
1771
  }
1753
1772
  function clonePreviewForm(request) {
1773
+ if (request.name != null && typeof request.name !== "string") {
1774
+ throw new BreezeBlueConfigurationError("Clone name must be a string or null.");
1775
+ }
1754
1776
  if (request.removeBackgroundNoise) {
1755
1777
  throw new BreezeBlueConfigurationError("removeBackgroundNoise is not supported by the Breeze Developer API.");
1756
1778
  }
@@ -1760,7 +1782,7 @@ function clonePreviewForm(request) {
1760
1782
  }
1761
1783
  }
1762
1784
  const form = new FormData();
1763
- form.set("name", request.name);
1785
+ appendOptional(form, "name", request.name ?? undefined);
1764
1786
  appendOptional(form, "description", request.description);
1765
1787
  for (const file of normalizeFiles(request.file, request.files, { required: true })) {
1766
1788
  appendFile(form, "files", file);
package/dist/types.d.ts CHANGED
@@ -1,4 +1,5 @@
1
- import type { VoiceAccent, VoiceAge, VoiceGender, VoiceLanguageCode, VoiceTone } from "./voice-metadata.js";
1
+ import type { WordTimestamp } from "./timestamps.js";
2
+ import type { VoiceAccent, VoiceWritableAccent, VoiceAge, VoiceGender, VoiceLanguageCode, VoiceTone } from "./voice-metadata.js";
2
3
  export type JsonObject = Record<string, unknown>;
3
4
  export type BreezeBlueFetch = typeof fetch;
4
5
  export interface BreezeBlueClientOptions {
@@ -276,6 +277,7 @@ export interface GenerationJobError {
276
277
  detail: string;
277
278
  }
278
279
  export interface GenerationJob {
280
+ wordTimestamps?: WordTimestamp[];
279
281
  generationJobId: string;
280
282
  historyItemId: string;
281
283
  status: string;
@@ -359,7 +361,7 @@ export interface VoiceMetadataOptions {
359
361
  ageCodes: VoiceAge[];
360
362
  toneCodes: VoiceTone[];
361
363
  toneMaxItems: number;
362
- accentCodesByLanguage: Record<VoiceLanguageCode, VoiceAccent[]>;
364
+ accentCodesByLanguage: Record<VoiceLanguageCode, VoiceWritableAccent[]>;
363
365
  }
364
366
  export interface VoiceRandomParams {
365
367
  /** Only pick from voices whose saved audio language matches this code. */
@@ -375,6 +377,7 @@ export interface VoiceSearchParams {
375
377
  age?: VoiceAge[];
376
378
  tone?: VoiceTone[];
377
379
  accent?: VoiceAccent;
380
+ accentMode?: "all" | "unmarked";
378
381
  origin?: "designed" | "cloned" | string;
379
382
  voiceType?: "all" | "default" | "personal" | string;
380
383
  sort?: "created_at_unix" | "name" | "trend" | string;
@@ -398,7 +401,7 @@ export interface UploadFile {
398
401
  contentType?: string;
399
402
  }
400
403
  export interface VoiceClonePreviewRequest {
401
- name: string;
404
+ name?: string | null;
402
405
  file?: UploadData | UploadFile;
403
406
  files?: Array<UploadData | UploadFile>;
404
407
  description?: string;
@@ -418,7 +421,7 @@ export interface VoiceEditRequest {
418
421
  gender?: VoiceGender | null;
419
422
  age?: VoiceAge | null;
420
423
  tone?: VoiceTone[];
421
- accent?: VoiceAccent | null;
424
+ accent?: VoiceWritableAccent | null;
422
425
  file?: UploadData | UploadFile;
423
426
  files?: Array<UploadData | UploadFile>;
424
427
  }
@@ -451,6 +454,56 @@ export interface VoiceDesignResponse {
451
454
  previews: VoiceDesignPreview[];
452
455
  text: string;
453
456
  }
457
+ export interface VoiceRemixPrepareRequest {
458
+ voiceId: string;
459
+ prompt?: string;
460
+ presetId?: string;
461
+ }
462
+ export interface VoiceRemixPreviewRequest extends VoiceRemixPrepareRequest {
463
+ guidanceScale?: number;
464
+ preparationToken?: string;
465
+ }
466
+ export interface VoiceRemixSource {
467
+ voiceId: string | null;
468
+ name: string | null;
469
+ description: string | null;
470
+ }
471
+ export interface VoiceRemixPreset {
472
+ id: string;
473
+ category: string;
474
+ name: string;
475
+ prompt: string;
476
+ script: string;
477
+ language: string;
478
+ guidanceScale: number;
479
+ previewAudioUrl: string;
480
+ }
481
+ export interface VoiceRemixPresets {
482
+ presets: VoiceRemixPreset[];
483
+ exampleVoiceId: string;
484
+ }
485
+ export interface VoiceRemixPreparation {
486
+ preparationToken: string;
487
+ languageCode: VoiceLanguageCode;
488
+ instruction: string;
489
+ text: string;
490
+ sourceVoice: VoiceRemixSource;
491
+ }
492
+ export interface VoiceRemixJob {
493
+ generationJobId: string;
494
+ status: string;
495
+ }
496
+ export interface VoiceRemixPreviewStatus extends VoiceRemixJob {
497
+ languageCode?: VoiceLanguageCode | null;
498
+ generatedVoiceId?: string | null;
499
+ text?: string | null;
500
+ error?: GenerationJobError | null;
501
+ instruction?: string | null;
502
+ guidanceScale?: number | null;
503
+ sourceVoice?: VoiceRemixSource | null;
504
+ comparisonAudioUrl?: string | null;
505
+ comparisonText?: string | null;
506
+ }
454
507
  export interface VoiceLocalizePreviewRequest {
455
508
  voiceId: string;
456
509
  languageCode: VoiceLanguageCode;
@@ -470,7 +523,7 @@ export interface VoiceLocalizePreviewStatus {
470
523
  }
471
524
  export interface SaveVoiceRequest {
472
525
  generatedVoiceId: string;
473
- voiceName: string;
526
+ voiceName?: string | null;
474
527
  voiceDescription?: string | null;
475
528
  tags?: string[];
476
529
  primaryCategoryCode?: string;
@@ -480,7 +533,7 @@ export interface SaveVoiceRequest {
480
533
  gender?: VoiceGender | null;
481
534
  age?: VoiceAge | null;
482
535
  tone?: VoiceTone[];
483
- accent?: VoiceAccent | null;
536
+ accent?: VoiceWritableAccent | null;
484
537
  }
485
538
  export interface HistoryItem {
486
539
  historyItemId: string;
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const SDK_VERSION = "0.17.0";
1
+ export declare const SDK_VERSION = "0.19.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.17.0";
1
+ export const SDK_VERSION = "0.19.0";
2
2
  export const SDK_NAME = "@breeze.blue/sdk";
@@ -5,10 +5,14 @@ export declare const VOICE_LANGUAGE_CODES: readonly ["af", "ar", "bg", "bn", "bs
5
5
  export declare const VOICE_TONE_MAX_ITEMS: 3;
6
6
  export declare const VOICE_ACCENT_CODES_BY_LANGUAGE: {
7
7
  readonly en: readonly ["american", "british", "scottish", "irish", "australian", "canadian", "us_southern", "us_new_york", "indian", "south_african", "russian", "japanese", "korean", "chinese"];
8
- readonly zh: readonly ["mandarin_guangdong", "mandarin_northeastern", "mandarin_shaanxi", "mandarin_shanghai", "mandarin_sichuan", "mandarin_yunnan", "mandarin_henan", "cantonese"];
8
+ readonly zh: readonly ["mandarin_northeastern", "mandarin_shaanxi", "mandarin_shanghai", "mandarin_sichuan", "mandarin_henan", "mandarin_beijing", "mandarin_taiwan", "cantonese"];
9
9
  };
10
10
  export type VoiceGender = (typeof VOICE_GENDER_CODES)[number];
11
11
  export type VoiceAge = (typeof VOICE_AGE_CODES)[number];
12
12
  export type VoiceTone = (typeof VOICE_TONE_CODES)[number];
13
13
  export type VoiceLanguageCode = (typeof VOICE_LANGUAGE_CODES)[number];
14
- export type VoiceAccent = (typeof VOICE_ACCENT_CODES_BY_LANGUAGE)[keyof typeof VOICE_ACCENT_CODES_BY_LANGUAGE][number];
14
+ export declare const VOICE_LEGACY_ACCENT_CODES_BY_LANGUAGE: {
15
+ readonly zh: readonly ["mandarin_guangdong", "mandarin_yunnan"];
16
+ };
17
+ export type VoiceWritableAccent = (typeof VOICE_ACCENT_CODES_BY_LANGUAGE)[keyof typeof VOICE_ACCENT_CODES_BY_LANGUAGE][number];
18
+ export type VoiceAccent = VoiceWritableAccent | "mandarin_guangdong" | "mandarin_yunnan";
@@ -6,5 +6,6 @@ export const VOICE_LANGUAGE_CODES = ["af", "ar", "bg", "bn", "bs", "ca", "cs", "
6
6
  export const VOICE_TONE_MAX_ITEMS = 3;
7
7
  export const VOICE_ACCENT_CODES_BY_LANGUAGE = {
8
8
  en: ["american", "british", "scottish", "irish", "australian", "canadian", "us_southern", "us_new_york", "indian", "south_african", "russian", "japanese", "korean", "chinese"],
9
- zh: ["mandarin_guangdong", "mandarin_northeastern", "mandarin_shaanxi", "mandarin_shanghai", "mandarin_sichuan", "mandarin_yunnan", "mandarin_henan", "cantonese"],
9
+ zh: ["mandarin_northeastern", "mandarin_shaanxi", "mandarin_shanghai", "mandarin_sichuan", "mandarin_henan", "mandarin_beijing", "mandarin_taiwan", "cantonese"],
10
10
  };
11
+ export const VOICE_LEGACY_ACCENT_CODES_BY_LANGUAGE = { "zh": ["mandarin_guangdong", "mandarin_yunnan"] };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@breeze.blue/sdk",
3
- "version": "0.17.0",
3
+ "version": "0.19.0",
4
4
  "description": "ESM-first TypeScript SDK for the Breeze Blue Developer API.",
5
5
  "license": "MIT",
6
6
  "author": "Breeze Blue <support@breezeblue.ai>",