@tryhakim/voice 1.0.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 (91) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +188 -0
  3. package/dist/audio/speech-stream-ws.d.ts +40 -0
  4. package/dist/audio/speech-stream-ws.d.ts.map +1 -0
  5. package/dist/audio/speech-stream-ws.js +565 -0
  6. package/dist/audio/speech-stream-ws.js.map +1 -0
  7. package/dist/audio/speech.d.ts +46 -0
  8. package/dist/audio/speech.d.ts.map +1 -0
  9. package/dist/audio/speech.js +125 -0
  10. package/dist/audio/speech.js.map +1 -0
  11. package/dist/audio/stream.d.ts +38 -0
  12. package/dist/audio/stream.d.ts.map +1 -0
  13. package/dist/audio/stream.js +452 -0
  14. package/dist/audio/stream.js.map +1 -0
  15. package/dist/audio/to-blob.d.ts +10 -0
  16. package/dist/audio/to-blob.d.ts.map +1 -0
  17. package/dist/audio/to-blob.js +78 -0
  18. package/dist/audio/to-blob.js.map +1 -0
  19. package/dist/audio/transcriptions.d.ts +35 -0
  20. package/dist/audio/transcriptions.d.ts.map +1 -0
  21. package/dist/audio/transcriptions.js +105 -0
  22. package/dist/audio/transcriptions.js.map +1 -0
  23. package/dist/audio/translate-stream-ws.d.ts +37 -0
  24. package/dist/audio/translate-stream-ws.d.ts.map +1 -0
  25. package/dist/audio/translate-stream-ws.js +665 -0
  26. package/dist/audio/translate-stream-ws.js.map +1 -0
  27. package/dist/audio/translate.d.ts +36 -0
  28. package/dist/audio/translate.d.ts.map +1 -0
  29. package/dist/audio/translate.js +39 -0
  30. package/dist/audio/translate.js.map +1 -0
  31. package/dist/audio/voices.d.ts +47 -0
  32. package/dist/audio/voices.d.ts.map +1 -0
  33. package/dist/audio/voices.js +91 -0
  34. package/dist/audio/voices.js.map +1 -0
  35. package/dist/chat/completions.d.ts +76 -0
  36. package/dist/chat/completions.d.ts.map +1 -0
  37. package/dist/chat/completions.js +114 -0
  38. package/dist/chat/completions.js.map +1 -0
  39. package/dist/chat/index.d.ts +2 -0
  40. package/dist/chat/index.d.ts.map +1 -0
  41. package/dist/chat/index.js +2 -0
  42. package/dist/chat/index.js.map +1 -0
  43. package/dist/chat/sse.d.ts +12 -0
  44. package/dist/chat/sse.d.ts.map +1 -0
  45. package/dist/chat/sse.js +142 -0
  46. package/dist/chat/sse.js.map +1 -0
  47. package/dist/client.d.ts +63 -0
  48. package/dist/client.d.ts.map +1 -0
  49. package/dist/client.js +80 -0
  50. package/dist/client.js.map +1 -0
  51. package/dist/errors.d.ts +99 -0
  52. package/dist/errors.d.ts.map +1 -0
  53. package/dist/errors.js +158 -0
  54. package/dist/errors.js.map +1 -0
  55. package/dist/index.d.ts +27 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +25 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/jobs.d.ts +34 -0
  60. package/dist/jobs.d.ts.map +1 -0
  61. package/dist/jobs.js +62 -0
  62. package/dist/jobs.js.map +1 -0
  63. package/dist/observability.d.ts +28 -0
  64. package/dist/observability.d.ts.map +1 -0
  65. package/dist/observability.js +107 -0
  66. package/dist/observability.js.map +1 -0
  67. package/dist/settings.d.ts +49 -0
  68. package/dist/settings.d.ts.map +1 -0
  69. package/dist/settings.js +84 -0
  70. package/dist/settings.js.map +1 -0
  71. package/dist/transport.d.ts +82 -0
  72. package/dist/transport.d.ts.map +1 -0
  73. package/dist/transport.js +289 -0
  74. package/dist/transport.js.map +1 -0
  75. package/dist/types.d.ts +969 -0
  76. package/dist/types.d.ts.map +1 -0
  77. package/dist/types.js +11 -0
  78. package/dist/types.js.map +1 -0
  79. package/dist/usage.d.ts +43 -0
  80. package/dist/usage.d.ts.map +1 -0
  81. package/dist/usage.js +85 -0
  82. package/dist/usage.js.map +1 -0
  83. package/dist/version.d.ts +13 -0
  84. package/dist/version.d.ts.map +1 -0
  85. package/dist/version.js +13 -0
  86. package/dist/version.js.map +1 -0
  87. package/dist/webhooks.d.ts +84 -0
  88. package/dist/webhooks.d.ts.map +1 -0
  89. package/dist/webhooks.js +157 -0
  90. package/dist/webhooks.js.map +1 -0
  91. package/package.json +57 -0
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Shared helper for multipart uploads. Normalizes the broad SDK
3
+ * `AudioInput` union into a single `Blob` suitable for
4
+ * `FormData.append`. Extracted so the transcriptions + voices (clone)
5
+ * endpoints use identical input-coercion rules — a future multipart
6
+ * endpoint can import this helper instead of re-rolling it.
7
+ */
8
+ import { HakimError } from '../errors.js';
9
+ export async function audioInputToBlob(input, filename) {
10
+ if (isBlobLike(input)) {
11
+ return input;
12
+ }
13
+ if (input instanceof ArrayBuffer) {
14
+ return new Blob([toFixedArrayBuffer(new Uint8Array(input))]);
15
+ }
16
+ if (ArrayBuffer.isView(input)) {
17
+ return new Blob([toFixedArrayBuffer(input)]);
18
+ }
19
+ if (isReadableStream(input)) {
20
+ const parts = [];
21
+ for await (const raw of input) {
22
+ const chunk = raw;
23
+ if (chunk instanceof Uint8Array) {
24
+ parts.push(toFixedArrayBuffer(chunk));
25
+ }
26
+ else if (typeof chunk === 'string') {
27
+ parts.push(toFixedArrayBuffer(new TextEncoder().encode(chunk)));
28
+ }
29
+ else if (chunk instanceof ArrayBuffer) {
30
+ parts.push(chunk);
31
+ }
32
+ else if (ArrayBuffer.isView(chunk)) {
33
+ parts.push(toFixedArrayBuffer(chunk));
34
+ }
35
+ else {
36
+ throw new HakimError({
37
+ type: 'invalid_request_error',
38
+ code: 'invalid_audio_chunk',
39
+ message: `Hakim SDK: unsupported chunk type in stream (${typeof chunk}).`,
40
+ status: 400,
41
+ requestId: undefined,
42
+ });
43
+ }
44
+ }
45
+ return new Blob(parts);
46
+ }
47
+ throw new HakimError({
48
+ type: 'invalid_request_error',
49
+ code: 'invalid_audio_input',
50
+ message: `Hakim SDK: unsupported file input type (${typeof input}). Pass a Blob, Buffer, Uint8Array, ArrayBuffer, or Node ReadableStream. (filename=${filename})`,
51
+ status: 400,
52
+ requestId: undefined,
53
+ });
54
+ }
55
+ function isReadableStream(value) {
56
+ if (!value || typeof value !== 'object')
57
+ return false;
58
+ const maybe = value;
59
+ return typeof maybe.pipe === 'function' || typeof maybe[Symbol.asyncIterator] === 'function';
60
+ }
61
+ function isBlobLike(value) {
62
+ if (!value || typeof value !== 'object')
63
+ return false;
64
+ const maybe = value;
65
+ return (typeof maybe.arrayBuffer === 'function' &&
66
+ typeof maybe.slice === 'function' &&
67
+ typeof maybe.size === 'number');
68
+ }
69
+ /** Normalize a TypedArray/view to a plain `ArrayBuffer` (not
70
+ * `ArrayBufferLike`, which would include `SharedArrayBuffer`). Keeps
71
+ * us compatible with the global `Blob` constructor's DOM types under
72
+ * TypeScript 5.7+, which tightened up `BlobPart`. */
73
+ function toFixedArrayBuffer(view) {
74
+ const out = new ArrayBuffer(view.byteLength);
75
+ new Uint8Array(out).set(new Uint8Array(view.buffer, view.byteOffset, view.byteLength));
76
+ return out;
77
+ }
78
+ //# sourceMappingURL=to-blob.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"to-blob.js","sourceRoot":"","sources":["../../src/audio/to-blob.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG1C,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAAiB,EAAE,QAAgB;IACxE,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;QACjC,OAAO,IAAI,IAAI,CAAC,CAAC,kBAAkB,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,IAAI,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAkB,EAAE,CAAC;QAChC,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAY,GAAG,CAAC;YAC3B,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;gBAChC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;YACxC,CAAC;iBAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACrC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAClE,CAAC;iBAAM,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;gBACxC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpB,CAAC;iBAAM,IAAI,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;gBACrC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;YACxC,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,UAAU,CAAC;oBACnB,IAAI,EAAE,uBAAuB;oBAC7B,IAAI,EAAE,qBAAqB;oBAC3B,OAAO,EAAE,gDAAgD,OAAO,KAAK,IAAI;oBACzE,MAAM,EAAE,GAAG;oBACX,SAAS,EAAE,SAAS;iBACrB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,MAAM,IAAI,UAAU,CAAC;QACnB,IAAI,EAAE,uBAAuB;QAC7B,IAAI,EAAE,qBAAqB;QAC3B,OAAO,EAAE,2CAA2C,OAAO,KAAK,sFAAsF,QAAQ,GAAG;QACjK,MAAM,EAAE,GAAG;QACX,SAAS,EAAE,SAAS;KACrB,CAAC,CAAC;AACL,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc;IACtC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,KAAK,GAAG,KAAiF,CAAC;IAChG,OAAO,OAAO,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,OAAO,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,UAAU,CAAC;AAC/F,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,KAAK,GAAG,KAMb,CAAC;IACF,OAAO,CACL,OAAO,KAAK,CAAC,WAAW,KAAK,UAAU;QACvC,OAAO,KAAK,CAAC,KAAK,KAAK,UAAU;QACjC,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAC/B,CAAC;AACJ,CAAC;AAED;;;sDAGsD;AACtD,SAAS,kBAAkB,CAAC,IAAqB;IAC/C,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC7C,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IACvF,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * `audio.transcriptions` — POST /v1/audio/transcriptions.
3
+ *
4
+ * The server accepts **multipart/form-data** with a `file` field plus
5
+ * form-scalar parameters. We accept a broad set of audio input types
6
+ * and normalize them to something `FormData` can hold (a `Blob`):
7
+ *
8
+ * - `Blob` / `File` — passed through.
9
+ * - `ArrayBuffer` / `ArrayBufferView` / `Uint8Array` / `Buffer` — wrapped
10
+ * in a `Blob` (which, on Node 18+, is provided by `buffer.Blob`).
11
+ * - `NodeJS.ReadableStream` — collected into a `Buffer` first (PRD
12
+ * §9: streaming STT upload is nice-to-have; sync API is buffered).
13
+ *
14
+ * The sync path (≤25 MiB AND ≤10 min) returns a typed `TranscriptionResult`
15
+ * variant keyed by `response_format`. The server may also return 202
16
+ * with an async acceptance body — we surface that as `kind: 'async_accepted'`.
17
+ */
18
+ import type { Transport } from '../transport.js';
19
+ import type { TranscriptionRequest, TranscriptionResult, TranscriptionStreamHandle, TranscriptionStreamOptions } from '../types.js';
20
+ export declare class TranscriptionsAPI {
21
+ private readonly transport;
22
+ constructor(transport: Transport);
23
+ create(request: TranscriptionRequest, opts?: {
24
+ idempotencyKey?: string;
25
+ signal?: AbortSignal;
26
+ }): Promise<TranscriptionResult>;
27
+ private buildUploadForm;
28
+ private buildUrlBody;
29
+ /** Realtime STT over a WebSocket (`/v1/audio/transcriptions/stream`).
30
+ * Returns a handle the caller writes audio chunks into and iterates
31
+ * for `partial` / `final` / `usage` events. See
32
+ * `TranscriptionStreamHandle` for lifecycle. */
33
+ stream(opts?: TranscriptionStreamOptions): TranscriptionStreamHandle;
34
+ }
35
+ //# sourceMappingURL=transcriptions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcriptions.d.ts","sourceRoot":"","sources":["../../src/audio/transcriptions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAIV,oBAAoB,EACpB,mBAAmB,EACnB,yBAAyB,EACzB,0BAA0B,EAC3B,MAAM,aAAa,CAAC;AAKrB,qBAAa,iBAAiB;IAChB,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,SAAS;IAE3C,MAAM,CACV,OAAO,EAAE,oBAAoB,EAC7B,IAAI,GAAE;QAAE,cAAc,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAO,GAC3D,OAAO,CAAC,mBAAmB,CAAC;YAkDjB,eAAe;IAgB7B,OAAO,CAAC,YAAY;IAepB;;;qDAGiD;IACjD,MAAM,CAAC,IAAI,GAAE,0BAA+B,GAAG,yBAAyB;CAGzE"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * `audio.transcriptions` — POST /v1/audio/transcriptions.
3
+ *
4
+ * The server accepts **multipart/form-data** with a `file` field plus
5
+ * form-scalar parameters. We accept a broad set of audio input types
6
+ * and normalize them to something `FormData` can hold (a `Blob`):
7
+ *
8
+ * - `Blob` / `File` — passed through.
9
+ * - `ArrayBuffer` / `ArrayBufferView` / `Uint8Array` / `Buffer` — wrapped
10
+ * in a `Blob` (which, on Node 18+, is provided by `buffer.Blob`).
11
+ * - `NodeJS.ReadableStream` — collected into a `Buffer` first (PRD
12
+ * §9: streaming STT upload is nice-to-have; sync API is buffered).
13
+ *
14
+ * The sync path (≤25 MiB AND ≤10 min) returns a typed `TranscriptionResult`
15
+ * variant keyed by `response_format`. The server may also return 202
16
+ * with an async acceptance body — we surface that as `kind: 'async_accepted'`.
17
+ */
18
+ import { DEFAULT_STT_MODEL } from '../types.js';
19
+ import { audioInputToBlob } from './to-blob.js';
20
+ import { openTranscriptionStream } from './stream.js';
21
+ export class TranscriptionsAPI {
22
+ transport;
23
+ constructor(transport) {
24
+ this.transport = transport;
25
+ }
26
+ async create(request, opts = {}) {
27
+ const responseFormat = request.response_format ?? 'json';
28
+ const acceptByFormat = {
29
+ json: 'application/json',
30
+ verbose_json: 'application/json',
31
+ text: 'text/plain, application/json;q=0.9',
32
+ srt: 'application/x-subrip, text/plain;q=0.9, application/json;q=0.8',
33
+ vtt: 'text/vtt, text/plain;q=0.9, application/json;q=0.8',
34
+ };
35
+ const accept = acceptByFormat[responseFormat] ?? 'application/json';
36
+ // URL source → JSON body; the server fetches the audio. Otherwise
37
+ // upload the bytes as multipart/form-data.
38
+ const usesUrl = 'url' in request && typeof request.url === 'string';
39
+ const res = await this.transport.request({
40
+ method: 'POST',
41
+ path: '/v1/audio/transcriptions',
42
+ accept,
43
+ headers: { accept },
44
+ ...(usesUrl
45
+ ? { json: this.buildUrlBody(request, responseFormat) }
46
+ : { formData: await this.buildUploadForm(request, responseFormat) }),
47
+ ...(opts.idempotencyKey !== undefined ? { idempotencyKey: opts.idempotencyKey } : {}),
48
+ ...(opts.signal !== undefined ? { signal: opts.signal } : {}),
49
+ });
50
+ if (res.status === 202) {
51
+ const data = (await res.json());
52
+ return { kind: 'async_accepted', data };
53
+ }
54
+ const contentType = (res.headers.get('content-type') ?? '').toLowerCase();
55
+ if (contentType.includes('application/json')) {
56
+ const data = (await res.json());
57
+ return { kind: 'sync_json', data };
58
+ }
59
+ const text = await res.text();
60
+ if (responseFormat === 'srt' || contentType.includes('subrip')) {
61
+ return { kind: 'sync_srt', text };
62
+ }
63
+ if (responseFormat === 'vtt' || contentType.includes('vtt')) {
64
+ return { kind: 'sync_vtt', text };
65
+ }
66
+ return { kind: 'sync_text', text };
67
+ }
68
+ async buildUploadForm(request, responseFormat) {
69
+ const filename = request.filename ?? 'audio.bin';
70
+ const blob = await audioInputToBlob(request.file, filename);
71
+ const form = new FormData();
72
+ form.append('file', blob, filename);
73
+ form.append('model', request.model ?? DEFAULT_STT_MODEL);
74
+ if (request.language !== undefined)
75
+ form.append('language', request.language);
76
+ form.append('response_format', responseFormat);
77
+ if (request.timestamps !== undefined)
78
+ form.append('timestamps', request.timestamps);
79
+ if (request.diarize !== undefined)
80
+ form.append('diarize', String(request.diarize));
81
+ return form;
82
+ }
83
+ buildUrlBody(request, responseFormat) {
84
+ const body = {
85
+ url: request.url,
86
+ model: request.model ?? DEFAULT_STT_MODEL,
87
+ response_format: responseFormat,
88
+ };
89
+ if (request.language !== undefined)
90
+ body.language = request.language;
91
+ if (request.timestamps !== undefined)
92
+ body.timestamps = request.timestamps;
93
+ if (request.diarize !== undefined)
94
+ body.diarize = request.diarize;
95
+ return body;
96
+ }
97
+ /** Realtime STT over a WebSocket (`/v1/audio/transcriptions/stream`).
98
+ * Returns a handle the caller writes audio chunks into and iterates
99
+ * for `partial` / `final` / `usage` events. See
100
+ * `TranscriptionStreamHandle` for lifecycle. */
101
+ stream(opts = {}) {
102
+ return openTranscriptionStream(this.transport, opts);
103
+ }
104
+ }
105
+ //# sourceMappingURL=transcriptions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcriptions.js","sourceRoot":"","sources":["../../src/audio/transcriptions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAYH,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAEtD,MAAM,OAAO,iBAAiB;IACC;IAA7B,YAA6B,SAAoB;QAApB,cAAS,GAAT,SAAS,CAAW;IAAG,CAAC;IAErD,KAAK,CAAC,MAAM,CACV,OAA6B,EAC7B,OAA0D,EAAE;QAE5D,MAAM,cAAc,GAAG,OAAO,CAAC,eAAe,IAAI,MAAM,CAAC;QACzD,MAAM,cAAc,GAA2B;YAC7C,IAAI,EAAE,kBAAkB;YACxB,YAAY,EAAE,kBAAkB;YAChC,IAAI,EAAE,oCAAoC;YAC1C,GAAG,EAAE,gEAAgE;YACrE,GAAG,EAAE,oDAAoD;SAC1D,CAAC;QACF,MAAM,MAAM,GAAG,cAAc,CAAC,cAAc,CAAC,IAAI,kBAAkB,CAAC;QAEpE,kEAAkE;QAClE,2CAA2C;QAC3C,MAAM,OAAO,GAAG,KAAK,IAAI,OAAO,IAAI,OAAO,OAAO,CAAC,GAAG,KAAK,QAAQ,CAAC;QAEpE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;YACvC,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,0BAA0B;YAChC,MAAM;YACN,OAAO,EAAE,EAAE,MAAM,EAAE;YACnB,GAAG,CAAC,OAAO;gBACT,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE;gBACtD,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE,CAAC;YACtE,GAAG,CAAC,IAAI,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrF,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC9D,CAAC,CAAC;QAEH,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvB,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA+B,CAAC;YAC9D,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC;QAC1C,CAAC;QAED,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAE1E,IAAI,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAC7C,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA8B,CAAC;YAC7D,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;QACrC,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,cAAc,KAAK,KAAK,IAAI,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC/D,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QACpC,CAAC;QACD,IAAI,cAAc,KAAK,KAAK,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5D,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QACpC,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IACrC,CAAC;IAEO,KAAK,CAAC,eAAe,CAC3B,OAA6B,EAC7B,cAAsB;QAEtB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,WAAW,CAAC;QACjD,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAE,OAAgC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACtF,MAAM,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC5B,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QACpC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,IAAI,iBAAiB,CAAC,CAAC;QACzD,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS;YAAE,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC9E,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,cAAc,CAAC,CAAC;QAC/C,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS;YAAE,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;QACpF,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS;YAAE,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;QACnF,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,YAAY,CAClB,OAA6B,EAC7B,cAAsB;QAEtB,MAAM,IAAI,GAA4B;YACpC,GAAG,EAAG,OAA2B,CAAC,GAAG;YACrC,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,iBAAiB;YACzC,eAAe,EAAE,cAAc;SAChC,CAAC;QACF,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS;YAAE,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACrE,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS;YAAE,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QAC3E,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS;YAAE,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAClE,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;qDAGiD;IACjD,MAAM,CAAC,OAAmC,EAAE;QAC1C,OAAO,uBAAuB,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACvD,CAAC;CACF"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Realtime translate over WebSocket (`WSS /v1/audio/translate/stream`).
3
+ *
4
+ * The SDK chains caller-supplied source audio (`sendAudio()` → base64
5
+ * `input_audio_buffer.append`) into the proxy and translates server
6
+ * frames into friendly `TranslateStreamEvent`s — STT partials + finals,
7
+ * LLM partials + finals, TTS started + binary audio + done, and a
8
+ * cross-modality `session.usage` rollup.
9
+ *
10
+ * Same dependency posture as the STT/TTS helpers: prefer
11
+ * `globalThis.WebSocket` when present (Node 22+, Bun, Deno, browsers).
12
+ * On Node 18/20 the global isn't there — we dynamically import `ws`
13
+ * at runtime and surface a helpful error if it's missing.
14
+ *
15
+ * The handle is lazy: the socket opens on the first `sendAudio` /
16
+ * iteration / `close`. This keeps the hot path fast and avoids
17
+ * dangling connections when a caller constructs a handle but bails
18
+ * before using it.
19
+ */
20
+ import type { Transport } from '../transport.js';
21
+ import type { TranslateStreamEvent, TranslateStreamHandle, TranslateStreamOptions } from '../types.js';
22
+ export declare function openTranslateStream(transport: Transport, opts?: TranslateStreamOptions): TranslateStreamHandle;
23
+ export declare function translateFrame(frame: unknown): TranslateStreamEvent | null;
24
+ export declare function buildSessionUpdate(session: Partial<TranslateStreamOptions>): {
25
+ type: 'session.update';
26
+ session: Record<string, unknown>;
27
+ } | null;
28
+ declare function buildWsUrl(baseURL: string): string;
29
+ declare function estimateAudioMs(byteLength: number, sampleRate: number, format: 'pcm16' | 'opus' | 'mulaw'): number | undefined;
30
+ export declare const __internals: {
31
+ translateFrame: typeof translateFrame;
32
+ buildSessionUpdate: typeof buildSessionUpdate;
33
+ buildWsUrl: typeof buildWsUrl;
34
+ estimateAudioMs: typeof estimateAudioMs;
35
+ };
36
+ export {};
37
+ //# sourceMappingURL=translate-stream-ws.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"translate-stream-ws.d.ts","sourceRoot":"","sources":["../../src/audio/translate-stream-ws.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EACV,oBAAoB,EACpB,qBAAqB,EACrB,sBAAsB,EAEvB,MAAM,aAAa,CAAC;AAcrB,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,SAAS,EACpB,IAAI,GAAE,sBAA2B,GAChC,qBAAqB,CA6TvB;AA8FD,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,oBAAoB,GAAG,IAAI,CAoJ1E;AAED,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,OAAO,CAAC,sBAAsB,CAAC,GACvC;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAAG,IAAI,CAgBrE;AAED,iBAAS,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAK3C;AAED,iBAAS,eAAe,CACtB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,GACjC,MAAM,GAAG,SAAS,CAOpB;AA4FD,eAAO,MAAM,WAAW;;;;;CAAsE,CAAC"}