@speech-sdk/core 0.0.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 (106) hide show
  1. package/README.md +185 -0
  2. package/dist/errors.d.ts +20 -0
  3. package/dist/errors.d.ts.map +1 -0
  4. package/dist/errors.js +25 -0
  5. package/dist/errors.js.map +1 -0
  6. package/dist/generate-speech.d.ts +12 -0
  7. package/dist/generate-speech.d.ts.map +1 -0
  8. package/dist/generate-speech.js +39 -0
  9. package/dist/generate-speech.js.map +1 -0
  10. package/dist/index.d.ts +6 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +3 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/provider-utils.d.ts +3 -0
  15. package/dist/provider-utils.d.ts.map +1 -0
  16. package/dist/provider-utils.js +49 -0
  17. package/dist/provider-utils.js.map +1 -0
  18. package/dist/providers/cartesia/index.d.ts +35 -0
  19. package/dist/providers/cartesia/index.d.ts.map +1 -0
  20. package/dist/providers/cartesia/index.js +59 -0
  21. package/dist/providers/cartesia/index.js.map +1 -0
  22. package/dist/providers/deepgram/index.d.ts +32 -0
  23. package/dist/providers/deepgram/index.d.ts.map +1 -0
  24. package/dist/providers/deepgram/index.js +53 -0
  25. package/dist/providers/deepgram/index.js.map +1 -0
  26. package/dist/providers/elevenlabs/elevenlabs-options.d.ts +2 -0
  27. package/dist/providers/elevenlabs/elevenlabs-options.d.ts.map +1 -0
  28. package/dist/providers/elevenlabs/elevenlabs-options.js +2 -0
  29. package/dist/providers/elevenlabs/elevenlabs-options.js.map +1 -0
  30. package/dist/providers/elevenlabs/elevenlabs-provider.d.ts +5 -0
  31. package/dist/providers/elevenlabs/elevenlabs-provider.d.ts.map +1 -0
  32. package/dist/providers/elevenlabs/elevenlabs-provider.js +11 -0
  33. package/dist/providers/elevenlabs/elevenlabs-provider.js.map +1 -0
  34. package/dist/providers/elevenlabs/elevenlabs-speech-model.d.ts +44 -0
  35. package/dist/providers/elevenlabs/elevenlabs-speech-model.d.ts.map +1 -0
  36. package/dist/providers/elevenlabs/elevenlabs-speech-model.js +82 -0
  37. package/dist/providers/elevenlabs/elevenlabs-speech-model.js.map +1 -0
  38. package/dist/providers/elevenlabs/index.d.ts +44 -0
  39. package/dist/providers/elevenlabs/index.d.ts.map +1 -0
  40. package/dist/providers/elevenlabs/index.js +91 -0
  41. package/dist/providers/elevenlabs/index.js.map +1 -0
  42. package/dist/providers/fal/index.d.ts +35 -0
  43. package/dist/providers/fal/index.d.ts.map +1 -0
  44. package/dist/providers/fal/index.js +70 -0
  45. package/dist/providers/fal/index.js.map +1 -0
  46. package/dist/providers/fish-audio/index.d.ts +32 -0
  47. package/dist/providers/fish-audio/index.d.ts.map +1 -0
  48. package/dist/providers/fish-audio/index.js +54 -0
  49. package/dist/providers/fish-audio/index.js.map +1 -0
  50. package/dist/providers/google/index.d.ts +35 -0
  51. package/dist/providers/google/index.d.ts.map +1 -0
  52. package/dist/providers/google/index.js +71 -0
  53. package/dist/providers/google/index.js.map +1 -0
  54. package/dist/providers/hume/index.d.ts +36 -0
  55. package/dist/providers/hume/index.d.ts.map +1 -0
  56. package/dist/providers/hume/index.js +66 -0
  57. package/dist/providers/hume/index.js.map +1 -0
  58. package/dist/providers/mistral/index.d.ts +37 -0
  59. package/dist/providers/mistral/index.d.ts.map +1 -0
  60. package/dist/providers/mistral/index.js +66 -0
  61. package/dist/providers/mistral/index.js.map +1 -0
  62. package/dist/providers/murf/index.d.ts +35 -0
  63. package/dist/providers/murf/index.d.ts.map +1 -0
  64. package/dist/providers/murf/index.js +68 -0
  65. package/dist/providers/murf/index.js.map +1 -0
  66. package/dist/providers/openai/index.d.ts +39 -0
  67. package/dist/providers/openai/index.d.ts.map +1 -0
  68. package/dist/providers/openai/index.js +63 -0
  69. package/dist/providers/openai/index.js.map +1 -0
  70. package/dist/providers/openai/openai-options.d.ts +2 -0
  71. package/dist/providers/openai/openai-options.d.ts.map +1 -0
  72. package/dist/providers/openai/openai-options.js +2 -0
  73. package/dist/providers/openai/openai-options.js.map +1 -0
  74. package/dist/providers/openai/openai-provider.d.ts +5 -0
  75. package/dist/providers/openai/openai-provider.d.ts.map +1 -0
  76. package/dist/providers/openai/openai-provider.js +11 -0
  77. package/dist/providers/openai/openai-provider.js.map +1 -0
  78. package/dist/providers/openai/openai-speech-model.d.ts +39 -0
  79. package/dist/providers/openai/openai-speech-model.d.ts.map +1 -0
  80. package/dist/providers/openai/openai-speech-model.js +54 -0
  81. package/dist/providers/openai/openai-speech-model.js.map +1 -0
  82. package/dist/providers/resemble/index.d.ts +32 -0
  83. package/dist/providers/resemble/index.d.ts.map +1 -0
  84. package/dist/providers/resemble/index.js +50 -0
  85. package/dist/providers/resemble/index.js.map +1 -0
  86. package/dist/providers/unreal-speech/index.d.ts +32 -0
  87. package/dist/providers/unreal-speech/index.d.ts.map +1 -0
  88. package/dist/providers/unreal-speech/index.js +64 -0
  89. package/dist/providers/unreal-speech/index.js.map +1 -0
  90. package/dist/resolve-provider.d.ts +3 -0
  91. package/dist/resolve-provider.d.ts.map +1 -0
  92. package/dist/resolve-provider.js +71 -0
  93. package/dist/resolve-provider.js.map +1 -0
  94. package/dist/speech-provider.d.ts +31 -0
  95. package/dist/speech-provider.d.ts.map +1 -0
  96. package/dist/speech-provider.js +2 -0
  97. package/dist/speech-provider.js.map +1 -0
  98. package/dist/speech-result.d.ts +22 -0
  99. package/dist/speech-result.d.ts.map +1 -0
  100. package/dist/speech-result.js +42 -0
  101. package/dist/speech-result.js.map +1 -0
  102. package/dist/types.d.ts +11 -0
  103. package/dist/types.d.ts.map +1 -0
  104. package/dist/types.js +2 -0
  105. package/dist/types.js.map +1 -0
  106. package/package.json +96 -0
package/README.md ADDED
@@ -0,0 +1,185 @@
1
+ # Speech SDK
2
+
3
+ Universal Text-To-Speech TypeScript SDK with Multi-Provider Support. Cross-platform (Node, Edge, Browser), Open-Source, and Minimal Dependencies.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install @speech-sdk/core
9
+ ```
10
+
11
+ ### Using an AI Coding Assistant?
12
+
13
+ Add the speech-sdk skill to give your AI assistant full knowledge of this library:
14
+
15
+ ```bash
16
+ npx skills add Jellypod-Inc/speech-sdk --skill speech-sdk
17
+ ```
18
+
19
+ ## Quick Start
20
+
21
+ ```ts
22
+ import { generateSpeech } from '@speech-sdk/core';
23
+
24
+ const result = await generateSpeech({
25
+ model: 'openai/gpt-4o-mini-tts',
26
+ text: 'Hello from speech-sdk!',
27
+ voice: 'alloy',
28
+ });
29
+
30
+ // Access the audio
31
+ result.audio.uint8Array; // Uint8Array
32
+ result.audio.base64; // string (lazy-computed)
33
+ result.audio.mediaType; // "audio/mpeg"
34
+ ```
35
+
36
+ ## Supported Providers
37
+
38
+ Use `provider/model` strings. Passing just the provider name uses its default model.
39
+
40
+ | Provider | String Prefix | Default Model | Env Var | Docs |
41
+ |---|---|---|---|---|
42
+ | [OpenAI](https://platform.openai.com/docs/guides/text-to-speech) | `openai` | `gpt-4o-mini-tts` | `OPENAI_API_KEY` | [API Reference](https://platform.openai.com/docs/api-reference/audio/createSpeech) |
43
+ | [ElevenLabs](https://elevenlabs.io/docs) | `elevenlabs` | `eleven_multilingual_v2` | `ELEVENLABS_API_KEY` | [API Reference](https://elevenlabs.io/docs/api-reference/text-to-speech/convert) |
44
+ | [Deepgram](https://developers.deepgram.com/docs/text-to-speech) | `deepgram` | `aura-2` | `DEEPGRAM_API_KEY` | [API Reference](https://developers.deepgram.com/docs/tts-models) |
45
+ | [Cartesia](https://docs.cartesia.ai) | `cartesia` | `sonic-3` | `CARTESIA_API_KEY` | [API Reference](https://docs.cartesia.ai/api-reference/tts/bytes) |
46
+ | [Hume](https://dev.hume.ai/docs/text-to-speech-tts/overview) | `hume` | `octave-2` | `HUME_API_KEY` | [API Reference](https://dev.hume.ai/reference/text-to-speech-tts/synthesize-json) |
47
+ | [Google (Gemini TTS)](https://docs.cloud.google.com/text-to-speech/docs/gemini-tts) | `google` | `gemini-2.5-flash-preview-tts` | `GOOGLE_API_KEY` | [API Reference](https://ai.google.dev/gemini-api/docs/text-generation) |
48
+ | [Fish Audio](https://docs.fish.audio) | `fish-audio` | `s2-pro` | `FISH_AUDIO_API_KEY` | [API Reference](https://docs.fish.audio/developer-guide/core-features/text-to-speech) |
49
+ | [Unreal Speech](https://docs.v8.unrealspeech.com) | `unreal-speech` | `default` | `UNREAL_SPEECH_API_KEY` | [API Reference](https://docs.v8.unrealspeech.com) |
50
+ | [Murf](https://murf.ai/api/docs) | `murf` | `GEN2` | `MURF_API_KEY` | [API Reference](https://murf.ai/api/docs/api-reference/text-to-speech/generate) |
51
+ | [Resemble](https://docs.resemble.ai) | `resemble` | `default` | `RESEMBLE_API_KEY` | [API Reference](https://docs.resemble.ai/api-reference/text-to-speech/synthesize) |
52
+ | [fal](https://fal.ai/models) | `fal-ai` | *(user-specified)* | `FAL_API_KEY` | [API Reference](https://fal.ai/models) |
53
+ | [Mistral](https://docs.mistral.ai/capabilities/audio/text_to_speech/speech) | `mistral` | `voxtral-mini-tts-2603` | `MISTRAL_API_KEY` | [API Reference](https://docs.mistral.ai/capabilities/audio/text_to_speech/speech) |
54
+
55
+ ```ts
56
+ generateSpeech({ model: 'openai/tts-1', text: '...', voice: 'alloy' });
57
+ generateSpeech({ model: 'elevenlabs/eleven_v3', text: '...', voice: 'voice-id' });
58
+ generateSpeech({ model: 'deepgram/aura-2', text: '...', voice: 'thalia-en' });
59
+ generateSpeech({ model: 'openai', text: '...', voice: 'alloy' }); // uses default model
60
+ ```
61
+
62
+ Provider-specific API parameters can be passed via `providerOptions` — these are sent directly to the provider's API using the API's own field names.
63
+
64
+ ## Custom Configuration
65
+
66
+ Use factory functions when you need custom API keys, base URLs, or fetch implementations:
67
+
68
+ ```ts
69
+ import { generateSpeech } from '@speech-sdk/core';
70
+ import { createOpenAI } from '@speech-sdk/core/openai';
71
+ import { createElevenLabs } from '@speech-sdk/core/elevenlabs';
72
+
73
+ const myOpenAI = createOpenAI({
74
+ apiKey: 'sk-...',
75
+ baseURL: 'https://my-proxy.com/v1',
76
+ });
77
+
78
+ const result = await generateSpeech({
79
+ model: myOpenAI('gpt-4o-mini-tts'),
80
+ text: 'Hello!',
81
+ voice: 'alloy',
82
+ });
83
+ ```
84
+
85
+ ### API Key Resolution
86
+
87
+ When using string models (e.g., `'openai/tts-1'`), API keys are resolved from environment variables (see table above). Factory functions accept an explicit `apiKey` option which takes precedence.
88
+
89
+ ## Voice Cloning
90
+
91
+ Some providers support voice cloning via reference audio. Pass a voice object instead of a string:
92
+
93
+ ```ts
94
+ import { createMistral } from '@speech-sdk/core/mistral';
95
+
96
+ const mistral = createMistral();
97
+
98
+ // Clone from base64 audio
99
+ const result = await generateSpeech({
100
+ model: mistral(),
101
+ text: 'Hello!',
102
+ voice: { audio: 'base64-encoded-audio...' },
103
+ });
104
+ ```
105
+
106
+ Clone from a URL (fal):
107
+
108
+ ```ts
109
+ import { createFal } from '@speech-sdk/core/fal-ai';
110
+
111
+ const fal = createFal();
112
+ const result = await generateSpeech({
113
+ model: fal('fal-ai/chatterbox'),
114
+ text: 'Hello!',
115
+ voice: { url: 'https://example.com/reference.wav' },
116
+ });
117
+ ```
118
+
119
+ ## Options
120
+
121
+ ```ts
122
+ generateSpeech({
123
+ model: string | ResolvedModel, // required
124
+ text: string, // required
125
+ voice: Voice, // required
126
+ providerOptions?: object, // provider-specific API params
127
+ maxRetries?: number, // default: 2 (retries on 5xx/network errors)
128
+ abortSignal?: AbortSignal, // cancel the request
129
+ headers?: Record<string, string>, // additional HTTP headers
130
+ });
131
+ ```
132
+
133
+ ## Result
134
+
135
+ ```ts
136
+ interface SpeechResult {
137
+ audio: {
138
+ uint8Array: Uint8Array; // raw audio bytes
139
+ base64: string; // base64 encoded (lazy)
140
+ mediaType: string; // e.g. "audio/mpeg"
141
+ };
142
+ providerMetadata?: Record<string, unknown>;
143
+ }
144
+ ```
145
+
146
+ ## Error Handling
147
+
148
+ ```ts
149
+ import { generateSpeech, ApiError, SpeechSDKError } from '@speech-sdk/core';
150
+
151
+ try {
152
+ const result = await generateSpeech({ ... });
153
+ } catch (error) {
154
+ if (error instanceof ApiError) {
155
+ console.log(error.statusCode); // 401
156
+ console.log(error.model); // "openai/gpt-4o-mini-tts"
157
+ console.log(error.responseBody);
158
+ }
159
+ }
160
+ ```
161
+
162
+ | Error | When |
163
+ |---|---|
164
+ | `ApiError` | Provider API returns a non-2xx response |
165
+ | `NoSpeechGeneratedError` | Provider returned empty audio |
166
+ | `SpeechSDKError` | Base class for all errors |
167
+
168
+ ## Retry
169
+
170
+ Built-in retry with exponential backoff via [p-retry](https://github.com/sindresorhus/p-retry). Retries on 5xx and network errors. Does not retry 4xx errors. Default: 2 retries.
171
+
172
+ ## Development
173
+
174
+ ```bash
175
+ pnpm install
176
+ pnpm test # unit tests
177
+ pnpm run test:e2e # e2e tests (requires API keys)
178
+ pnpm run typecheck # type-check without emitting
179
+ ```
180
+
181
+ E2E tests hit real provider APIs. Set the relevant API key environment variables in a `.env` file or export them in your shell.
182
+
183
+ ## License
184
+
185
+ MIT
@@ -0,0 +1,20 @@
1
+ export declare class SpeechSDKError extends Error {
2
+ constructor(message: string, options?: {
3
+ cause?: unknown;
4
+ });
5
+ }
6
+ export declare class ApiError extends SpeechSDKError {
7
+ readonly statusCode: number;
8
+ readonly responseBody?: unknown;
9
+ readonly model: string;
10
+ constructor(message: string, options: {
11
+ statusCode: number;
12
+ model: string;
13
+ responseBody?: unknown;
14
+ cause?: unknown;
15
+ });
16
+ }
17
+ export declare class NoSpeechGeneratedError extends SpeechSDKError {
18
+ constructor();
19
+ }
20
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,cAAe,SAAQ,KAAK;gBAC3B,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAI3D;AAED,qBAAa,QAAS,SAAQ,cAAc;IAC1C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;gBAGrB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;QACP,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,KAAK,CAAC,EAAE,OAAO,CAAC;KACjB;CAQJ;AAED,qBAAa,sBAAuB,SAAQ,cAAc;;CAKzD"}
package/dist/errors.js ADDED
@@ -0,0 +1,25 @@
1
+ export class SpeechSDKError extends Error {
2
+ constructor(message, options) {
3
+ super(message, options);
4
+ this.name = 'SpeechSDKError';
5
+ }
6
+ }
7
+ export class ApiError extends SpeechSDKError {
8
+ statusCode;
9
+ responseBody;
10
+ model;
11
+ constructor(message, options) {
12
+ super(message, { cause: options.cause });
13
+ this.name = 'ApiError';
14
+ this.statusCode = options.statusCode;
15
+ this.model = options.model;
16
+ this.responseBody = options.responseBody;
17
+ }
18
+ }
19
+ export class NoSpeechGeneratedError extends SpeechSDKError {
20
+ constructor() {
21
+ super('No speech audio was generated.');
22
+ this.name = 'NoSpeechGeneratedError';
23
+ }
24
+ }
25
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,cAAe,SAAQ,KAAK;IACvC,YAAY,OAAe,EAAE,OAA6B;QACxD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED,MAAM,OAAO,QAAS,SAAQ,cAAc;IACjC,UAAU,CAAS;IACnB,YAAY,CAAW;IACvB,KAAK,CAAS;IAEvB,YACE,OAAe,EACf,OAKC;QAED,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACzC,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QACvB,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QACrC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC3B,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAC3C,CAAC;CACF;AAED,MAAM,OAAO,sBAAuB,SAAQ,cAAc;IACxD;QACE,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF"}
@@ -0,0 +1,12 @@
1
+ import type { ResolvedModel, Voice } from './speech-provider.js';
2
+ import type { SpeechResult } from './speech-result.js';
3
+ export declare function generateSpeech<V extends Voice = Voice>(options: {
4
+ model: string | ResolvedModel<V>;
5
+ text: string;
6
+ voice: V;
7
+ providerOptions?: Record<string, unknown>;
8
+ maxRetries?: number;
9
+ abortSignal?: AbortSignal;
10
+ headers?: Record<string, string>;
11
+ }): Promise<SpeechResult>;
12
+ //# sourceMappingURL=generate-speech.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-speech.d.ts","sourceRoot":"","sources":["../src/generate-speech.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAKvD,wBAAsB,cAAc,CAAC,CAAC,SAAS,KAAK,GAAG,KAAK,EAAE,OAAO,EAAE;IACrE,KAAK,EAAE,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,CAAC,CAAC;IACT,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC,GAAG,OAAO,CAAC,YAAY,CAAC,CA2CxB"}
@@ -0,0 +1,39 @@
1
+ import pRetry from 'p-retry';
2
+ import { DefaultGeneratedAudioFile } from './speech-result.js';
3
+ import { NoSpeechGeneratedError, ApiError } from './errors.js';
4
+ import { resolveModel } from './resolve-provider.js';
5
+ export async function generateSpeech(options) {
6
+ const { model, text, voice, providerOptions, abortSignal, headers } = options;
7
+ const maxRetries = options.maxRetries ?? 2;
8
+ const resolved = resolveModel(model);
9
+ const result = await pRetry(() => resolved.provider.generate({
10
+ modelId: resolved.modelId,
11
+ text,
12
+ voice,
13
+ providerOptions,
14
+ abortSignal,
15
+ headers,
16
+ }), {
17
+ retries: maxRetries,
18
+ signal: abortSignal,
19
+ shouldRetry: ({ error }) => {
20
+ if (error instanceof ApiError && error.statusCode < 500) {
21
+ return false;
22
+ }
23
+ return true;
24
+ },
25
+ });
26
+ const audioData = result.audio;
27
+ if (audioData.length === 0) {
28
+ throw new NoSpeechGeneratedError();
29
+ }
30
+ const audio = new DefaultGeneratedAudioFile({
31
+ data: audioData,
32
+ mediaType: result.mediaType,
33
+ });
34
+ return {
35
+ audio,
36
+ providerMetadata: result.providerMetadata,
37
+ };
38
+ }
39
+ //# sourceMappingURL=generate-speech.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate-speech.js","sourceRoot":"","sources":["../src/generate-speech.ts"],"names":[],"mappings":"AAAA,OAAO,MAAsB,MAAM,SAAS,CAAC;AAG7C,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,MAAM,CAAC,KAAK,UAAU,cAAc,CAA0B,OAQ7D;IACC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAC9E,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC;IAE3C,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAErC,MAAM,MAAM,GAAG,MAAM,MAAM,CACzB,GAAG,EAAE,CACH,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACzB,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,IAAI;QACJ,KAAK;QACL,eAAe;QACf,WAAW;QACX,OAAO;KACR,CAAC,EACJ;QACE,OAAO,EAAE,UAAU;QACnB,MAAM,EAAE,WAAW;QACnB,WAAW,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;YACzB,IAAI,KAAK,YAAY,QAAQ,IAAI,KAAK,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC;gBACxD,OAAO,KAAK,CAAC;YACf,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CACF,CAAC;IAEF,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC;IAE/B,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,sBAAsB,EAAE,CAAC;IACrC,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,yBAAyB,CAAC;QAC1C,IAAI,EAAE,SAAS;QACf,SAAS,EAAE,MAAM,CAAC,SAAS;KAC5B,CAAC,CAAC;IAEH,OAAO;QACL,KAAK;QACL,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;KAC1C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { generateSpeech } from './generate-speech.js';
2
+ export { SpeechSDKError, ApiError, NoSpeechGeneratedError } from './errors.js';
3
+ export type { SpeechProvider, ResolvedModel, ModelInfo, Voice } from './speech-provider.js';
4
+ export type { SpeechResult, GeneratedAudioFile } from './speech-result.js';
5
+ export type { GenerateSpeechOptions } from './types.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAC/E,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC5F,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC3E,YAAY,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { generateSpeech } from './generate-speech.js';
2
+ export { SpeechSDKError, ApiError, NoSpeechGeneratedError } from './errors.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function resolveApiKey(stored: string | undefined, envVar: string, providerName: string): string;
2
+ export declare function handleErrorResponse(response: Response, model: string): Promise<void>;
3
+ //# sourceMappingURL=provider-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-utils.d.ts","sourceRoot":"","sources":["../src/provider-utils.ts"],"names":[],"mappings":"AAEA,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,GACnB,MAAM,CAYR;AAmBD,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAcf"}
@@ -0,0 +1,49 @@
1
+ import { ApiError } from './errors.js';
2
+ export function resolveApiKey(stored, envVar, providerName) {
3
+ const key = stored ??
4
+ (typeof process !== 'undefined'
5
+ ? process.env?.[envVar]
6
+ : undefined);
7
+ if (!key) {
8
+ throw new Error(`${providerName} API key is required. Pass it via apiKey option or set the ${envVar} environment variable.`);
9
+ }
10
+ return key;
11
+ }
12
+ function extractErrorMessage(body) {
13
+ if (!body)
14
+ return undefined;
15
+ try {
16
+ const json = JSON.parse(body);
17
+ // Common error response shapes
18
+ if (typeof json.error === 'string')
19
+ return json.error;
20
+ if (typeof json.error?.message === 'string')
21
+ return json.error.message;
22
+ if (typeof json.message === 'string')
23
+ return json.message;
24
+ if (typeof json.detail === 'string')
25
+ return json.detail;
26
+ }
27
+ catch {
28
+ // Not JSON — use raw text, truncated
29
+ if (body.length > 200)
30
+ return body.slice(0, 200) + '…';
31
+ return body;
32
+ }
33
+ return body.length > 200 ? body.slice(0, 200) + '…' : body;
34
+ }
35
+ export async function handleErrorResponse(response, model) {
36
+ if (!response.ok) {
37
+ const responseBody = await response.text().catch(() => undefined);
38
+ const detail = extractErrorMessage(responseBody);
39
+ const message = detail
40
+ ? `${model} API error ${response.status}: ${detail}`
41
+ : `${model} API error ${response.status}`;
42
+ throw new ApiError(message, {
43
+ statusCode: response.status,
44
+ model,
45
+ responseBody,
46
+ });
47
+ }
48
+ }
49
+ //# sourceMappingURL=provider-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-utils.js","sourceRoot":"","sources":["../src/provider-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,MAAM,UAAU,aAAa,CAC3B,MAA0B,EAC1B,MAAc,EACd,YAAoB;IAEpB,MAAM,GAAG,GACP,MAAM;QACN,CAAC,OAAO,OAAO,KAAK,WAAW;YAC7B,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC;YACvB,CAAC,CAAC,SAAS,CAAC,CAAC;IACjB,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACb,GAAG,YAAY,8DAA8D,MAAM,wBAAwB,CAC5G,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAwB;IACnD,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9B,+BAA+B;QAC/B,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC;QACtD,IAAI,OAAO,IAAI,CAAC,KAAK,EAAE,OAAO,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;QACvE,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC,OAAO,CAAC;QAC1D,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC,MAAM,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,qCAAqC;QACrC,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC;QACvD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,QAAkB,EAClB,KAAa;IAEb,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAClE,MAAM,MAAM,GAAG,mBAAmB,CAAC,YAAY,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,MAAM;YACpB,CAAC,CAAC,GAAG,KAAK,cAAc,QAAQ,CAAC,MAAM,KAAK,MAAM,EAAE;YACpD,CAAC,CAAC,GAAG,KAAK,cAAc,QAAQ,CAAC,MAAM,EAAE,CAAC;QAE5C,MAAM,IAAI,QAAQ,CAAC,OAAO,EAAE;YAC1B,UAAU,EAAE,QAAQ,CAAC,MAAM;YAC3B,KAAK;YACL,YAAY;SACb,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
@@ -0,0 +1,35 @@
1
+ import type { SpeechProvider, ResolvedModel } from '../../speech-provider.js';
2
+ export interface CartesiaSpeechProviderConfig {
3
+ apiKey?: string;
4
+ baseURL?: string;
5
+ fetch?: typeof globalThis.fetch;
6
+ }
7
+ export declare class CartesiaSpeechProvider implements SpeechProvider<string, string> {
8
+ readonly id = "cartesia";
9
+ readonly defaultModel = "sonic-3";
10
+ readonly models: readonly [{
11
+ readonly id: "sonic-3";
12
+ readonly languages: readonly ["en", "fr", "de", "es", "pt", "zh", "ja", "hi", "it", "ko", "nl", "pl", "ru", "sv", "tr"];
13
+ }, {
14
+ readonly id: "sonic-2";
15
+ readonly languages: readonly ["en"];
16
+ }];
17
+ private readonly apiKey;
18
+ private readonly baseURL;
19
+ private readonly fetchFn;
20
+ constructor(config: CartesiaSpeechProviderConfig);
21
+ generate(options: {
22
+ modelId: string;
23
+ text: string;
24
+ voice?: string;
25
+ providerOptions?: Record<string, unknown>;
26
+ abortSignal?: AbortSignal;
27
+ headers?: Record<string, string>;
28
+ }): Promise<{
29
+ audio: Uint8Array;
30
+ mediaType: string;
31
+ providerMetadata?: Record<string, unknown>;
32
+ }>;
33
+ }
34
+ export declare function createCartesia(config?: CartesiaSpeechProviderConfig): (modelId?: string) => ResolvedModel<string>;
35
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/cartesia/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAG9E,MAAM,WAAW,4BAA4B;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACjC;AAED,qBAAa,sBAAuB,YAAW,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC;IAC3E,QAAQ,CAAC,EAAE,cAAc;IACzB,QAAQ,CAAC,YAAY,aAAa;IAElC,QAAQ,CAAC,MAAM;;;;;;OAGJ;IAEX,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;gBAEtC,MAAM,EAAE,4BAA4B;IAM1C,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;CAqCH;AAED,wBAAgB,cAAc,CAAC,MAAM,GAAE,4BAAiC,IAG7C,UAAU,MAAM,KAAG,aAAa,CAAC,MAAM,CAAC,CAMlE"}
@@ -0,0 +1,59 @@
1
+ import { resolveApiKey, handleErrorResponse } from '../../provider-utils.js';
2
+ export class CartesiaSpeechProvider {
3
+ id = 'cartesia';
4
+ defaultModel = 'sonic-3';
5
+ models = [
6
+ { id: 'sonic-3', languages: ['en', 'fr', 'de', 'es', 'pt', 'zh', 'ja', 'hi', 'it', 'ko', 'nl', 'pl', 'ru', 'sv', 'tr'] },
7
+ { id: 'sonic-2', languages: ['en'] },
8
+ ];
9
+ apiKey;
10
+ baseURL;
11
+ fetchFn;
12
+ constructor(config) {
13
+ this.apiKey = config.apiKey;
14
+ this.baseURL = config.baseURL ?? 'https://api.cartesia.ai';
15
+ this.fetchFn = config.fetch ?? globalThis.fetch;
16
+ }
17
+ async generate(options) {
18
+ const url = `${this.baseURL}/tts/bytes`;
19
+ const body = {
20
+ output_format: {
21
+ container: 'wav',
22
+ encoding: 'pcm_f32le',
23
+ sample_rate: 44100,
24
+ },
25
+ ...options.providerOptions,
26
+ model_id: options.modelId,
27
+ transcript: options.text,
28
+ voice: { mode: 'id', id: options.voice },
29
+ };
30
+ const response = await this.fetchFn(url, {
31
+ method: 'POST',
32
+ headers: {
33
+ 'Content-Type': 'application/json',
34
+ 'X-API-Key': resolveApiKey(this.apiKey, 'CARTESIA_API_KEY', 'Cartesia'),
35
+ 'Cartesia-Version': '2025-04-16',
36
+ ...options.headers,
37
+ },
38
+ body: JSON.stringify(body),
39
+ signal: options.abortSignal,
40
+ });
41
+ await handleErrorResponse(response, `cartesia/${options.modelId}`);
42
+ const arrayBuffer = await response.arrayBuffer();
43
+ const mediaType = response.headers.get('content-type') ?? 'audio/mpeg';
44
+ return {
45
+ audio: new Uint8Array(arrayBuffer),
46
+ mediaType,
47
+ };
48
+ }
49
+ }
50
+ export function createCartesia(config = {}) {
51
+ const provider = new CartesiaSpeechProvider(config);
52
+ return function cartesia(modelId) {
53
+ return {
54
+ provider,
55
+ modelId: modelId ?? provider.defaultModel,
56
+ };
57
+ };
58
+ }
59
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/cartesia/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAQ7E,MAAM,OAAO,sBAAsB;IACxB,EAAE,GAAG,UAAU,CAAC;IAChB,YAAY,GAAG,SAAS,CAAC;IAEzB,MAAM,GAAG;QAChB,EAAE,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE;QACxH,EAAE,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,IAAI,CAAC,EAAE;KAC5B,CAAC;IAEM,MAAM,CAAqB;IAC3B,OAAO,CAAS;IAChB,OAAO,CAA0B;IAElD,YAAY,MAAoC;QAC9C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,yBAAyB,CAAC;QAC3D,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAOd;QAKC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,YAAY,CAAC;QAExC,MAAM,IAAI,GAA4B;YACpC,aAAa,EAAE;gBACb,SAAS,EAAE,KAAK;gBAChB,QAAQ,EAAE,WAAW;gBACrB,WAAW,EAAE,KAAK;aACnB;YACD,GAAG,OAAO,CAAC,eAAe;YAC1B,QAAQ,EAAE,OAAO,CAAC,OAAO;YACzB,UAAU,EAAE,OAAO,CAAC,IAAI;YACxB,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,KAAK,EAAE;SACzC,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE;YACvC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,WAAW,EAAE,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,kBAAkB,EAAE,UAAU,CAAC;gBACvE,kBAAkB,EAAE,YAAY;gBAChC,GAAG,OAAO,CAAC,OAAO;aACnB;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YAC1B,MAAM,EAAE,OAAO,CAAC,WAAW;SAC5B,CAAC,CAAC;QAEH,MAAM,mBAAmB,CAAC,QAAQ,EAAE,YAAY,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAEnE,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC;QACjD,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,YAAY,CAAC;QAEvE,OAAO;YACL,KAAK,EAAE,IAAI,UAAU,CAAC,WAAW,CAAC;YAClC,SAAS;SACV,CAAC;IACJ,CAAC;CACF;AAED,MAAM,UAAU,cAAc,CAAC,SAAuC,EAAE;IACtE,MAAM,QAAQ,GAAG,IAAI,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAEpD,OAAO,SAAS,QAAQ,CAAC,OAAgB;QACvC,OAAO;YACL,QAAQ;YACR,OAAO,EAAE,OAAO,IAAI,QAAQ,CAAC,YAAY;SAC1C,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,32 @@
1
+ import type { SpeechProvider, ResolvedModel } from '../../speech-provider.js';
2
+ export interface DeepgramSpeechProviderConfig {
3
+ apiKey?: string;
4
+ baseURL?: string;
5
+ fetch?: typeof globalThis.fetch;
6
+ }
7
+ export declare class DeepgramSpeechProvider implements SpeechProvider<string, string> {
8
+ readonly id = "deepgram";
9
+ readonly defaultModel = "aura-2";
10
+ readonly models: readonly [{
11
+ readonly id: "aura-2";
12
+ readonly languages: readonly ["en"];
13
+ }];
14
+ private readonly apiKey;
15
+ private readonly baseURL;
16
+ private readonly fetchFn;
17
+ constructor(config: DeepgramSpeechProviderConfig);
18
+ generate(options: {
19
+ modelId: string;
20
+ text: string;
21
+ voice?: string;
22
+ providerOptions?: Record<string, unknown>;
23
+ abortSignal?: AbortSignal;
24
+ headers?: Record<string, string>;
25
+ }): Promise<{
26
+ audio: Uint8Array;
27
+ mediaType: string;
28
+ providerMetadata?: Record<string, unknown>;
29
+ }>;
30
+ }
31
+ export declare function createDeepgram(config?: DeepgramSpeechProviderConfig): (modelId?: string) => ResolvedModel<string>;
32
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/deepgram/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAG9E,MAAM,WAAW,4BAA4B;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACjC;AAED,qBAAa,sBAAuB,YAAW,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC;IAC3E,QAAQ,CAAC,EAAE,cAAc;IACzB,QAAQ,CAAC,YAAY,YAAY;IAEjC,QAAQ,CAAC,MAAM;;;OAEJ;IAEX,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;gBAEtC,MAAM,EAAE,4BAA4B;IAM1C,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;CAiCH;AAED,wBAAgB,cAAc,CAAC,MAAM,GAAE,4BAAiC,IAG7C,UAAU,MAAM,KAAG,aAAa,CAAC,MAAM,CAAC,CAMlE"}
@@ -0,0 +1,53 @@
1
+ import { resolveApiKey, handleErrorResponse } from '../../provider-utils.js';
2
+ export class DeepgramSpeechProvider {
3
+ id = 'deepgram';
4
+ defaultModel = 'aura-2';
5
+ models = [
6
+ { id: 'aura-2', languages: ['en'] },
7
+ ];
8
+ apiKey;
9
+ baseURL;
10
+ fetchFn;
11
+ constructor(config) {
12
+ this.apiKey = config.apiKey;
13
+ this.baseURL = config.baseURL ?? 'https://api.deepgram.com/v1';
14
+ this.fetchFn = config.fetch ?? globalThis.fetch;
15
+ }
16
+ async generate(options) {
17
+ const modelParam = options.voice
18
+ ? `${options.modelId}-${options.voice}`
19
+ : options.modelId;
20
+ const url = `${this.baseURL}/speak?model=${encodeURIComponent(modelParam)}`;
21
+ const body = {
22
+ ...options.providerOptions,
23
+ text: options.text,
24
+ };
25
+ const response = await this.fetchFn(url, {
26
+ method: 'POST',
27
+ headers: {
28
+ 'Content-Type': 'application/json',
29
+ 'Authorization': `Token ${resolveApiKey(this.apiKey, 'DEEPGRAM_API_KEY', 'Deepgram')}`,
30
+ ...options.headers,
31
+ },
32
+ body: JSON.stringify(body),
33
+ signal: options.abortSignal,
34
+ });
35
+ await handleErrorResponse(response, `deepgram/${options.modelId}`);
36
+ const arrayBuffer = await response.arrayBuffer();
37
+ const mediaType = response.headers.get('content-type') ?? 'audio/mpeg';
38
+ return {
39
+ audio: new Uint8Array(arrayBuffer),
40
+ mediaType,
41
+ };
42
+ }
43
+ }
44
+ export function createDeepgram(config = {}) {
45
+ const provider = new DeepgramSpeechProvider(config);
46
+ return function deepgram(modelId) {
47
+ return {
48
+ provider,
49
+ modelId: modelId ?? provider.defaultModel,
50
+ };
51
+ };
52
+ }
53
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/deepgram/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAQ7E,MAAM,OAAO,sBAAsB;IACxB,EAAE,GAAG,UAAU,CAAC;IAChB,YAAY,GAAG,QAAQ,CAAC;IAExB,MAAM,GAAG;QAChB,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,IAAI,CAAC,EAAE;KAC3B,CAAC;IAEM,MAAM,CAAqB;IAC3B,OAAO,CAAS;IAChB,OAAO,CAA0B;IAElD,YAAY,MAAoC;QAC9C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,6BAA6B,CAAC;QAC/D,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAOd;QAKC,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK;YAC9B,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,KAAK,EAAE;YACvC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;QAEpB,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,gBAAgB,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC;QAE5E,MAAM,IAAI,GAA4B;YACpC,GAAG,OAAO,CAAC,eAAe;YAC1B,IAAI,EAAE,OAAO,CAAC,IAAI;SACnB,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE;YACvC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,eAAe,EAAE,SAAS,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,kBAAkB,EAAE,UAAU,CAAC,EAAE;gBACtF,GAAG,OAAO,CAAC,OAAO;aACnB;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YAC1B,MAAM,EAAE,OAAO,CAAC,WAAW;SAC5B,CAAC,CAAC;QAEH,MAAM,mBAAmB,CAAC,QAAQ,EAAE,YAAY,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAEnE,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC;QACjD,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,YAAY,CAAC;QAEvE,OAAO;YACL,KAAK,EAAE,IAAI,UAAU,CAAC,WAAW,CAAC;YAClC,SAAS;SACV,CAAC;IACJ,CAAC;CACF;AAED,MAAM,UAAU,cAAc,CAAC,SAAuC,EAAE;IACtE,MAAM,QAAQ,GAAG,IAAI,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAEpD,OAAO,SAAS,QAAQ,CAAC,OAAgB;QACvC,OAAO;YACL,QAAQ;YACR,OAAO,EAAE,OAAO,IAAI,QAAQ,CAAC,YAAY;SAC1C,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export type ElevenLabsSpeechOptions = Record<string, unknown>;
2
+ //# sourceMappingURL=elevenlabs-options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elevenlabs-options.d.ts","sourceRoot":"","sources":["../../../src/providers/elevenlabs/elevenlabs-options.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,uBAAuB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=elevenlabs-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elevenlabs-options.js","sourceRoot":"","sources":["../../../src/providers/elevenlabs/elevenlabs-options.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ import { type ElevenLabsSpeechProviderConfig } from './elevenlabs-speech-model.js';
2
+ import type { ResolvedModel } from '../../speech-provider.js';
3
+ import type { ElevenLabsSpeechOptions } from './elevenlabs-options.js';
4
+ export declare function createElevenLabs(config?: ElevenLabsSpeechProviderConfig): (modelId?: string) => ResolvedModel<ElevenLabsSpeechOptions>;
5
+ //# sourceMappingURL=elevenlabs-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elevenlabs-provider.d.ts","sourceRoot":"","sources":["../../../src/providers/elevenlabs/elevenlabs-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,8BAA8B,EACpC,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAEvE,wBAAgB,gBAAgB,CAAC,MAAM,GAAE,8BAAmC,IAIxE,UAAU,MAAM,KACf,aAAa,CAAC,uBAAuB,CAAC,CAM1C"}
@@ -0,0 +1,11 @@
1
+ import { ElevenLabsSpeechProvider, } from './elevenlabs-speech-model.js';
2
+ export function createElevenLabs(config = {}) {
3
+ const provider = new ElevenLabsSpeechProvider(config);
4
+ return function elevenlabs(modelId) {
5
+ return {
6
+ provider,
7
+ modelId: modelId ?? provider.defaultModel,
8
+ };
9
+ };
10
+ }
11
+ //# sourceMappingURL=elevenlabs-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elevenlabs-provider.js","sourceRoot":"","sources":["../../../src/providers/elevenlabs/elevenlabs-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,GAEzB,MAAM,8BAA8B,CAAC;AAItC,MAAM,UAAU,gBAAgB,CAAC,SAAyC,EAAE;IAC1E,MAAM,QAAQ,GAAG,IAAI,wBAAwB,CAAC,MAAM,CAAC,CAAC;IAEtD,OAAO,SAAS,UAAU,CACxB,OAAgB;QAEhB,OAAO;YACL,QAAQ;YACR,OAAO,EAAE,OAAO,IAAI,QAAQ,CAAC,YAAY;SAC1C,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}