@voxd/client 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client.d.ts +49 -16
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +107 -18
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +54 -2
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/client.d.ts
CHANGED
|
@@ -1,24 +1,39 @@
|
|
|
1
|
-
import type { VoxHealth, VoxCapabilities, CreateJobOptions, JobAccepted, JobStatus, AlignmentResult, CompanionState, VoxDClientOptions } from "./types.js";
|
|
1
|
+
import type { VoxHealth, VoxCapabilities, CreateJobOptions, JobAccepted, JobStatus, AlignmentResult, TranscribeOptions, TranscriptionResult, CompanionState, VoxDClientOptions } from "./types.js";
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* Create a VoxD client instance.
|
|
4
4
|
*
|
|
5
5
|
* @example
|
|
6
6
|
* ```ts
|
|
7
|
-
* import {
|
|
7
|
+
* import { createVoxdClient } from "@voxd/client";
|
|
8
8
|
*
|
|
9
|
-
* const
|
|
9
|
+
* const client = createVoxdClient();
|
|
10
10
|
*
|
|
11
|
-
* if (await
|
|
12
|
-
* const
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
11
|
+
* if (await client.probe()) {
|
|
12
|
+
* const result = await client.transcribe({
|
|
13
|
+
* audio: audioBlob,
|
|
14
|
+
* language: "en",
|
|
15
|
+
* timestamps: true,
|
|
16
|
+
* });
|
|
17
|
+
* console.log(result.text);
|
|
18
|
+
* console.log(result.words);
|
|
19
19
|
* }
|
|
20
20
|
* ```
|
|
21
21
|
*/
|
|
22
|
+
export declare function createVoxdClient(options?: VoxDClientOptions): VoxDClient;
|
|
23
|
+
/**
|
|
24
|
+
* Browser client for the Vox Companion local transcription runtime.
|
|
25
|
+
*
|
|
26
|
+
* Supports:
|
|
27
|
+
* - Sending recorded audio (Blob/File/ArrayBuffer) for transcription
|
|
28
|
+
* - Getting word-level timestamps for alignment
|
|
29
|
+
* - Checking companion capabilities
|
|
30
|
+
* - Probing companion availability
|
|
31
|
+
*
|
|
32
|
+
* Does NOT handle:
|
|
33
|
+
* - Microphone selection or browser permissions
|
|
34
|
+
* - MediaDevices API or getUserMedia
|
|
35
|
+
* - Raw audio capture
|
|
36
|
+
*/
|
|
22
37
|
export declare class VoxDClient {
|
|
23
38
|
private readonly base;
|
|
24
39
|
private readonly probeTimeout;
|
|
@@ -38,6 +53,25 @@ export declare class VoxDClient {
|
|
|
38
53
|
health(): Promise<VoxHealth>;
|
|
39
54
|
/** Fetch capabilities — features, backends, models. */
|
|
40
55
|
capabilities(): Promise<VoxCapabilities>;
|
|
56
|
+
/**
|
|
57
|
+
* Transcribe audio from a Blob, File, or ArrayBuffer.
|
|
58
|
+
*
|
|
59
|
+
* This uploads the audio to the local companion and returns
|
|
60
|
+
* the transcription result. Optionally includes word-level
|
|
61
|
+
* timestamps for playback alignment.
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* ```ts
|
|
65
|
+
* const result = await client.transcribe({
|
|
66
|
+
* audio: blob,
|
|
67
|
+
* language: "en",
|
|
68
|
+
* timestamps: true,
|
|
69
|
+
* });
|
|
70
|
+
* console.log(result.text);
|
|
71
|
+
* console.log(result.words); // word-level timestamps
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
transcribe(options: TranscribeOptions): Promise<TranscriptionResult>;
|
|
41
75
|
/**
|
|
42
76
|
* Create a job on the companion.
|
|
43
77
|
* Returns the accepted job with its ID.
|
|
@@ -46,11 +80,10 @@ export declare class VoxDClient {
|
|
|
46
80
|
/** Poll a job's status by ID. */
|
|
47
81
|
getJob(jobId: string): Promise<JobStatus>;
|
|
48
82
|
/**
|
|
49
|
-
* Submit an alignment job and wait for the result.
|
|
50
|
-
* This is the high-level convenience method most apps should use.
|
|
83
|
+
* Submit an alignment job (via audio URL) and wait for the result.
|
|
51
84
|
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
85
|
+
* Use `transcribe()` instead if you have the audio data locally.
|
|
86
|
+
* This method is for when the companion should fetch audio from a URL.
|
|
54
87
|
*/
|
|
55
88
|
align(options: Omit<CreateJobOptions, "type">): Promise<AlignmentResult>;
|
|
56
89
|
/**
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,eAAe,EACf,gBAAgB,EAChB,WAAW,EACX,SAAS,EACT,eAAe,EACf,cAAc,EACd,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAMpB;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,MAAM,CAA6B;gBAE/B,OAAO,CAAC,EAAE,iBAAiB;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,eAAe,EACf,gBAAgB,EAChB,WAAW,EACX,SAAS,EACT,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAMpB;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,UAAU,CAExE;AAED;;;;;;;;;;;;;GAaG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,MAAM,CAA6B;gBAE/B,OAAO,CAAC,EAAE,iBAAiB;IAWvC,gCAAgC;IAChC,IAAI,KAAK,IAAI,cAAc,CAE1B;IAED,yDAAyD;IACzD,IAAI,WAAW,IAAI,OAAO,CAEzB;IAID;;;OAGG;IACG,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC;IAa/B,mEAAmE;IAC7D,MAAM,IAAI,OAAO,CAAC,SAAS,CAAC;IAKlC,uDAAuD;IACjD,YAAY,IAAI,OAAO,CAAC,eAAe,CAAC;IAO9C;;;;;;;;;;;;;;;;;OAiBG;IACG,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA+B1E;;;OAGG;IACG,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,WAAW,CAAC;IAShE,iCAAiC;IAC3B,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAK/C;;;;;OAKG;IACG,KAAK,CACT,OAAO,EAAE,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC,GACtC,OAAO,CAAC,eAAe,CAAC;IAO3B;;;OAGG;IACH,MAAM,IAAI,IAAI;IAId,0CAA0C;IAC1C,YAAY,IAAI,IAAI;YAMN,UAAU;YAyBV,KAAK;CAoCpB;AAED,uCAAuC;AACvC,qBAAa,SAAU,SAAQ,KAAK;aAGhB,IAAI,EAChB,eAAe,GACf,YAAY,GACZ,YAAY,GACZ,WAAW,GACX,SAAS;gBANb,OAAO,EAAE,MAAM,EACC,IAAI,EAChB,eAAe,GACf,YAAY,GACZ,YAAY,GACZ,WAAW,GACX,SAAS;CAKhB"}
|
package/dist/client.js
CHANGED
|
@@ -2,33 +2,55 @@ const DEFAULT_PORT = 43115;
|
|
|
2
2
|
const DEFAULT_PROBE_TIMEOUT = 2000;
|
|
3
3
|
const DEFAULT_POLL_INTERVAL = 500;
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
5
|
+
* Create a VoxD client instance.
|
|
6
6
|
*
|
|
7
7
|
* @example
|
|
8
8
|
* ```ts
|
|
9
|
-
* import {
|
|
9
|
+
* import { createVoxdClient } from "@voxd/client";
|
|
10
10
|
*
|
|
11
|
-
* const
|
|
11
|
+
* const client = createVoxdClient();
|
|
12
12
|
*
|
|
13
|
-
* if (await
|
|
14
|
-
* const
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
13
|
+
* if (await client.probe()) {
|
|
14
|
+
* const result = await client.transcribe({
|
|
15
|
+
* audio: audioBlob,
|
|
16
|
+
* language: "en",
|
|
17
|
+
* timestamps: true,
|
|
18
|
+
* });
|
|
19
|
+
* console.log(result.text);
|
|
20
|
+
* console.log(result.words);
|
|
21
21
|
* }
|
|
22
22
|
* ```
|
|
23
23
|
*/
|
|
24
|
+
export function createVoxdClient(options) {
|
|
25
|
+
return new VoxDClient(options);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Browser client for the Vox Companion local transcription runtime.
|
|
29
|
+
*
|
|
30
|
+
* Supports:
|
|
31
|
+
* - Sending recorded audio (Blob/File/ArrayBuffer) for transcription
|
|
32
|
+
* - Getting word-level timestamps for alignment
|
|
33
|
+
* - Checking companion capabilities
|
|
34
|
+
* - Probing companion availability
|
|
35
|
+
*
|
|
36
|
+
* Does NOT handle:
|
|
37
|
+
* - Microphone selection or browser permissions
|
|
38
|
+
* - MediaDevices API or getUserMedia
|
|
39
|
+
* - Raw audio capture
|
|
40
|
+
*/
|
|
24
41
|
export class VoxDClient {
|
|
25
42
|
base;
|
|
26
43
|
probeTimeout;
|
|
27
44
|
pollInterval;
|
|
28
45
|
_state = "unknown";
|
|
29
46
|
constructor(options) {
|
|
30
|
-
|
|
31
|
-
|
|
47
|
+
if (options?.baseUrl) {
|
|
48
|
+
this.base = options.baseUrl.replace(/\/$/, "");
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
const port = options?.port ?? DEFAULT_PORT;
|
|
52
|
+
this.base = `http://127.0.0.1:${port}`;
|
|
53
|
+
}
|
|
32
54
|
this.probeTimeout = options?.probeTimeout ?? DEFAULT_PROBE_TIMEOUT;
|
|
33
55
|
this.pollInterval = options?.pollInterval ?? DEFAULT_POLL_INTERVAL;
|
|
34
56
|
}
|
|
@@ -68,7 +90,54 @@ export class VoxDClient {
|
|
|
68
90
|
const res = await this.fetch("/capabilities");
|
|
69
91
|
return res.json();
|
|
70
92
|
}
|
|
71
|
-
// ──
|
|
93
|
+
// ── Transcription ──────────────────────────────────────
|
|
94
|
+
/**
|
|
95
|
+
* Transcribe audio from a Blob, File, or ArrayBuffer.
|
|
96
|
+
*
|
|
97
|
+
* This uploads the audio to the local companion and returns
|
|
98
|
+
* the transcription result. Optionally includes word-level
|
|
99
|
+
* timestamps for playback alignment.
|
|
100
|
+
*
|
|
101
|
+
* @example
|
|
102
|
+
* ```ts
|
|
103
|
+
* const result = await client.transcribe({
|
|
104
|
+
* audio: blob,
|
|
105
|
+
* language: "en",
|
|
106
|
+
* timestamps: true,
|
|
107
|
+
* });
|
|
108
|
+
* console.log(result.text);
|
|
109
|
+
* console.log(result.words); // word-level timestamps
|
|
110
|
+
* ```
|
|
111
|
+
*/
|
|
112
|
+
async transcribe(options) {
|
|
113
|
+
const { audio, format, language, timestamps, metadata } = options;
|
|
114
|
+
// Build multipart form
|
|
115
|
+
const form = new FormData();
|
|
116
|
+
if (audio instanceof Blob) {
|
|
117
|
+
const ext = format ?? inferFormat(audio.type) ?? "wav";
|
|
118
|
+
form.append("audio", audio, `audio.${ext}`);
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
// ArrayBuffer — wrap in Blob
|
|
122
|
+
const ext = format ?? "wav";
|
|
123
|
+
const blob = new Blob([audio], { type: mimeForFormat(ext) });
|
|
124
|
+
form.append("audio", blob, `audio.${ext}`);
|
|
125
|
+
}
|
|
126
|
+
if (format)
|
|
127
|
+
form.append("format", format);
|
|
128
|
+
if (language)
|
|
129
|
+
form.append("language", language);
|
|
130
|
+
if (timestamps)
|
|
131
|
+
form.append("timestamps", "true");
|
|
132
|
+
if (metadata)
|
|
133
|
+
form.append("metadata", JSON.stringify(metadata));
|
|
134
|
+
const res = await this.fetch("/transcribe", {
|
|
135
|
+
method: "POST",
|
|
136
|
+
body: form,
|
|
137
|
+
});
|
|
138
|
+
return res.json();
|
|
139
|
+
}
|
|
140
|
+
// ── Alignment (URL-based) ──────────────────────────────
|
|
72
141
|
/**
|
|
73
142
|
* Create a job on the companion.
|
|
74
143
|
* Returns the accepted job with its ID.
|
|
@@ -87,11 +156,10 @@ export class VoxDClient {
|
|
|
87
156
|
return res.json();
|
|
88
157
|
}
|
|
89
158
|
/**
|
|
90
|
-
* Submit an alignment job and wait for the result.
|
|
91
|
-
* This is the high-level convenience method most apps should use.
|
|
159
|
+
* Submit an alignment job (via audio URL) and wait for the result.
|
|
92
160
|
*
|
|
93
|
-
*
|
|
94
|
-
*
|
|
161
|
+
* Use `transcribe()` instead if you have the audio data locally.
|
|
162
|
+
* This method is for when the companion should fetch audio from a URL.
|
|
95
163
|
*/
|
|
96
164
|
async align(options) {
|
|
97
165
|
const { jobId } = await this.createJob({ ...options, type: "alignment" });
|
|
@@ -167,4 +235,25 @@ export class VoxDError extends Error {
|
|
|
167
235
|
function sleep(ms) {
|
|
168
236
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
169
237
|
}
|
|
238
|
+
function inferFormat(mimeType) {
|
|
239
|
+
if (mimeType.includes("mp3") || mimeType.includes("mpeg"))
|
|
240
|
+
return "mp3";
|
|
241
|
+
if (mimeType.includes("wav"))
|
|
242
|
+
return "wav";
|
|
243
|
+
if (mimeType.includes("aac") || mimeType.includes("mp4"))
|
|
244
|
+
return "aac";
|
|
245
|
+
if (mimeType.includes("opus") || mimeType.includes("ogg"))
|
|
246
|
+
return "opus";
|
|
247
|
+
return undefined;
|
|
248
|
+
}
|
|
249
|
+
function mimeForFormat(format) {
|
|
250
|
+
switch (format) {
|
|
251
|
+
case "mp3": return "audio/mpeg";
|
|
252
|
+
case "wav": return "audio/wav";
|
|
253
|
+
case "aac": return "audio/aac";
|
|
254
|
+
case "opus": return "audio/ogg; codecs=opus";
|
|
255
|
+
case "pcm16": return "audio/pcm";
|
|
256
|
+
default: return "application/octet-stream";
|
|
257
|
+
}
|
|
258
|
+
}
|
|
170
259
|
//# sourceMappingURL=client.js.map
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { VoxDClient, VoxDError } from "./client.js";
|
|
2
|
-
export type { VoxHealth, VoxCapabilities, CreateJobOptions, JobAccepted, JobStatus, JobSource, JobMetadata, JobStage, AlignedWord, AlignmentResult, CompanionState, VoxDClientOptions, } from "./types.js";
|
|
1
|
+
export { VoxDClient, VoxDError, createVoxdClient } from "./client.js";
|
|
2
|
+
export type { VoxHealth, VoxCapabilities, CreateJobOptions, JobAccepted, JobStatus, JobSource, JobMetadata, JobStage, AlignedWord, AlignmentResult, CompanionState, VoxDClientOptions, TranscribeOptions, TranscriptionResult, RealtimeOptions, RealtimeSession, } from "./types.js";
|
|
3
3
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACtE,YAAY,EACV,SAAS,EACT,eAAe,EACf,gBAAgB,EAChB,WAAW,EACX,SAAS,EACT,SAAS,EACT,WAAW,EACX,QAAQ,EACR,WAAW,EACX,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACf,eAAe,GAChB,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { VoxDClient, VoxDError } from "./client.js";
|
|
1
|
+
export { VoxDClient, VoxDError, createVoxdClient } from "./client.js";
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -13,6 +13,7 @@ export interface VoxCapabilities {
|
|
|
13
13
|
alignment?: boolean;
|
|
14
14
|
local_asr?: boolean;
|
|
15
15
|
streaming_progress?: boolean;
|
|
16
|
+
realtime?: boolean;
|
|
16
17
|
};
|
|
17
18
|
backends: {
|
|
18
19
|
parakeet?: boolean;
|
|
@@ -36,7 +37,7 @@ export interface JobMetadata {
|
|
|
36
37
|
}
|
|
37
38
|
/** Options for creating an alignment job. */
|
|
38
39
|
export interface CreateJobOptions {
|
|
39
|
-
type: "alignment";
|
|
40
|
+
type: "alignment" | "transcription";
|
|
40
41
|
sessionId?: string;
|
|
41
42
|
source: JobSource;
|
|
42
43
|
metadata?: JobMetadata;
|
|
@@ -67,6 +68,7 @@ export interface JobStatus {
|
|
|
67
68
|
status: JobStage;
|
|
68
69
|
result?: {
|
|
69
70
|
alignment?: AlignmentResult;
|
|
71
|
+
transcription?: TranscriptionResult;
|
|
70
72
|
};
|
|
71
73
|
error?: string;
|
|
72
74
|
}
|
|
@@ -74,11 +76,61 @@ export interface JobStatus {
|
|
|
74
76
|
export type CompanionState = "unknown" | "probing" | "connected" | "unavailable";
|
|
75
77
|
/** Options for the VoxD client. */
|
|
76
78
|
export interface VoxDClientOptions {
|
|
77
|
-
/**
|
|
79
|
+
/** Base URL for the companion bridge. Default: http://127.0.0.1:43115 */
|
|
80
|
+
baseUrl?: string;
|
|
81
|
+
/** Companion bridge port. Ignored if baseUrl is set. Default: 43115 */
|
|
78
82
|
port?: number;
|
|
79
83
|
/** Probe timeout in ms. Default: 2000 */
|
|
80
84
|
probeTimeout?: number;
|
|
81
85
|
/** Polling interval in ms when waiting for a job. Default: 500 */
|
|
82
86
|
pollInterval?: number;
|
|
83
87
|
}
|
|
88
|
+
/** Options for transcribe(). */
|
|
89
|
+
export interface TranscribeOptions {
|
|
90
|
+
/** Audio data — a Blob, File, or ArrayBuffer. */
|
|
91
|
+
audio: Blob | File | ArrayBuffer;
|
|
92
|
+
/** Audio format hint. Default: inferred from Blob type or "wav". */
|
|
93
|
+
format?: "mp3" | "wav" | "aac" | "opus" | "pcm16";
|
|
94
|
+
/** Language code. Default: "en" */
|
|
95
|
+
language?: string;
|
|
96
|
+
/** Request word-level timestamps. Default: false */
|
|
97
|
+
timestamps?: boolean;
|
|
98
|
+
/** Optional metadata for the job. */
|
|
99
|
+
metadata?: JobMetadata;
|
|
100
|
+
}
|
|
101
|
+
/** Transcription result. */
|
|
102
|
+
export interface TranscriptionResult {
|
|
103
|
+
text: string;
|
|
104
|
+
durationMs: number;
|
|
105
|
+
words?: AlignedWord[];
|
|
106
|
+
metrics?: {
|
|
107
|
+
inferenceMs: number;
|
|
108
|
+
totalMs: number;
|
|
109
|
+
realtimeFactor: number;
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
/** Options for starting a realtime transcription stream. */
|
|
113
|
+
export interface RealtimeOptions {
|
|
114
|
+
/** Audio format. Default: "pcm16" */
|
|
115
|
+
format?: "pcm16" | "wav";
|
|
116
|
+
/** Sample rate in Hz. Default: 16000 */
|
|
117
|
+
sampleRate?: number;
|
|
118
|
+
/** Language code. Default: "en" */
|
|
119
|
+
language?: string;
|
|
120
|
+
}
|
|
121
|
+
/** Events emitted by a realtime transcription session. */
|
|
122
|
+
export interface RealtimeSession {
|
|
123
|
+
/** Send an audio chunk to the runtime. */
|
|
124
|
+
send(chunk: ArrayBuffer): void;
|
|
125
|
+
/** Signal end of audio input. */
|
|
126
|
+
stop(): void;
|
|
127
|
+
/** Register a callback for partial transcriptions. */
|
|
128
|
+
onPartial(cb: (text: string) => void): void;
|
|
129
|
+
/** Register a callback for the final transcription. */
|
|
130
|
+
onFinal(cb: (result: TranscriptionResult) => void): void;
|
|
131
|
+
/** Register a callback for errors. */
|
|
132
|
+
onError(cb: (error: Error) => void): void;
|
|
133
|
+
/** Close the session. */
|
|
134
|
+
close(): void;
|
|
135
|
+
}
|
|
84
136
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,mCAAmC;AACnC,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE;QACR,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,kBAAkB,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|