@speech-sdk/core 0.5.2 → 0.6.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.
Files changed (115) hide show
  1. package/README.md +110 -1
  2. package/dist/__tests__/e2e/_save-audio.d.ts +11 -0
  3. package/dist/__tests__/e2e/_save-audio.d.ts.map +1 -0
  4. package/dist/__tests__/e2e/_save-audio.js +43 -0
  5. package/dist/__tests__/e2e/_save-audio.js.map +1 -0
  6. package/dist/audio-utils.d.ts +12 -0
  7. package/dist/audio-utils.d.ts.map +1 -0
  8. package/dist/audio-utils.js +53 -0
  9. package/dist/audio-utils.js.map +1 -0
  10. package/dist/conversation/dispatch.d.ts +17 -0
  11. package/dist/conversation/dispatch.d.ts.map +1 -0
  12. package/dist/conversation/dispatch.js +60 -0
  13. package/dist/conversation/dispatch.js.map +1 -0
  14. package/dist/conversation/errors.d.ts +23 -0
  15. package/dist/conversation/errors.d.ts.map +1 -0
  16. package/dist/conversation/errors.js +28 -0
  17. package/dist/conversation/errors.js.map +1 -0
  18. package/dist/conversation/pcm-concat.d.ts +37 -0
  19. package/dist/conversation/pcm-concat.d.ts.map +1 -0
  20. package/dist/conversation/pcm-concat.js +246 -0
  21. package/dist/conversation/pcm-concat.js.map +1 -0
  22. package/dist/conversation/stitch.d.ts +33 -0
  23. package/dist/conversation/stitch.d.ts.map +1 -0
  24. package/dist/conversation/stitch.js +78 -0
  25. package/dist/conversation/stitch.js.map +1 -0
  26. package/dist/conversation/types.d.ts +39 -0
  27. package/dist/conversation/types.d.ts.map +1 -0
  28. package/dist/conversation/types.js +2 -0
  29. package/dist/conversation/types.js.map +1 -0
  30. package/dist/conversation/validate.d.ts +19 -0
  31. package/dist/conversation/validate.d.ts.map +1 -0
  32. package/dist/conversation/validate.js +50 -0
  33. package/dist/conversation/validate.js.map +1 -0
  34. package/dist/errors.d.ts +3 -0
  35. package/dist/errors.d.ts.map +1 -1
  36. package/dist/errors.js +6 -0
  37. package/dist/errors.js.map +1 -1
  38. package/dist/generate-conversation.d.ts +6 -0
  39. package/dist/generate-conversation.d.ts.map +1 -0
  40. package/dist/generate-conversation.js +154 -0
  41. package/dist/generate-conversation.js.map +1 -0
  42. package/dist/generate-speech.d.ts +10 -0
  43. package/dist/generate-speech.d.ts.map +1 -1
  44. package/dist/generate-speech.js +30 -5
  45. package/dist/generate-speech.js.map +1 -1
  46. package/dist/provider-utils.d.ts +1 -0
  47. package/dist/provider-utils.d.ts.map +1 -1
  48. package/dist/provider-utils.js +5 -0
  49. package/dist/provider-utils.js.map +1 -1
  50. package/dist/providers/cartesia/index.d.ts +10 -0
  51. package/dist/providers/cartesia/index.d.ts.map +1 -1
  52. package/dist/providers/cartesia/index.js +18 -1
  53. package/dist/providers/cartesia/index.js.map +1 -1
  54. package/dist/providers/deepgram/index.d.ts +8 -0
  55. package/dist/providers/deepgram/index.d.ts.map +1 -1
  56. package/dist/providers/deepgram/index.js +39 -19
  57. package/dist/providers/deepgram/index.js.map +1 -1
  58. package/dist/providers/elevenlabs/index.d.ts +25 -0
  59. package/dist/providers/elevenlabs/index.d.ts.map +1 -1
  60. package/dist/providers/elevenlabs/index.js +56 -1
  61. package/dist/providers/elevenlabs/index.js.map +1 -1
  62. package/dist/providers/fal/index.d.ts +25 -5
  63. package/dist/providers/fal/index.d.ts.map +1 -1
  64. package/dist/providers/fal/index.js +73 -11
  65. package/dist/providers/fal/index.js.map +1 -1
  66. package/dist/providers/fish-audio/index.d.ts +24 -0
  67. package/dist/providers/fish-audio/index.d.ts.map +1 -1
  68. package/dist/providers/fish-audio/index.js +57 -1
  69. package/dist/providers/fish-audio/index.js.map +1 -1
  70. package/dist/providers/google/index.d.ts +25 -2
  71. package/dist/providers/google/index.d.ts.map +1 -1
  72. package/dist/providers/google/index.js +166 -51
  73. package/dist/providers/google/index.js.map +1 -1
  74. package/dist/providers/hume/index.d.ts +26 -0
  75. package/dist/providers/hume/index.d.ts.map +1 -1
  76. package/dist/providers/hume/index.js +58 -1
  77. package/dist/providers/hume/index.js.map +1 -1
  78. package/dist/providers/inworld/index.d.ts +9 -0
  79. package/dist/providers/inworld/index.d.ts.map +1 -1
  80. package/dist/providers/inworld/index.js +15 -4
  81. package/dist/providers/inworld/index.js.map +1 -1
  82. package/dist/providers/mistral/index.d.ts +6 -0
  83. package/dist/providers/mistral/index.d.ts.map +1 -1
  84. package/dist/providers/mistral/index.js +34 -13
  85. package/dist/providers/mistral/index.js.map +1 -1
  86. package/dist/providers/murf/index.d.ts +4 -0
  87. package/dist/providers/murf/index.d.ts.map +1 -1
  88. package/dist/providers/murf/index.js +15 -1
  89. package/dist/providers/murf/index.js.map +1 -1
  90. package/dist/providers/openai/index.d.ts +6 -0
  91. package/dist/providers/openai/index.d.ts.map +1 -1
  92. package/dist/providers/openai/index.js +12 -1
  93. package/dist/providers/openai/index.js.map +1 -1
  94. package/dist/providers/resemble/index.d.ts +6 -0
  95. package/dist/providers/resemble/index.d.ts.map +1 -1
  96. package/dist/providers/resemble/index.js +15 -1
  97. package/dist/providers/resemble/index.js.map +1 -1
  98. package/dist/providers/xai/index.d.ts +8 -0
  99. package/dist/providers/xai/index.d.ts.map +1 -1
  100. package/dist/providers/xai/index.js +14 -1
  101. package/dist/providers/xai/index.js.map +1 -1
  102. package/dist/resolve-provider.d.ts.map +1 -1
  103. package/dist/resolve-provider.js +0 -3
  104. package/dist/resolve-provider.js.map +1 -1
  105. package/dist/speech-provider.d.ts +24 -0
  106. package/dist/speech-provider.d.ts.map +1 -1
  107. package/dist/volume-adjust.d.ts +14 -0
  108. package/dist/volume-adjust.d.ts.map +1 -0
  109. package/dist/volume-adjust.js +27 -0
  110. package/dist/volume-adjust.js.map +1 -0
  111. package/package.json +11 -7
  112. package/dist/providers/unreal-speech/index.d.ts +0 -46
  113. package/dist/providers/unreal-speech/index.d.ts.map +0 -1
  114. package/dist/providers/unreal-speech/index.js +0 -96
  115. package/dist/providers/unreal-speech/index.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@speech-sdk/core",
3
- "version": "0.5.2",
3
+ "version": "0.6.1",
4
4
  "description": "Universal, cross-platform text-to-speech SDK with multi-provider support.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -10,6 +10,14 @@
10
10
  "types": "./dist/index.d.ts",
11
11
  "default": "./dist/index.js"
12
12
  },
13
+ "./conversation": {
14
+ "types": "./dist/generate-conversation.d.ts",
15
+ "default": "./dist/generate-conversation.js"
16
+ },
17
+ "./conversation/errors": {
18
+ "types": "./dist/conversation/errors.d.ts",
19
+ "default": "./dist/conversation/errors.js"
20
+ },
13
21
  "./openai": {
14
22
  "types": "./dist/providers/openai/index.d.ts",
15
23
  "default": "./dist/providers/openai/index.js"
@@ -42,10 +50,6 @@
42
50
  "types": "./dist/providers/fish-audio/index.d.ts",
43
51
  "default": "./dist/providers/fish-audio/index.js"
44
52
  },
45
- "./unreal-speech": {
46
- "types": "./dist/providers/unreal-speech/index.d.ts",
47
- "default": "./dist/providers/unreal-speech/index.js"
48
- },
49
53
  "./murf": {
50
54
  "types": "./dist/providers/murf/index.d.ts",
51
55
  "default": "./dist/providers/murf/index.js"
@@ -90,11 +94,11 @@
90
94
  "p-retry": "^8.0.0"
91
95
  },
92
96
  "devDependencies": {
93
- "@biomejs/biome": "2.4.10",
97
+ "@biomejs/biome": "2.4.12",
94
98
  "@types/node": "^25.5.0",
95
99
  "dotenv": "^17.3.1",
96
100
  "typescript": "^5.8.0",
97
- "ultracite": "7.4.3",
101
+ "ultracite": "7.5.9",
98
102
  "vite": "^7.3.2",
99
103
  "vitest": "^4.1.3"
100
104
  },
@@ -1,46 +0,0 @@
1
- import type { ResolvedModel, SpeechProvider } from "../../speech-provider.js";
2
- export interface UnrealSpeechProviderConfig {
3
- apiKey?: string;
4
- baseURL?: string;
5
- fetch?: typeof globalThis.fetch;
6
- }
7
- export declare class UnrealSpeechProvider implements SpeechProvider<string, string> {
8
- readonly id = "unreal-speech";
9
- readonly defaultModel = "default";
10
- readonly models: readonly [{
11
- readonly id: "default";
12
- readonly releaseDate: "2025-06-01";
13
- readonly languages: readonly ["en", "zh", "hi", "es", "pt", "ja", "fr", "it"];
14
- readonly features: readonly ["streaming"];
15
- }];
16
- private readonly apiKey;
17
- private readonly baseURL;
18
- private readonly fetchFn;
19
- constructor(config: UnrealSpeechProviderConfig);
20
- generate(options: {
21
- modelId: string;
22
- text: string;
23
- voice?: string;
24
- providerOptions?: Record<string, unknown>;
25
- abortSignal?: AbortSignal;
26
- headers?: Record<string, string>;
27
- }): Promise<{
28
- audio: Uint8Array;
29
- mediaType: string;
30
- providerMetadata?: Record<string, unknown>;
31
- }>;
32
- stream(options: {
33
- modelId: string;
34
- text: string;
35
- voice?: string;
36
- providerOptions?: Record<string, unknown>;
37
- abortSignal?: AbortSignal;
38
- headers?: Record<string, string>;
39
- }): Promise<{
40
- stream: ReadableStream<Uint8Array>;
41
- mediaType: string;
42
- providerMetadata?: Record<string, unknown>;
43
- }>;
44
- }
45
- export declare function createUnrealSpeech(config?: UnrealSpeechProviderConfig): (modelId?: string) => ResolvedModel<string>;
46
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/unreal-speech/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE9E,MAAM,WAAW,0BAA0B;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACjC;AAED,qBAAa,oBAAqB,YAAW,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC;IACzE,QAAQ,CAAC,EAAE,mBAAmB;IAC9B,QAAQ,CAAC,YAAY,aAAa;IAElC,QAAQ,CAAC,MAAM;;;;;OAOJ;IAEX,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;gBAEtC,MAAM,EAAE,0BAA0B;IAMxC,QAAQ,CAAC,OAAO,EAAE;QACtB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC1C,WAAW,CAAC,EAAE,WAAW,CAAC;QAC1B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAClC,GAAG,OAAO,CAAC;QACV,KAAK,EAAE,UAAU,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAC5C,CAAC;IA8CI,MAAM,CAAC,OAAO,EAAE;QACpB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC1C,WAAW,CAAC,EAAE,WAAW,CAAC;QAC1B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAClC,GAAG,OAAO,CAAC;QACV,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,CAAC;QACnC,SAAS,EAAE,MAAM,CAAC;QAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAC5C,CAAC;CAgCH;AAED,wBAAgB,kBAAkB,CAAC,MAAM,GAAE,0BAA+B,IAG3C,UAAU,MAAM,KAAG,aAAa,CAAC,MAAM,CAAC,CAMtE"}
@@ -1,96 +0,0 @@
1
- import { ApiError } from "../../errors.js";
2
- import { handleErrorResponse, resolveApiKey } from "../../provider-utils.js";
3
- export class UnrealSpeechProvider {
4
- id = "unreal-speech";
5
- defaultModel = "default";
6
- models = [
7
- {
8
- id: "default",
9
- releaseDate: "2025-06-01",
10
- languages: ["en", "zh", "hi", "es", "pt", "ja", "fr", "it"],
11
- features: ["streaming"],
12
- },
13
- ];
14
- apiKey;
15
- baseURL;
16
- fetchFn;
17
- constructor(config) {
18
- this.apiKey = config.apiKey;
19
- this.baseURL = config.baseURL ?? "https://api.v8.unrealspeech.com";
20
- this.fetchFn = config.fetch ?? globalThis.fetch.bind(globalThis);
21
- }
22
- async generate(options) {
23
- const url = `${this.baseURL}/speech`;
24
- const body = {
25
- ...options.providerOptions,
26
- AudioFormat: "mp3",
27
- OutputFormat: "uri",
28
- VoiceId: options.voice,
29
- Text: options.text,
30
- };
31
- const response = await this.fetchFn(url, {
32
- method: "POST",
33
- headers: {
34
- "Content-Type": "application/json",
35
- Authorization: `Bearer ${resolveApiKey(this.apiKey, "UNREAL_SPEECH_API_KEY", "Unreal Speech")}`,
36
- ...options.headers,
37
- },
38
- body: JSON.stringify(body),
39
- signal: options.abortSignal,
40
- });
41
- await handleErrorResponse(response, `unreal-speech/${options.modelId}`);
42
- const json = (await response.json());
43
- const audioResponse = await this.fetchFn(json.OutputUri, {
44
- signal: options.abortSignal,
45
- });
46
- if (!audioResponse.ok) {
47
- throw new ApiError(`API error: ${audioResponse.status}`, {
48
- statusCode: audioResponse.status,
49
- model: `unreal-speech/${options.modelId}`,
50
- responseBody: await audioResponse.text().catch(() => undefined),
51
- });
52
- }
53
- const arrayBuffer = await audioResponse.arrayBuffer();
54
- return {
55
- audio: new Uint8Array(arrayBuffer),
56
- mediaType: "audio/mpeg",
57
- };
58
- }
59
- async stream(options) {
60
- const url = `${this.baseURL}/stream`;
61
- const body = {
62
- ...options.providerOptions,
63
- AudioFormat: "mp3",
64
- VoiceId: options.voice,
65
- Text: options.text,
66
- };
67
- const response = await this.fetchFn(url, {
68
- method: "POST",
69
- headers: {
70
- "Content-Type": "application/json",
71
- Authorization: `Bearer ${resolveApiKey(this.apiKey, "UNREAL_SPEECH_API_KEY", "Unreal Speech")}`,
72
- ...options.headers,
73
- },
74
- body: JSON.stringify(body),
75
- signal: options.abortSignal,
76
- });
77
- await handleErrorResponse(response, `unreal-speech/${options.modelId}`);
78
- if (!response.body) {
79
- throw new Error(`unreal-speech/${options.modelId}: response has no body`);
80
- }
81
- return {
82
- stream: response.body,
83
- mediaType: response.headers.get("content-type") ?? "audio/mpeg",
84
- };
85
- }
86
- }
87
- export function createUnrealSpeech(config = {}) {
88
- const provider = new UnrealSpeechProvider(config);
89
- return function unrealSpeech(modelId) {
90
- return {
91
- provider,
92
- modelId: modelId ?? provider.defaultModel,
93
- };
94
- };
95
- }
96
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/unreal-speech/index.ts"],"names":[],"mappings":"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"}