@fabric-harness/sdk 1.11.0 → 1.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.
Files changed (48) hide show
  1. package/dist/index.d.ts +12 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +5 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/model-pricing.d.ts +6 -0
  6. package/dist/model-pricing.d.ts.map +1 -1
  7. package/dist/model-pricing.js +17 -0
  8. package/dist/model-pricing.js.map +1 -1
  9. package/dist/model.d.ts +4 -0
  10. package/dist/model.d.ts.map +1 -1
  11. package/dist/model.js.map +1 -1
  12. package/dist/strict.d.ts +12 -0
  13. package/dist/strict.d.ts.map +1 -1
  14. package/dist/strict.js +5 -0
  15. package/dist/strict.js.map +1 -1
  16. package/dist/voice-pipeline.d.ts +49 -0
  17. package/dist/voice-pipeline.d.ts.map +1 -0
  18. package/dist/voice-pipeline.js +312 -0
  19. package/dist/voice-pipeline.js.map +1 -0
  20. package/dist/voice-stt-cartesia.d.ts +29 -0
  21. package/dist/voice-stt-cartesia.d.ts.map +1 -0
  22. package/dist/voice-stt-cartesia.js +160 -0
  23. package/dist/voice-stt-cartesia.js.map +1 -0
  24. package/dist/voice-stt-deepgram.d.ts +28 -0
  25. package/dist/voice-stt-deepgram.d.ts.map +1 -0
  26. package/dist/voice-stt-deepgram.js +174 -0
  27. package/dist/voice-stt-deepgram.js.map +1 -0
  28. package/dist/voice-stt.d.ts +72 -0
  29. package/dist/voice-stt.d.ts.map +1 -0
  30. package/dist/voice-stt.js +8 -0
  31. package/dist/voice-stt.js.map +1 -0
  32. package/dist/voice-tts-cartesia.d.ts +36 -0
  33. package/dist/voice-tts-cartesia.d.ts.map +1 -0
  34. package/dist/voice-tts-cartesia.js +159 -0
  35. package/dist/voice-tts-cartesia.js.map +1 -0
  36. package/dist/voice-tts-elevenlabs.d.ts +35 -0
  37. package/dist/voice-tts-elevenlabs.d.ts.map +1 -0
  38. package/dist/voice-tts-elevenlabs.js +163 -0
  39. package/dist/voice-tts-elevenlabs.js.map +1 -0
  40. package/dist/voice-tts.d.ts +50 -0
  41. package/dist/voice-tts.d.ts.map +1 -0
  42. package/dist/voice-tts.js +11 -0
  43. package/dist/voice-tts.js.map +1 -0
  44. package/dist/voice-ws-shared.d.ts +20 -0
  45. package/dist/voice-ws-shared.d.ts.map +1 -0
  46. package/dist/voice-ws-shared.js +42 -0
  47. package/dist/voice-ws-shared.js.map +1 -0
  48. package/package.json +8 -8
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Deepgram streaming STT provider. Default STT for `PipelineVoiceProvider`.
3
+ *
4
+ * Connects to `wss://api.deepgram.com/v1/listen` with WS subprotocol
5
+ * `Token <api_key>`. Emits final + interim transcripts plus VAD
6
+ * `speech_started` / `UtteranceEnd` events for barge-in handling.
7
+ *
8
+ * Pricing: per audio second. Rates registered under provider `deepgram`.
9
+ */
10
+ import { openVoiceWs, toError } from './voice-ws-shared.js';
11
+ const DEFAULT_BASE = 'wss://api.deepgram.com';
12
+ const DEFAULT_MODEL = 'nova-3';
13
+ export class DeepgramSttProvider {
14
+ name;
15
+ apiKey;
16
+ defaultModel;
17
+ baseUrl;
18
+ constructor(options) {
19
+ if (!options.apiKey)
20
+ throw new Error('DeepgramSttProvider: apiKey is required.');
21
+ this.apiKey = options.apiKey;
22
+ this.defaultModel = options.model ?? DEFAULT_MODEL;
23
+ this.baseUrl = options.baseUrl ?? DEFAULT_BASE;
24
+ this.name = options.name ?? 'deepgram';
25
+ }
26
+ async open(opts = {}) {
27
+ const format = opts.audioFormat ?? 'pcm16';
28
+ const sampleRate = opts.sampleRate ?? defaultSampleRate(format);
29
+ const params = new URLSearchParams({
30
+ model: opts.model ?? this.defaultModel,
31
+ encoding: deepgramEncoding(format),
32
+ sample_rate: String(sampleRate),
33
+ channels: '1',
34
+ interim_results: 'true',
35
+ smart_format: 'true',
36
+ vad_events: 'true',
37
+ });
38
+ if (opts.language)
39
+ params.set('language', opts.language);
40
+ if (opts.vad !== 'none') {
41
+ params.set('endpointing', String(opts.endpointingMs ?? 300));
42
+ }
43
+ const url = `${this.baseUrl}/v1/listen?${params.toString()}`;
44
+ const ws = await openVoiceWs(url, { Authorization: `Token ${this.apiKey}` });
45
+ return new DeepgramSttSession(ws, opts.signal);
46
+ }
47
+ }
48
+ class DeepgramSttSession {
49
+ ws;
50
+ queue = [];
51
+ waiters = [];
52
+ closed = false;
53
+ secondsSent = 0;
54
+ startedAt = Date.now();
55
+ constructor(ws, signal) {
56
+ this.ws = ws;
57
+ ws.addEventListener('message', (ev) => this.onMessage(ev.data));
58
+ ws.addEventListener('error', (ev) => {
59
+ this.push({ type: 'error', message: toError(ev, 'Deepgram WS error').message });
60
+ });
61
+ ws.addEventListener('close', () => this.terminate());
62
+ signal?.addEventListener('abort', () => void this.close(), { once: true });
63
+ }
64
+ send(frame) {
65
+ if (this.closed)
66
+ return;
67
+ this.ws.send(frame);
68
+ // Estimate seconds sent assuming 16kHz pcm16 → 32 KB/s; updates rough
69
+ // billing rollup. Override via finer accounting if you care about exactness.
70
+ this.secondsSent += frame.byteLength / 32_000;
71
+ }
72
+ events() {
73
+ return {
74
+ [Symbol.asyncIterator]: () => ({
75
+ next: () => this.next(),
76
+ return: async () => { await this.close(); return { value: undefined, done: true }; },
77
+ }),
78
+ };
79
+ }
80
+ async close() {
81
+ if (this.closed)
82
+ return;
83
+ try {
84
+ this.ws.send(JSON.stringify({ type: 'CloseStream' }));
85
+ }
86
+ catch { }
87
+ try {
88
+ this.ws.close();
89
+ }
90
+ catch { }
91
+ this.terminate();
92
+ }
93
+ usage() {
94
+ return { seconds: this.secondsSent, durationMs: Date.now() - this.startedAt };
95
+ }
96
+ terminate() {
97
+ if (this.closed)
98
+ return;
99
+ this.closed = true;
100
+ while (this.waiters.length > 0) {
101
+ this.waiters.shift()({ value: undefined, done: true });
102
+ }
103
+ }
104
+ next() {
105
+ if (this.queue.length > 0)
106
+ return Promise.resolve({ value: this.queue.shift(), done: false });
107
+ if (this.closed)
108
+ return Promise.resolve({ value: undefined, done: true });
109
+ return new Promise((resolve) => this.waiters.push(resolve));
110
+ }
111
+ push(event) {
112
+ if (this.closed)
113
+ return;
114
+ const w = this.waiters.shift();
115
+ if (w)
116
+ w({ value: event, done: false });
117
+ else
118
+ this.queue.push(event);
119
+ }
120
+ onMessage(raw) {
121
+ const text = typeof raw === 'string' ? raw : (raw && typeof raw === 'object' && 'toString' in raw)
122
+ ? String(raw)
123
+ : '';
124
+ let payload;
125
+ try {
126
+ payload = JSON.parse(text);
127
+ }
128
+ catch {
129
+ return;
130
+ }
131
+ const type = String(payload.type ?? '');
132
+ switch (type) {
133
+ case 'Results': {
134
+ const channel = payload.channel;
135
+ const transcript = channel?.alternatives?.[0]?.transcript ?? '';
136
+ if (!transcript)
137
+ return;
138
+ const isFinal = payload.is_final === true;
139
+ if (isFinal)
140
+ this.push({ type: 'transcript', text: transcript, isFinal: true });
141
+ else
142
+ this.push({ type: 'partial', text: transcript, isFinal: false });
143
+ return;
144
+ }
145
+ case 'SpeechStarted': {
146
+ this.push({ type: 'speech_started' });
147
+ return;
148
+ }
149
+ case 'UtteranceEnd': {
150
+ this.push({ type: 'speech_ended' });
151
+ return;
152
+ }
153
+ case 'Error': {
154
+ this.push({ type: 'error', message: String(payload.message ?? 'deepgram error') });
155
+ return;
156
+ }
157
+ default:
158
+ return;
159
+ }
160
+ }
161
+ }
162
+ function deepgramEncoding(format) {
163
+ if (format === 'g711_ulaw')
164
+ return 'mulaw';
165
+ if (format === 'g711_alaw')
166
+ return 'alaw';
167
+ return 'linear16';
168
+ }
169
+ function defaultSampleRate(format) {
170
+ if (format === 'g711_ulaw' || format === 'g711_alaw')
171
+ return 8000;
172
+ return 16000;
173
+ }
174
+ //# sourceMappingURL=voice-stt-deepgram.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice-stt-deepgram.js","sourceRoot":"","sources":["../src/voice-stt-deepgram.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Speech-to-text provider surface. fabric-harness ships Deepgram and
3
+ * Cartesia implementations; bring-your-own for Whisper, AssemblyAI, etc.
4
+ * Used by `PipelineVoiceProvider` to drive the audio-in side of
5
+ * STT→LLM→TTS voice agents.
6
+ */
7
+ import type { VoiceAudioFormat } from './voice.js';
8
+ export interface SttSessionOptions {
9
+ /** Audio format the caller will feed via `send()`. Default `pcm16`. */
10
+ audioFormat?: VoiceAudioFormat;
11
+ /** Sample rate in Hz. Default 16000 (Deepgram-recommended) for `pcm16`. */
12
+ sampleRate?: number;
13
+ /** BCP-47 language tag, e.g. `en-US`, `es-MX`, or `multi` for autodetect. */
14
+ language?: string;
15
+ /** Provider-specific model id. */
16
+ model?: string;
17
+ /**
18
+ * Voice-activity detection mode. `endpointing` lets the provider mark
19
+ * end-of-utterance via silence detection; `none` returns continuous
20
+ * transcripts and leaves turn detection to the caller.
21
+ */
22
+ vad?: 'endpointing' | 'none';
23
+ /**
24
+ * Optional ms of trailing silence to treat as end-of-utterance.
25
+ * Provider-specific default when omitted.
26
+ */
27
+ endpointingMs?: number;
28
+ /** Abort signal — terminates the session cleanly. */
29
+ signal?: AbortSignal;
30
+ }
31
+ export type SttEvent = {
32
+ type: 'transcript';
33
+ /** Final transcript for an utterance — safe to send to LLM. */
34
+ text: string;
35
+ /** Whether this is the final transcript for the current utterance. */
36
+ isFinal: true;
37
+ } | {
38
+ type: 'partial';
39
+ /** Interim transcript — useful for live UI, NOT for LLM input. */
40
+ text: string;
41
+ isFinal: false;
42
+ } | {
43
+ type: 'speech_started';
44
+ } | {
45
+ type: 'speech_ended';
46
+ } | {
47
+ type: 'error';
48
+ message: string;
49
+ };
50
+ export interface SttSessionUsage {
51
+ /** Audio seconds processed (used for billing rollup). */
52
+ seconds: number;
53
+ /** Wall-clock duration in milliseconds. */
54
+ durationMs: number;
55
+ }
56
+ export interface SttSession {
57
+ /** Send a raw audio frame in the configured format. */
58
+ send(frame: Uint8Array): void;
59
+ /** Async iterable of recognition events. Closes when the session ends. */
60
+ events(): AsyncIterable<SttEvent>;
61
+ /** Tear down the underlying connection. */
62
+ close(): Promise<void>;
63
+ /** Usage rollup — populated as audio is processed. */
64
+ usage(): SttSessionUsage;
65
+ }
66
+ export interface SttProvider {
67
+ /** Stable provider id used in cost telemetry, e.g. `deepgram`, `cartesia`. */
68
+ readonly name: string;
69
+ /** Open a streaming recognition session. */
70
+ open(opts?: SttSessionOptions): Promise<SttSession>;
71
+ }
72
+ //# sourceMappingURL=voice-stt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice-stt.d.ts","sourceRoot":"","sources":["../src/voice-stt.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,MAAM,WAAW,iBAAiB;IAChC,uEAAuE;IACvE,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,2EAA2E;IAC3E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kCAAkC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,GAAG,CAAC,EAAE,aAAa,GAAG,MAAM,CAAC;IAC7B;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qDAAqD;IACrD,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,MAAM,QAAQ,GAChB;IACE,IAAI,EAAE,YAAY,CAAC;IACnB,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC;IACb,sEAAsE;IACtE,OAAO,EAAE,IAAI,CAAC;CACf,GACD;IACE,IAAI,EAAE,SAAS,CAAC;IAChB,kEAAkE;IAClE,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,KAAK,CAAC;CAChB,GACD;IACE,IAAI,EAAE,gBAAgB,CAAC;CAExB,GACD;IACE,IAAI,EAAE,cAAc,CAAC;CACtB,GACD;IACE,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEN,MAAM,WAAW,eAAe;IAC9B,yDAAyD;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,2CAA2C;IAC3C,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,uDAAuD;IACvD,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IAC9B,0EAA0E;IAC1E,MAAM,IAAI,aAAa,CAAC,QAAQ,CAAC,CAAC;IAClC,2CAA2C;IAC3C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,sDAAsD;IACtD,KAAK,IAAI,eAAe,CAAC;CAC1B;AAED,MAAM,WAAW,WAAW;IAC1B,8EAA8E;IAC9E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,4CAA4C;IAC5C,IAAI,CAAC,IAAI,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CACrD"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Speech-to-text provider surface. fabric-harness ships Deepgram and
3
+ * Cartesia implementations; bring-your-own for Whisper, AssemblyAI, etc.
4
+ * Used by `PipelineVoiceProvider` to drive the audio-in side of
5
+ * STT→LLM→TTS voice agents.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=voice-stt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice-stt.js","sourceRoot":"","sources":["../src/voice-stt.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Cartesia streaming TTS provider.
3
+ *
4
+ * Uses the Cartesia WS endpoint (`wss://api.cartesia.ai/tts/websocket`).
5
+ * `sonic-2` is the v1.12 default — Cartesia's flagship low-latency model.
6
+ *
7
+ * Pricing: per character. Rates registered in `model-pricing.ts` under
8
+ * provider `cartesia`.
9
+ */
10
+ import type { TtsProvider, TtsSynthesisOptions, TtsSynthesisUsage } from './voice-tts.js';
11
+ export interface CartesiaTtsProviderOptions {
12
+ apiKey: string;
13
+ /** Default voice id when `synthesize` doesn't override. */
14
+ defaultVoice?: string;
15
+ /** Model id. Default `sonic-2`. */
16
+ model?: string;
17
+ /** Cartesia API version. Default `2024-11-13`. */
18
+ apiVersion?: string;
19
+ /** Override base URL. */
20
+ baseUrl?: string;
21
+ /** Provider name override. Default `cartesia`. */
22
+ name?: string;
23
+ }
24
+ export declare class CartesiaTtsProvider implements TtsProvider {
25
+ readonly name: string;
26
+ private readonly apiKey;
27
+ private readonly defaultVoice;
28
+ private readonly model;
29
+ private readonly apiVersion;
30
+ private readonly baseUrl;
31
+ private last?;
32
+ constructor(options: CartesiaTtsProviderOptions);
33
+ lastUsage(): TtsSynthesisUsage | undefined;
34
+ synthesize(text: string, opts?: TtsSynthesisOptions): AsyncIterable<Uint8Array>;
35
+ }
36
+ //# sourceMappingURL=voice-tts-cartesia.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice-tts-cartesia.d.ts","sourceRoot":"","sources":["../src/voice-tts-cartesia.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAG1F,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yBAAyB;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kDAAkD;IAClD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAQD,qBAAa,mBAAoB,YAAW,WAAW;IACrD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,IAAI,CAAC,CAAoB;gBAErB,OAAO,EAAE,0BAA0B;IAU/C,SAAS,IAAI,iBAAiB,GAAG,SAAS;IAI1C,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,mBAAwB,GAAG,aAAa,CAAC,UAAU,CAAC;CA+FpF"}
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Cartesia streaming TTS provider.
3
+ *
4
+ * Uses the Cartesia WS endpoint (`wss://api.cartesia.ai/tts/websocket`).
5
+ * `sonic-2` is the v1.12 default — Cartesia's flagship low-latency model.
6
+ *
7
+ * Pricing: per character. Rates registered in `model-pricing.ts` under
8
+ * provider `cartesia`.
9
+ */
10
+ import { base64ToBytes, openVoiceWs, toError } from './voice-ws-shared.js';
11
+ const DEFAULT_BASE = 'wss://api.cartesia.ai';
12
+ const DEFAULT_MODEL = 'sonic-2';
13
+ const DEFAULT_API_VERSION = '2024-11-13';
14
+ // Cartesia 'Newsman' voice — a public default. Override per-call.
15
+ const DEFAULT_VOICE = 'd46abd1d-2d02-43e8-819f-51fb652c1c61';
16
+ export class CartesiaTtsProvider {
17
+ name;
18
+ apiKey;
19
+ defaultVoice;
20
+ model;
21
+ apiVersion;
22
+ baseUrl;
23
+ last;
24
+ constructor(options) {
25
+ if (!options.apiKey)
26
+ throw new Error('CartesiaTtsProvider: apiKey is required.');
27
+ this.apiKey = options.apiKey;
28
+ this.defaultVoice = options.defaultVoice ?? DEFAULT_VOICE;
29
+ this.model = options.model ?? DEFAULT_MODEL;
30
+ this.apiVersion = options.apiVersion ?? DEFAULT_API_VERSION;
31
+ this.baseUrl = options.baseUrl ?? DEFAULT_BASE;
32
+ this.name = options.name ?? 'cartesia';
33
+ }
34
+ lastUsage() {
35
+ return this.last;
36
+ }
37
+ synthesize(text, opts = {}) {
38
+ const voice = opts.voice ?? this.defaultVoice;
39
+ const format = opts.audioFormat ?? 'pcm16';
40
+ const sampleRate = opts.sampleRate ?? defaultSampleRate(format);
41
+ const startedAt = Date.now();
42
+ let totalBytes = 0;
43
+ const charCount = text.length;
44
+ const provider = this;
45
+ return {
46
+ [Symbol.asyncIterator]: async function* () {
47
+ const url = `${provider.baseUrl}/tts/websocket?cartesia_version=${encodeURIComponent(provider.apiVersion)}&api_key=${encodeURIComponent(provider.apiKey)}`;
48
+ const ws = await openVoiceWs(url, {});
49
+ const queue = [];
50
+ const waiters = [];
51
+ let closed = false;
52
+ let errorMsg;
53
+ const push = (chunk) => {
54
+ if (closed)
55
+ return;
56
+ if (!chunk) {
57
+ closed = true;
58
+ while (waiters.length > 0)
59
+ waiters.shift()({ value: undefined, done: true });
60
+ return;
61
+ }
62
+ totalBytes += chunk.byteLength;
63
+ const w = waiters.shift();
64
+ if (w)
65
+ w({ value: chunk, done: false });
66
+ else
67
+ queue.push(chunk);
68
+ };
69
+ ws.addEventListener('message', (ev) => {
70
+ const raw = typeof ev.data === 'string' ? ev.data : ev.data?.toString?.() ?? '';
71
+ let payload;
72
+ try {
73
+ payload = JSON.parse(raw);
74
+ }
75
+ catch {
76
+ return;
77
+ }
78
+ const type = String(payload.type ?? '');
79
+ if (type === 'chunk' && typeof payload.data === 'string') {
80
+ push(base64ToBytes(payload.data));
81
+ }
82
+ else if (type === 'done') {
83
+ push(undefined);
84
+ try {
85
+ ws.close();
86
+ }
87
+ catch { }
88
+ }
89
+ else if (type === 'error') {
90
+ errorMsg = String(payload.error ?? payload.message ?? 'cartesia error');
91
+ push(undefined);
92
+ try {
93
+ ws.close();
94
+ }
95
+ catch { }
96
+ }
97
+ });
98
+ ws.addEventListener('error', (ev) => {
99
+ errorMsg = toError(ev, 'Cartesia WS error').message;
100
+ push(undefined);
101
+ });
102
+ ws.addEventListener('close', () => push(undefined));
103
+ const outputContainer = format === 'g711_ulaw' ? 'mulaw' : 'raw';
104
+ const encoding = format === 'g711_ulaw' ? 'pcm_mulaw' : 'pcm_s16le';
105
+ ws.send(JSON.stringify({
106
+ model_id: provider.model,
107
+ voice: { mode: 'id', id: voice },
108
+ transcript: text,
109
+ continue: false,
110
+ context_id: cryptoRandomId(),
111
+ language: 'en',
112
+ output_format: {
113
+ container: outputContainer,
114
+ encoding,
115
+ sample_rate: sampleRate,
116
+ },
117
+ ...(opts.speed !== undefined ? { speed: opts.speed } : {}),
118
+ }));
119
+ opts.signal?.addEventListener('abort', () => { try {
120
+ ws.close();
121
+ }
122
+ catch { } push(undefined); }, { once: true });
123
+ try {
124
+ while (true) {
125
+ if (queue.length > 0) {
126
+ yield queue.shift();
127
+ continue;
128
+ }
129
+ if (closed)
130
+ break;
131
+ const next = await new Promise((resolve) => waiters.push(resolve));
132
+ if (next.done)
133
+ break;
134
+ yield next.value;
135
+ }
136
+ if (errorMsg)
137
+ throw new Error(`Cartesia TTS: ${errorMsg}`);
138
+ }
139
+ finally {
140
+ provider.last = {
141
+ characters: charCount,
142
+ audioBytes: totalBytes,
143
+ durationMs: Date.now() - startedAt,
144
+ };
145
+ }
146
+ },
147
+ };
148
+ }
149
+ }
150
+ function defaultSampleRate(format) {
151
+ if (format === 'g711_ulaw' || format === 'g711_alaw')
152
+ return 8000;
153
+ return 24000;
154
+ }
155
+ function cryptoRandomId() {
156
+ // Lightweight per-call id — Cartesia accepts any unique string.
157
+ return `fh-${Math.random().toString(36).slice(2, 10)}-${Date.now().toString(36)}`;
158
+ }
159
+ //# sourceMappingURL=voice-tts-cartesia.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice-tts-cartesia.js","sourceRoot":"","sources":["../src/voice-tts-cartesia.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * ElevenLabs streaming TTS provider.
3
+ *
4
+ * Uses the WebSocket streaming endpoint
5
+ * (`wss://api.elevenlabs.io/v1/text-to-speech/:voiceId/stream-input`) so
6
+ * audio frames stream out as text arrives. PCM 16-bit little-endian at
7
+ * configurable sample rate; μ-law 8kHz available for telephony.
8
+ *
9
+ * Pricing: billed per character of input text. Rates registered in
10
+ * `model-pricing.ts` under provider `elevenlabs`.
11
+ */
12
+ import type { TtsProvider, TtsSynthesisOptions, TtsSynthesisUsage } from './voice-tts.js';
13
+ export interface ElevenLabsTtsProviderOptions {
14
+ apiKey: string;
15
+ /** Default voice id when `synthesize` doesn't override. */
16
+ defaultVoice?: string;
17
+ /** Default model id. `eleven_turbo_v2_5` is the v1.12 default (low latency). */
18
+ model?: string;
19
+ /** Override base URL — useful for region-pinned deployments. */
20
+ baseUrl?: string;
21
+ /** Provider name override for telemetry. Default `elevenlabs`. */
22
+ name?: string;
23
+ }
24
+ export declare class ElevenLabsTtsProvider implements TtsProvider {
25
+ readonly name: string;
26
+ private readonly apiKey;
27
+ private readonly defaultVoice;
28
+ private readonly model;
29
+ private readonly baseUrl;
30
+ private last?;
31
+ constructor(options: ElevenLabsTtsProviderOptions);
32
+ lastUsage(): TtsSynthesisUsage | undefined;
33
+ synthesize(text: string, opts?: TtsSynthesisOptions): AsyncIterable<Uint8Array>;
34
+ }
35
+ //# sourceMappingURL=voice-tts-elevenlabs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice-tts-elevenlabs.d.ts","sourceRoot":"","sources":["../src/voice-tts-elevenlabs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAG1F,MAAM,WAAW,4BAA4B;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gFAAgF;IAChF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kEAAkE;IAClE,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAMD,qBAAa,qBAAsB,YAAW,WAAW;IACvD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,IAAI,CAAC,CAAoB;gBAErB,OAAO,EAAE,4BAA4B;IASjD,SAAS,IAAI,iBAAiB,GAAG,SAAS;IAI1C,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,GAAE,mBAAwB,GAAG,aAAa,CAAC,UAAU,CAAC;CAwFpF"}