@happyvertical/speech 0.97.0 → 0.99.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 (77) hide show
  1. package/AGENT.md +31 -3
  2. package/README.md +310 -2
  3. package/dist/__tests__/fake-websocket.d.ts +38 -0
  4. package/dist/__tests__/fake-websocket.d.ts.map +1 -0
  5. package/dist/adapters/local/abort.d.ts +6 -0
  6. package/dist/adapters/local/abort.d.ts.map +1 -0
  7. package/dist/adapters/local/audio.d.ts +45 -0
  8. package/dist/adapters/local/audio.d.ts.map +1 -0
  9. package/dist/adapters/local/env.d.ts +15 -0
  10. package/dist/adapters/local/env.d.ts.map +1 -0
  11. package/dist/adapters/local/runtime.d.ts +58 -0
  12. package/dist/adapters/local/runtime.d.ts.map +1 -0
  13. package/dist/adapters/local/transcriber.d.ts +40 -0
  14. package/dist/adapters/local/transcriber.d.ts.map +1 -0
  15. package/dist/adapters/local/transformers-shim.d.ts +8 -0
  16. package/dist/adapters/local/transformers-shim.d.ts.map +1 -0
  17. package/dist/adapters/local/types.d.ts +92 -0
  18. package/dist/adapters/local/types.d.ts.map +1 -0
  19. package/dist/adapters/local/worker.d.ts +118 -0
  20. package/dist/adapters/local/worker.d.ts.map +1 -0
  21. package/dist/adapters/openai-compatible.d.ts +2 -1
  22. package/dist/adapters/openai-compatible.d.ts.map +1 -1
  23. package/dist/adapters/openai-realtime.d.ts +48 -0
  24. package/dist/adapters/openai-realtime.d.ts.map +1 -0
  25. package/dist/adapters/voxtral-realtime.d.ts +44 -0
  26. package/dist/adapters/voxtral-realtime.d.ts.map +1 -0
  27. package/dist/chunks/errors-CQBX3OPS.js +41 -0
  28. package/dist/chunks/errors-CQBX3OPS.js.map +1 -0
  29. package/dist/chunks/registry-C_5BakmM.js +306 -0
  30. package/dist/chunks/registry-C_5BakmM.js.map +1 -0
  31. package/dist/chunks/websocket-CR9uXAuS.js +44 -0
  32. package/dist/chunks/websocket-CR9uXAuS.js.map +1 -0
  33. package/dist/conversation/openai-webrtc.d.ts +4 -0
  34. package/dist/conversation/openai-webrtc.d.ts.map +1 -0
  35. package/dist/conversation/types.d.ts +60 -0
  36. package/dist/conversation/types.d.ts.map +1 -0
  37. package/dist/conversation-server.d.ts +40 -0
  38. package/dist/conversation-server.d.ts.map +1 -0
  39. package/dist/conversation-server.js +174 -0
  40. package/dist/conversation-server.js.map +1 -0
  41. package/dist/conversation.d.ts +4 -0
  42. package/dist/conversation.d.ts.map +1 -0
  43. package/dist/conversation.js +346 -0
  44. package/dist/conversation.js.map +1 -0
  45. package/dist/index.d.ts +9 -0
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +1824 -326
  48. package/dist/index.js.map +1 -1
  49. package/dist/local.d.ts +21 -0
  50. package/dist/local.d.ts.map +1 -0
  51. package/dist/local.js +964 -0
  52. package/dist/local.js.map +1 -0
  53. package/dist/shared/env.d.ts +5 -0
  54. package/dist/shared/env.d.ts.map +1 -1
  55. package/dist/shared/factory.d.ts.map +1 -1
  56. package/dist/shared/pcm.d.ts +21 -0
  57. package/dist/shared/pcm.d.ts.map +1 -0
  58. package/dist/shared/realtime-auth.d.ts +34 -0
  59. package/dist/shared/realtime-auth.d.ts.map +1 -0
  60. package/dist/shared/realtime-session.d.ts +240 -0
  61. package/dist/shared/realtime-session.d.ts.map +1 -0
  62. package/dist/shared/registry.d.ts +9 -0
  63. package/dist/shared/registry.d.ts.map +1 -0
  64. package/dist/shared/streaming-client-secret.d.ts +90 -0
  65. package/dist/shared/streaming-client-secret.d.ts.map +1 -0
  66. package/dist/shared/streaming-factory.d.ts +65 -0
  67. package/dist/shared/streaming-factory.d.ts.map +1 -0
  68. package/dist/shared/streaming-types.d.ts +303 -0
  69. package/dist/shared/streaming-types.d.ts.map +1 -0
  70. package/dist/shared/turn-limit.d.ts +84 -0
  71. package/dist/shared/turn-limit.d.ts.map +1 -0
  72. package/dist/shared/types.d.ts +24 -6
  73. package/dist/shared/types.d.ts.map +1 -1
  74. package/dist/shared/websocket.d.ts +56 -0
  75. package/dist/shared/websocket.d.ts.map +1 -0
  76. package/metadata.json +9 -2
  77. package/package.json +27 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming-client-secret.d.ts","sourceRoot":"","sources":["../../src/shared/streaming-client-secret.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAQH,OAAO,EAML,KAAK,SAAS,EACf,MAAM,UAAU,CAAC;AAiBlB,OAAO,KAAK,EACV,gCAAgC,EAChC,oBAAoB,EACpB,wBAAwB,EACxB,sBAAsB,EACvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,+EAA+E;AAC/E,eAAO,MAAM,iCAAiC,KAAK,CAAC;AACpD,uDAAuD;AACvD,eAAO,MAAM,uBAAuB;;;CAAkC,CAAC;AAEvE,MAAM,WAAW,kCAAkC;IACjD,uFAAuF;IACvF,IAAI,CAAC,EAAE,wBAAwB,CAAC;IAChC,sEAAsE;IACtE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,mHAAmH;IACnH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yEAAyE;IACzE,aAAa,CAAC,EAAE,sBAAsB,CAAC;IACvC,iCAAiC;IACjC,MAAM,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACvC,cAAc,CAAC,EAAE,gCAAgC,CAAC,gBAAgB,CAAC,CAAC;IACpE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB;;;OAGG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/C;;;;OAIG;IACH,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,iFAAiF;IACjF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,0EAA0E;AAC1E,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,wBAAwB,CAAC;IAC/B,wEAAwE;IACxE,KAAK,EAAE,MAAM,CAAC;IACd,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,4BAA4B;IAC3C,GAAG,CAAC,EAAE,SAAS,CAAC;CACjB;AAID;;;;GAIG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,GAAE,kCAAuC,EAChD,OAAO,GAAE,4BAAiC,GACzC,OAAO,CAAC,2BAA2B,CAAC,CAuHtC;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAc9D"}
@@ -0,0 +1,65 @@
1
+ import { SpeechEnv } from './env.js';
2
+ import { GetStreamingTranscriberOptions, StreamingTranscriber, StreamingTranscriberType, StreamingTurnDetection } from './streaming-types.js';
3
+ import { Transcriber } from './types.js';
4
+ /** Streaming adapters `getStreamingTranscriber()` can build. */
5
+ export declare const STREAMING_TRANSCRIBER_TYPES: readonly StreamingTranscriberType[];
6
+ /** Environment variable names read for each streaming setting, in priority order. */
7
+ export declare const STREAMING_TRANSCRIBER_ENV_KEYS: {
8
+ readonly type: readonly ["HAVE_SPEECH_STREAMING_TYPE"];
9
+ readonly baseUrl: readonly ["HAVE_SPEECH_STREAMING_BASE_URL"];
10
+ readonly model: readonly ["HAVE_SPEECH_STREAMING_MODEL"];
11
+ readonly apiKey: readonly ["HAVE_SPEECH_STREAMING_API_KEY"];
12
+ readonly language: readonly ["HAVE_SPEECH_STREAMING_LANGUAGE"];
13
+ readonly turnDetection: readonly ["HAVE_SPEECH_STREAMING_TURN_DETECTION"];
14
+ readonly timeoutMs: readonly ["HAVE_SPEECH_STREAMING_TIMEOUT", "HAVE_SPEECH_STREAMING_TIMEOUT_MS"];
15
+ readonly connectTimeoutMs: readonly ["HAVE_SPEECH_STREAMING_CONNECT_TIMEOUT_MS"];
16
+ readonly headers: readonly ["HAVE_SPEECH_STREAMING_HEADERS"];
17
+ readonly maxTurnSeconds: readonly ["HAVE_SPEECH_STREAMING_MAX_TURN_SECONDS"];
18
+ };
19
+ export interface StreamingFactoryContext {
20
+ env?: SpeechEnv;
21
+ /** Headers merged under explicit `headers` (env → context → options). */
22
+ headers?: HeadersInit;
23
+ }
24
+ export declare function isStreamingTranscriberType(type: string | undefined): type is StreamingTranscriberType;
25
+ /**
26
+ * Creates a realtime streaming transcriber. Explicit options win over
27
+ * `HAVE_SPEECH_STREAMING_*` environment variables. The type defaults to
28
+ * `openai-realtime`.
29
+ */
30
+ export declare function getStreamingTranscriber(options?: GetStreamingTranscriberOptions, context?: StreamingFactoryContext): StreamingTranscriber;
31
+ export declare function parseTurnDetection(value: string | undefined): StreamingTurnDetection | undefined;
32
+ /**
33
+ * Parses `HAVE_SPEECH_STREAMING_MAX_TURN_SECONDS`: a positive number of
34
+ * seconds, or `Infinity` for no limit.
35
+ */
36
+ export declare function parseMaxTurnSeconds(value: string | undefined): number | undefined;
37
+ export interface StreamingTranscriberWrapperOptions {
38
+ /** Bytes per `write()`. Default 64 KiB. */
39
+ chunkBytes?: number;
40
+ /** Upload limit in bytes. Default 25 MB; `Infinity` disables it. */
41
+ maxBytes?: number;
42
+ /**
43
+ * Turn detection for wrapped sessions. Default `manual`: the whole clip is
44
+ * one turn, committed by `end()`.
45
+ */
46
+ turnDetection?: StreamingTurnDetection;
47
+ }
48
+ /**
49
+ * Adapts a streaming transcriber to the request/response `Transcriber`
50
+ * interface for record-then-send callers. Each `transcribe()` opens one
51
+ * session, streams the recording, and returns `session.end()`.
52
+ *
53
+ * Input must be raw audio: a PCM16/G.711 WAV file, `audio/pcm` or
54
+ * `audio/L16` (optionally with `rate`/`channels` parameters), `audio/pcmu`,
55
+ * `audio/pcma`, or untyped bytes in the adapter's default format. WAV headers
56
+ * and MIME parameters set the session format; compressed recordings are
57
+ * rejected, so use an HTTP transcriber for WebM/MP4/Ogg.
58
+ *
59
+ * A clip longer than the adapter's per-turn limit (`maxTurnSeconds`) is
60
+ * never sent as one turn: with rollover (the default) the session splits it
61
+ * into several turns at quiet boundaries, and with `rollover: false` the clip
62
+ * is rejected with `SPEECH_TURN_TOO_LONG` before connecting.
63
+ */
64
+ export declare function wrapStreamingTranscriber(streaming: StreamingTranscriber, options?: StreamingTranscriberWrapperOptions): Transcriber;
65
+ //# sourceMappingURL=streaming-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming-factory.d.ts","sourceRoot":"","sources":["../../src/shared/streaming-factory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAML,KAAK,SAAS,EACf,MAAM,UAAU,CAAC;AAOlB,OAAO,KAAK,EACV,8BAA8B,EAE9B,oBAAoB,EACpB,wBAAwB,EACxB,sBAAsB,EACvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EACV,WAAW,EAGZ,MAAM,YAAY,CAAC;AAEpB,gEAAgE;AAChE,eAAO,MAAM,2BAA2B,EAAE,SAAS,wBAAwB,EAClC,CAAC;AAE1C,qFAAqF;AACrF,eAAO,MAAM,8BAA8B;;;;;;;;;;;CAcjC,CAAC;AAEX,MAAM,WAAW,uBAAuB;IACtC,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,yEAAyE;IACzE,OAAO,CAAC,EAAE,WAAW,CAAC;CACvB;AAED,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,MAAM,GAAG,SAAS,GACvB,IAAI,IAAI,wBAAwB,CAKlC;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,GAAE,8BAAmC,EAC5C,OAAO,GAAE,uBAA4B,GACpC,oBAAoB,CA4CtB;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB,sBAAsB,GAAG,SAAS,CAcpC;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB,MAAM,GAAG,SAAS,CAWpB;AAED,MAAM,WAAW,kCAAkC;IACjD,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,aAAa,CAAC,EAAE,sBAAsB,CAAC;CACxC;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,oBAAoB,EAC/B,OAAO,GAAE,kCAAuC,GAC/C,WAAW,CA6Eb"}
@@ -0,0 +1,303 @@
1
+ import { TranscriptResult } from './types.js';
2
+ import { SpeechUsageCallback } from './usage.js';
3
+ import { SpeechWebSocketConstructor, SpeechWebSocketFactory } from './websocket.js';
4
+ /** Streaming adapter identifiers. */
5
+ export type StreamingTranscriberType = 'openai-realtime' | 'voxtral-realtime';
6
+ /**
7
+ * Raw audio sample encodings. Streaming adapters never decode containers
8
+ * (WebM, MP4, Ogg) or resample: callers send audio in the negotiated format.
9
+ *
10
+ * - `pcm16`: signed 16-bit little-endian PCM, interleaved when multi-channel.
11
+ * - `g711_ulaw` / `g711_alaw`: 8-bit G.711 companded audio.
12
+ */
13
+ export type StreamingAudioEncoding = 'pcm16' | 'g711_ulaw' | 'g711_alaw';
14
+ /** Explicit audio format for a streaming session. */
15
+ export interface StreamingAudioFormat {
16
+ encoding: StreamingAudioEncoding;
17
+ /** Samples per second, e.g. `24000`. */
18
+ sampleRate: number;
19
+ /** Channel count. Realtime providers generally require mono (`1`). */
20
+ channels: number;
21
+ }
22
+ /**
23
+ * Turn detection (voice activity detection).
24
+ *
25
+ * - `server_vad`: the provider commits a turn after `silenceDurationMs` of
26
+ * silence and emits a `final` per turn. The default for live sessions.
27
+ * - `semantic_vad`: the provider decides turn ends from content.
28
+ * - `manual`: nothing is committed until `session.commit()` or `end()`. The
29
+ * default for the record-then-send `Transcriber` wrapper.
30
+ */
31
+ export type StreamingTurnDetection = {
32
+ type: 'server_vad';
33
+ /** Activation threshold 0-1. Provider default `0.5`. */
34
+ threshold?: number;
35
+ /** Audio kept before detected speech. Provider default `300`. */
36
+ prefixPaddingMs?: number;
37
+ /** Silence that ends a turn. Provider default `500`. */
38
+ silenceDurationMs?: number;
39
+ } | {
40
+ type: 'semantic_vad';
41
+ eagerness?: 'low' | 'medium' | 'high' | 'auto';
42
+ } | {
43
+ type: 'manual';
44
+ };
45
+ /** Audio accepted by {@link StreamingSession.write}. `Buffer` is a `Uint8Array`. */
46
+ export type StreamingAudioChunk = Uint8Array | ArrayBuffer | ArrayBufferView;
47
+ /**
48
+ * A short-lived browser credential, or a function that mints one per session
49
+ * (for example by calling your server, which asks the provider for an
50
+ * ephemeral client secret scoped to the current tenant).
51
+ */
52
+ export type StreamingClientSecret = string | (() => string | Promise<string>);
53
+ /** Settings shared by adapter construction and individual sessions. */
54
+ export interface StreamingSessionSettings {
55
+ /** Transcription model. */
56
+ model?: string;
57
+ /** ISO-639-1 language hint, e.g. `en`. */
58
+ language?: string;
59
+ /** Vocabulary or style prompt. */
60
+ prompt?: string;
61
+ /** Turn detection. Adapter default `server_vad`. */
62
+ turnDetection?: StreamingTurnDetection;
63
+ /** Audio format; unset fields use the adapter default. */
64
+ format?: Partial<StreamingAudioFormat>;
65
+ /**
66
+ * Extra headers sent on the WebSocket handshake (e.g. gateway `x-bf-vk`).
67
+ * Node-only: browsers cannot set WebSocket headers.
68
+ */
69
+ headers?: HeadersInit;
70
+ /** Short-lived credential sent as a WebSocket subprotocol (browser-safe). */
71
+ clientSecret?: StreamingClientSecret;
72
+ /** Called with aggregated usage when `end()` succeeds. */
73
+ onUsage?: SpeechUsageCallback;
74
+ /**
75
+ * Most audio one turn may hold, in seconds, for providers whose context is
76
+ * per turn. `voxtral-realtime` defaults to `270` (headroom under vLLM's
77
+ * `max_model_len` 4096). `openai-realtime` has no default and applies it
78
+ * only to `manual` sessions, where it is opt-in; server VAD ends turns
79
+ * there. `Infinity` removes the limit. Env
80
+ * `HAVE_SPEECH_STREAMING_MAX_TURN_SECONDS`.
81
+ */
82
+ maxTurnSeconds?: number;
83
+ /**
84
+ * What happens when a turn reaches `maxTurnSeconds`. Default `true`: the
85
+ * session commits the turn at a quiet boundary (or at the cap when none is
86
+ * found), emits its `final`, and continues in a new turn without losing
87
+ * audio. `false`: a `write()` that would push the turn past the cap rejects
88
+ * with the non-fatal code `SPEECH_TURN_TOO_LONG`; call `commit()` and keep
89
+ * writing. An object enables rollover with tuning.
90
+ */
91
+ rollover?: boolean | StreamingRolloverOptions;
92
+ }
93
+ /** Tuning for automatic turn rollover. */
94
+ export interface StreamingRolloverOptions {
95
+ /**
96
+ * How long before `maxTurnSeconds` to start looking for a quiet boundary.
97
+ * Default `15`.
98
+ */
99
+ windowSeconds?: number;
100
+ /**
101
+ * RMS level, from 0 to 1 of full scale, below which a 20 ms frame counts as
102
+ * quiet. Default `0.01` (about -40 dBFS).
103
+ */
104
+ silenceThreshold?: number;
105
+ /** Continuous quiet audio needed to commit early. Default `300`. */
106
+ minSilenceMs?: number;
107
+ }
108
+ /** The per-turn audio limit a session enforces; see `maxTurnSeconds`. */
109
+ export interface StreamingTurnLimit {
110
+ maxTurnSeconds: number;
111
+ /** `true` when the session rolls over, `false` when writes past the cap reject. */
112
+ rollover: boolean;
113
+ /** The cap in bytes of the session's audio format (whole sample frames). */
114
+ maxTurnBytes: number;
115
+ }
116
+ /** Options for {@link StreamingTranscriber.start}. Values override adapter defaults. */
117
+ export interface StreamingSessionOptions extends StreamingSessionSettings {
118
+ /** Aborting fails the session and closes the socket. */
119
+ signal?: AbortSignal;
120
+ metadata?: Record<string, unknown>;
121
+ }
122
+ /** Session lifecycle states. `closed` and `failed` are terminal. */
123
+ export type StreamingSessionState = 'connecting' | 'open' | 'ending' | 'closed' | 'failed';
124
+ export interface StreamingPartialEvent {
125
+ /** Newly recognised text. */
126
+ delta: string;
127
+ /** Text recognised so far for this turn (all deltas joined). */
128
+ text: string;
129
+ /** Provider turn/item id, when the protocol has one. */
130
+ itemId?: string;
131
+ }
132
+ export interface StreamingFinalEvent {
133
+ /** Final text for one committed turn. */
134
+ text: string;
135
+ itemId?: string;
136
+ /** Provider usage block for this turn, passed through untouched. */
137
+ providerUsage?: Record<string, unknown>;
138
+ raw?: unknown;
139
+ }
140
+ export interface StreamingSpeechEvent {
141
+ itemId?: string;
142
+ /** Offset into the session audio, in milliseconds. */
143
+ audioMs?: number;
144
+ }
145
+ export interface StreamingCloseEvent {
146
+ code: number;
147
+ reason: string;
148
+ }
149
+ /** Events emitted by a {@link StreamingSession}. */
150
+ export interface StreamingSessionEvents {
151
+ /** The socket is open and the session configuration has been sent. */
152
+ open: {
153
+ sessionId?: string;
154
+ };
155
+ partial: StreamingPartialEvent;
156
+ final: StreamingFinalEvent;
157
+ speech_started: StreamingSpeechEvent;
158
+ speech_stopped: StreamingSpeechEvent;
159
+ /**
160
+ * A fatal session error. Emitted once; `end()` and pending `write()` calls
161
+ * reject with the same error.
162
+ */
163
+ error: Error;
164
+ /** The socket closed (normally after `end()`, or unexpectedly). */
165
+ close: StreamingCloseEvent;
166
+ }
167
+ export type StreamingSessionEventName = keyof StreamingSessionEvents;
168
+ export type StreamingSessionListener<E extends StreamingSessionEventName> = (event: StreamingSessionEvents[E]) => void;
169
+ /**
170
+ * One realtime transcription session over a WebSocket.
171
+ *
172
+ * **Backpressure.** `write()` returns a promise that resolves once the chunk
173
+ * has been handed to the socket and the socket's send buffer has drained to
174
+ * `highWaterMark` or below. Await each write to stream at the rate the network
175
+ * accepts. Writes are queued in order, including before the socket opens; a
176
+ * write that would push queued, unsent audio past `maxBufferedBytes` rejects
177
+ * instead of growing memory without bound.
178
+ *
179
+ * **Reconnect policy.** None. The provider holds the audio buffer and turn
180
+ * state, so a mid-session socket drop cannot be resumed without losing or
181
+ * duplicating text. An unexpected close fails the session: queued audio is
182
+ * discarded, pending `write()` calls and `end()` reject with a
183
+ * `SpeechProviderError`, and `error` then `close` are emitted. Start a new
184
+ * session to continue; finals already emitted remain valid.
185
+ */
186
+ export interface StreamingSession {
187
+ readonly state: StreamingSessionState;
188
+ /** Provider session id, once known. */
189
+ readonly sessionId?: string;
190
+ /** Resolves when the session is open; rejects if it fails first. */
191
+ readonly ready: Promise<void>;
192
+ /** Queued audio bytes not yet handed to the socket. */
193
+ readonly queuedBytes: number;
194
+ /**
195
+ * Queues audio in the session's negotiated format. See backpressure above.
196
+ * With a turn limit and `rollover: false`, rejects with the non-fatal
197
+ * `SPEECH_TURN_TOO_LONG` instead of letting the current turn grow past it.
198
+ */
199
+ write(chunk: StreamingAudioChunk): Promise<void>;
200
+ /** Ends the current turn now (manual turn detection). Ordered after queued writes. */
201
+ commit(): void;
202
+ /**
203
+ * Flushes queued audio, commits any uncommitted audio, waits for every
204
+ * pending turn's final transcript (bounded by `timeoutMs`), closes the
205
+ * socket, and resolves with the joined transcript and usage. Idempotent.
206
+ */
207
+ end(): Promise<TranscriptResult>;
208
+ /** Fails the session immediately and closes the socket. */
209
+ abort(reason?: unknown): void;
210
+ /** Adds a listener; returns a function that removes it. */
211
+ on<E extends StreamingSessionEventName>(event: E, listener: StreamingSessionListener<E>): () => void;
212
+ off<E extends StreamingSessionEventName>(event: E, listener: StreamingSessionListener<E>): void;
213
+ }
214
+ /** Factory for realtime sessions against one configured provider. */
215
+ export interface StreamingTranscriber {
216
+ readonly type: StreamingTranscriberType;
217
+ /** Default audio format for new sessions. */
218
+ readonly audioFormat: StreamingAudioFormat;
219
+ /** Opens a session. Connection happens in the background; see `session.ready`. */
220
+ start(options?: StreamingSessionOptions): StreamingSession;
221
+ /**
222
+ * The per-turn limit a session started with `options` would enforce, or
223
+ * `undefined` when its turns are unbounded. Throws like `start()` on an
224
+ * invalid limit. Optional for custom implementations.
225
+ */
226
+ turnLimit?(options?: StreamingSessionOptions): StreamingTurnLimit | undefined;
227
+ }
228
+ /** Adapter options shared by WebSocket streaming transcribers. */
229
+ export interface StreamingTranscriberOptions extends StreamingSessionSettings {
230
+ /**
231
+ * WebSocket URL or HTTP(S) base URL. `http` becomes `ws` and `https`
232
+ * becomes `wss`. A server root gets `/v1/realtime`; a base ending in a
233
+ * version segment gets `/realtime`; a URL ending in `/realtime` is used as-is.
234
+ */
235
+ baseUrl?: string;
236
+ /**
237
+ * Long-lived API key sent as `Authorization: Bearer`. Node-only: refused in
238
+ * browsers. Browsers use `clientSecret`.
239
+ */
240
+ apiKey?: string;
241
+ /**
242
+ * Maximum provider inactivity while waiting for final transcripts after
243
+ * `end()` (every server message restarts it), and maximum wait for a
244
+ * congested socket to drain during `write()`. Default `30000`.
245
+ */
246
+ timeoutMs?: number;
247
+ /** Maximum wait for the socket to open. Default `10000`. */
248
+ connectTimeoutMs?: number;
249
+ /** Socket send-buffer size at which `write()` waits. Default 1 MiB. */
250
+ highWaterMark?: number;
251
+ /** Queued, unsent audio at which `write()` rejects. Default 16 MiB. */
252
+ maxBufferedBytes?: number;
253
+ /**
254
+ * WebSocket constructor. Defaults to `globalThis.WebSocket` (Node 22+,
255
+ * browsers, Deno, Bun). Handshake headers are passed as
256
+ * `new WebSocket(url, { protocols, headers })`, which Node's built-in
257
+ * WebSocket supports; use `createWebSocket` for other clients such as `ws`.
258
+ */
259
+ WebSocket?: SpeechWebSocketConstructor;
260
+ /** Full control over socket creation; wins over `WebSocket`. */
261
+ createWebSocket?: SpeechWebSocketFactory;
262
+ }
263
+ /** Options for the `openai-realtime` adapter. */
264
+ export interface OpenAIRealtimeTranscriberOptions extends StreamingTranscriberOptions {
265
+ type?: 'openai-realtime';
266
+ /** Default `wss://api.openai.com/v1/realtime`. */
267
+ baseUrl?: string;
268
+ /** Default `gpt-4o-transcribe`. */
269
+ model?: string;
270
+ /** `audio.input.noise_reduction.type`. Omitted by default. */
271
+ noiseReduction?: 'near_field' | 'far_field';
272
+ /** Session `include` list, e.g. `['item.input_audio_transcription.logprobs']`. */
273
+ include?: string[];
274
+ /**
275
+ * Extra fields merged into `audio.input.transcription`, e.g.
276
+ * `{ delay: 'low', languages: ['en', 'fr'] }` for `gpt-live-transcribe`.
277
+ * The typed `model`, `language`, and `prompt` settings take precedence.
278
+ */
279
+ transcriptionOptions?: Record<string, unknown>;
280
+ }
281
+ /**
282
+ * Options for the `voxtral-realtime` adapter (vLLM's `/v1/realtime`). Audio is
283
+ * fixed at PCM16 16 kHz mono and turns are manual; `language` and `prompt`
284
+ * are not sent because vLLM's realtime session accepts only `model`.
285
+ */
286
+ export interface VoxtralRealtimeTranscriberOptions extends StreamingTranscriberOptions {
287
+ type?: 'voxtral-realtime';
288
+ /**
289
+ * Required: the vLLM server root (`http://host:8000`), its `/v1` API root,
290
+ * or the full `ws(s)://…/v1/realtime` URL.
291
+ */
292
+ baseUrl?: string;
293
+ /**
294
+ * The model name vLLM serves, e.g. a `--served-model-name`. Default
295
+ * `mistralai/Voxtral-Mini-4B-Realtime-2602`.
296
+ */
297
+ model?: string;
298
+ }
299
+ /** Options accepted by `getStreamingTranscriber()`. */
300
+ export interface GetStreamingTranscriberOptions extends Omit<OpenAIRealtimeTranscriberOptions, 'type'> {
301
+ type?: StreamingTranscriberType;
302
+ }
303
+ //# sourceMappingURL=streaming-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming-types.d.ts","sourceRoot":"","sources":["../../src/shared/streaming-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ import { StreamingAudioFormat, StreamingSessionSettings, StreamingTurnLimit } from './streaming-types.js';
2
+ /** Default per-turn audio cap for providers that need one (`voxtral-realtime`). */
3
+ export declare const DEFAULT_MAX_TURN_SECONDS = 270;
4
+ /** How long before the cap the rollover starts looking for silence. */
5
+ export declare const DEFAULT_ROLLOVER_WINDOW_SECONDS = 15;
6
+ /** RMS level (0-1 of full scale, about -40 dBFS) below which audio is quiet. */
7
+ export declare const DEFAULT_ROLLOVER_SILENCE_THRESHOLD = 0.01;
8
+ /** Quiet audio needed before the rollover commits. */
9
+ export declare const DEFAULT_ROLLOVER_MIN_SILENCE_MS = 300;
10
+ /** A resolved per-turn limit; `undefined` means turns are unbounded. */
11
+ export interface TurnLimit {
12
+ maxTurnSeconds: number;
13
+ /** `false`: writes past the cap reject with `SPEECH_TURN_TOO_LONG`. */
14
+ rollover: boolean;
15
+ windowSeconds: number;
16
+ silenceThreshold: number;
17
+ minSilenceMs: number;
18
+ }
19
+ /**
20
+ * Resolves the turn limit from settings, highest priority first (session
21
+ * options, then adapter options, which already carry environment values),
22
+ * falling back to `defaultMaxTurnSeconds`. Returns `undefined` when no limit
23
+ * applies or `maxTurnSeconds` is `Infinity`.
24
+ */
25
+ export declare function resolveTurnLimit(adapter: string, defaultMaxTurnSeconds: number | undefined, ...settings: Array<Pick<StreamingSessionSettings, 'maxTurnSeconds' | 'rollover'> | undefined>): TurnLimit | undefined;
26
+ /** Bytes of one sample frame (one sample per channel). */
27
+ export declare function blockAlign(format: StreamingAudioFormat): number;
28
+ /** Whole sample frames in `seconds` of audio, as bytes (rounded down). */
29
+ export declare function bytesForSeconds(seconds: number, format: StreamingAudioFormat): number;
30
+ /** Digital silence in `format`: zero samples, encoded. */
31
+ export declare function silence(bytes: number, format: StreamingAudioFormat): Uint8Array;
32
+ /** Bytes of audio one turn may hold: whole sample frames, at least one. */
33
+ export declare function turnCapBytes(limit: TurnLimit, format: StreamingAudioFormat): number;
34
+ /** The public view of a resolved limit for a session format. */
35
+ export declare function describeTurnLimit(limit: TurnLimit | undefined, format: StreamingAudioFormat): StreamingTurnLimit | undefined;
36
+ /**
37
+ * Tracks the audio of the current turn and finds rollover points.
38
+ *
39
+ * Feed every chunk in write order to {@link split} (rollover on) or
40
+ * {@link add} (rollover off), and call {@link reset} whenever the turn ends
41
+ * for another reason (a manual commit).
42
+ */
43
+ export declare class TurnSplitter {
44
+ /** Bytes of the current turn so far. */
45
+ turnBytes: number;
46
+ readonly capBytes: number;
47
+ private readonly windowStartBytes;
48
+ private readonly frameBytes;
49
+ private readonly minSilenceBytes;
50
+ private readonly threshold;
51
+ private readonly encoding;
52
+ private readonly sampleBytes;
53
+ private frameFill;
54
+ private frameSumSquares;
55
+ private frameSamples;
56
+ /** Trailing bytes of a sample split across chunks. */
57
+ private carry;
58
+ /** Consecutive quiet bytes ending at the last complete frame. */
59
+ private quietRun;
60
+ constructor(limit: TurnLimit, format: StreamingAudioFormat);
61
+ /** Ends the current turn: the next byte starts a new one. */
62
+ reset(): void;
63
+ /** Whether `bytes` more would push the current turn past the cap. */
64
+ wouldOverflow(bytes: number): boolean;
65
+ /** Counts `bytes` toward the current turn without analysing them. */
66
+ add(bytes: number): void;
67
+ /**
68
+ * Feeds one chunk and returns the offsets inside it where the turn should
69
+ * end (each in `1..chunk.byteLength`, ascending). The splitter resets at
70
+ * each offset, so bytes after it count toward the next turn.
71
+ */
72
+ split(chunk: Uint8Array): number[];
73
+ private frameIsQuiet;
74
+ private measure;
75
+ private addSample;
76
+ private addSampleAt;
77
+ private addLinear;
78
+ private decodeG711;
79
+ }
80
+ /** G.711 mu-law byte to a 16-bit linear sample (ITU-T G.711). */
81
+ export declare function decodeMuLaw(byte: number): number;
82
+ /** G.711 A-law byte to a 16-bit linear sample (ITU-T G.711). */
83
+ export declare function decodeALaw(byte: number): number;
84
+ //# sourceMappingURL=turn-limit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turn-limit.d.ts","sourceRoot":"","sources":["../../src/shared/turn-limit.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,20 @@
1
+ import { LocalTranscriberSettings } from '../adapters/local/types.js';
1
2
  import { SpeechRetryOptions } from './retry.js';
3
+ import { GetStreamingTranscriberOptions, StreamingTranscriberType } from './streaming-types.js';
2
4
  import { SpeechUsage, SpeechUsageCallback } from './usage.js';
3
5
  export type { SpeechRetryOptions } from './retry.js';
4
6
  export type { SpeechOperation, SpeechUsage, SpeechUsageCallback, } from './usage.js';
5
- export type SpeechAdapterType = 'studio-server' | 'qwen3-tts' | 'openai-compatible';
6
- export type TranscriberType = 'studio-server' | 'openai-compatible';
7
+ export type SpeechAdapterType = 'studio-server' | 'qwen3-tts' | 'openai-compatible' | 'local' | StreamingTranscriberType;
8
+ /**
9
+ * Request/response transcribers, including wrapped streaming adapters.
10
+ * `local` requires importing `@happyvertical/speech/local` first.
11
+ */
12
+ export type TranscriberType = 'studio-server' | 'openai-compatible' | 'local' | StreamingTranscriberType;
7
13
  export type SpeechSynthesizerType = 'studio-server' | 'qwen3-tts' | 'openai-compatible';
8
14
  export interface SpeechAdapterAvailability {
9
15
  transcribers: TranscriberType[];
16
+ /** Adapters available through `getStreamingTranscriber()`. */
17
+ streamingTranscribers: StreamingTranscriberType[];
10
18
  synthesizers: SpeechSynthesizerType[];
11
19
  }
12
20
  export type AudioBytes = ArrayBuffer | Uint8Array | Blob;
@@ -174,20 +182,30 @@ export interface OpenAICompatibleSpeechSynthesizerOptions extends HttpSpeechOpti
174
182
  defaultModel?: string;
175
183
  defaultVoice?: string;
176
184
  }
177
- export interface GetTranscriberOptions extends Partial<HttpSpeechOptions> {
185
+ /**
186
+ * Transcriber factory options. `local` settings (device, dtype, cacheDir, ...)
187
+ * apply only to `type: 'local'`.
188
+ */
189
+ export interface GetTranscriberOptions extends Partial<HttpSpeechOptions>, Omit<LocalTranscriberSettings, 'model' | 'maxBytes' | 'onUsage'> {
178
190
  type?: TranscriberType;
179
191
  /** Studio Server only. */
180
192
  transcribePath?: string;
181
- /** OpenAI-compatible only. */
193
+ /** OpenAI-compatible and local. */
182
194
  model?: string;
183
195
  /** OpenAI-compatible only. */
184
196
  responseFormat?: TranscriptionResponseFormat;
185
- /** OpenAI-compatible only. */
197
+ /** OpenAI-compatible and local. */
186
198
  maxBytes?: number;
187
199
  /** OpenAI-compatible only. */
188
200
  retry?: SpeechRetryOptions | false;
189
- /** OpenAI-compatible only. */
201
+ /** OpenAI-compatible, local, and streaming types. */
190
202
  onUsage?: SpeechUsageCallback;
203
+ /**
204
+ * Streaming types only (e.g. `openai-realtime`): extra adapter settings such
205
+ * as `turnDetection`, `WebSocket`, or `connectTimeoutMs`. Top-level fields
206
+ * win over these.
207
+ */
208
+ streaming?: Omit<GetStreamingTranscriberOptions, 'type'>;
191
209
  }
192
210
  export interface GetSpeechSynthesizerOptions extends Partial<HttpSpeechOptions> {
193
211
  type?: SpeechSynthesizerType;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/shared/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Minimal WebSocket surface used by streaming adapters. Browser, Node 22+
3
+ * (`globalThis.WebSocket`), Deno, Bun, and the `ws` package all satisfy it.
4
+ */
5
+ /** `WebSocket.OPEN`. */
6
+ export declare const WEBSOCKET_OPEN = 1;
7
+ export interface SpeechWebSocketMessageEvent {
8
+ data: unknown;
9
+ }
10
+ export interface SpeechWebSocketCloseEvent {
11
+ code?: number;
12
+ reason?: string;
13
+ }
14
+ /** The subset of the WHATWG `WebSocket` interface the adapters use. */
15
+ export interface SpeechWebSocket {
16
+ readonly readyState: number;
17
+ readonly bufferedAmount: number;
18
+ binaryType?: string;
19
+ send(data: string): void;
20
+ close(code?: number, reason?: string): void;
21
+ addEventListener(type: 'open', listener: (event: unknown) => void): void;
22
+ addEventListener(type: 'message', listener: (event: SpeechWebSocketMessageEvent) => void): void;
23
+ addEventListener(type: 'error', listener: (event: unknown) => void): void;
24
+ addEventListener(type: 'close', listener: (event: SpeechWebSocketCloseEvent) => void): void;
25
+ }
26
+ /** Handshake details passed to a {@link SpeechWebSocketFactory}. */
27
+ export interface SpeechWebSocketInit {
28
+ protocols: string[];
29
+ /** Handshake headers; empty in browsers. */
30
+ headers: Record<string, string>;
31
+ }
32
+ export type SpeechWebSocketFactory = (url: string, init: SpeechWebSocketInit) => SpeechWebSocket;
33
+ /**
34
+ * A WebSocket constructor. Standard constructors accept `protocols`; Node's
35
+ * built-in WebSocket also accepts `{ protocols, headers }`.
36
+ */
37
+ export type SpeechWebSocketConstructor = new (url: string, protocols?: string | string[] | {
38
+ protocols?: string[];
39
+ headers?: Record<string, string>;
40
+ }) => SpeechWebSocket;
41
+ /** True in browsers and web workers, where API keys must never be used. */
42
+ export declare function isBrowserRuntime(): boolean;
43
+ /**
44
+ * Resolves a socket factory from explicit options, falling back to
45
+ * `globalThis.WebSocket`. Headers are only passed when present, so standard
46
+ * constructors that cannot send them are never handed an options object.
47
+ */
48
+ export declare function resolveWebSocketFactory(adapter: string, options: {
49
+ createWebSocket?: SpeechWebSocketFactory;
50
+ WebSocket?: SpeechWebSocketConstructor;
51
+ }): SpeechWebSocketFactory;
52
+ /** Converts `http(s)://` to `ws(s)://`; leaves `ws(s)://` unchanged. */
53
+ export declare function toWebSocketUrl(url: string, adapter: string): string;
54
+ /** Converts a message payload to text; returns `undefined` for unsupported data. */
55
+ export declare function messageDataToText(data: unknown): string | undefined;
56
+ //# sourceMappingURL=websocket.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../../src/shared/websocket.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,wBAAwB;AACxB,eAAO,MAAM,cAAc,IAAI,CAAC;AAEhC,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,yBAAyB;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,uEAAuE;AACvE,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5C,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI,CAAC;IACzE,gBAAgB,CACd,IAAI,EAAE,SAAS,EACf,QAAQ,EAAE,CAAC,KAAK,EAAE,2BAA2B,KAAK,IAAI,GACrD,IAAI,CAAC;IACR,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI,CAAC;IAC1E,gBAAgB,CACd,IAAI,EAAE,OAAO,EACb,QAAQ,EAAE,CAAC,KAAK,EAAE,yBAAyB,KAAK,IAAI,GACnD,IAAI,CAAC;CACT;AAED,oEAAoE;AACpE,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,4CAA4C;IAC5C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED,MAAM,MAAM,sBAAsB,GAAG,CACnC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,mBAAmB,KACtB,eAAe,CAAC;AAErB;;;GAGG;AACH,MAAM,MAAM,0BAA0B,GAAG,KACvC,GAAG,EAAE,MAAM,EACX,SAAS,CAAC,EACN,MAAM,GACN,MAAM,EAAE,GACR;IAAE,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,KAC3D,eAAe,CAAC;AAErB,2EAA2E;AAC3E,wBAAgB,gBAAgB,IAAI,OAAO,CAa1C;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;IACP,eAAe,CAAC,EAAE,sBAAsB,CAAC;IACzC,SAAS,CAAC,EAAE,0BAA0B,CAAC;CACxC,GACA,sBAAsB,CAmBxB;AAED,wEAAwE;AACxE,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAanE;AAED,oFAAoF;AACpF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAWnE"}