even-toolkit 1.0.0 → 1.1.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 (70) hide show
  1. package/README.md +5 -5
  2. package/dist/stt/audio/buffer.d.ts +12 -0
  3. package/dist/stt/audio/buffer.d.ts.map +1 -0
  4. package/dist/stt/audio/buffer.js +35 -0
  5. package/dist/stt/audio/buffer.js.map +1 -0
  6. package/dist/stt/audio/pcm-utils.d.ts +9 -0
  7. package/dist/stt/audio/pcm-utils.d.ts.map +1 -0
  8. package/dist/stt/audio/pcm-utils.js +52 -0
  9. package/dist/stt/audio/pcm-utils.js.map +1 -0
  10. package/dist/stt/audio/resample.d.ts +3 -0
  11. package/dist/stt/audio/resample.d.ts.map +1 -0
  12. package/dist/stt/audio/resample.js +17 -0
  13. package/dist/stt/audio/resample.js.map +1 -0
  14. package/dist/stt/audio/vad.d.ts +17 -0
  15. package/dist/stt/audio/vad.d.ts.map +1 -0
  16. package/dist/stt/audio/vad.js +43 -0
  17. package/dist/stt/audio/vad.js.map +1 -0
  18. package/dist/stt/engine.d.ts +38 -0
  19. package/dist/stt/engine.d.ts.map +1 -0
  20. package/dist/stt/engine.js +233 -0
  21. package/dist/stt/engine.js.map +1 -0
  22. package/dist/stt/i18n.d.ts +13 -0
  23. package/dist/stt/i18n.d.ts.map +1 -0
  24. package/dist/stt/i18n.js +31 -0
  25. package/dist/stt/i18n.js.map +1 -0
  26. package/dist/stt/index.d.ts +11 -0
  27. package/dist/stt/index.d.ts.map +1 -0
  28. package/dist/stt/index.js +11 -0
  29. package/dist/stt/index.js.map +1 -0
  30. package/dist/stt/providers/deepgram.d.ts +29 -0
  31. package/dist/stt/providers/deepgram.d.ts.map +1 -0
  32. package/dist/stt/providers/deepgram.js +145 -0
  33. package/dist/stt/providers/deepgram.js.map +1 -0
  34. package/dist/stt/providers/web-speech.d.ts +25 -0
  35. package/dist/stt/providers/web-speech.d.ts.map +1 -0
  36. package/dist/stt/providers/web-speech.js +153 -0
  37. package/dist/stt/providers/web-speech.js.map +1 -0
  38. package/dist/stt/providers/whisper-api.d.ts +26 -0
  39. package/dist/stt/providers/whisper-api.d.ts.map +1 -0
  40. package/dist/stt/providers/whisper-api.js +120 -0
  41. package/dist/stt/providers/whisper-api.js.map +1 -0
  42. package/dist/stt/providers/whisper-local/provider.d.ts +31 -0
  43. package/dist/stt/providers/whisper-local/provider.d.ts.map +1 -0
  44. package/dist/stt/providers/whisper-local/provider.js +174 -0
  45. package/dist/stt/providers/whisper-local/provider.js.map +1 -0
  46. package/dist/stt/providers/whisper-local/worker.d.ts +2 -0
  47. package/dist/stt/providers/whisper-local/worker.d.ts.map +1 -0
  48. package/dist/stt/providers/whisper-local/worker.js +35 -0
  49. package/dist/stt/providers/whisper-local/worker.js.map +1 -0
  50. package/dist/stt/react/useSTT.d.ts +3 -0
  51. package/dist/stt/react/useSTT.d.ts.map +1 -0
  52. package/dist/stt/react/useSTT.js +99 -0
  53. package/dist/stt/react/useSTT.js.map +1 -0
  54. package/dist/stt/registry.d.ts +3 -0
  55. package/dist/stt/registry.d.ts.map +1 -0
  56. package/dist/stt/registry.js +23 -0
  57. package/dist/stt/registry.js.map +1 -0
  58. package/dist/stt/sources/glass-bridge.d.ts +28 -0
  59. package/dist/stt/sources/glass-bridge.d.ts.map +1 -0
  60. package/dist/stt/sources/glass-bridge.js +47 -0
  61. package/dist/stt/sources/glass-bridge.js.map +1 -0
  62. package/dist/stt/sources/microphone.d.ts +17 -0
  63. package/dist/stt/sources/microphone.d.ts.map +1 -0
  64. package/dist/stt/sources/microphone.js +69 -0
  65. package/dist/stt/sources/microphone.js.map +1 -0
  66. package/dist/stt/types.d.ts +89 -0
  67. package/dist/stt/types.d.ts.map +1 -0
  68. package/dist/stt/types.js +3 -0
  69. package/dist/stt/types.js.map +1 -0
  70. package/package.json +40 -3
@@ -0,0 +1,29 @@
1
+ import type { STTProvider, STTProviderConfig, STTMode, STTState, STTTranscript, STTError } from '../types';
2
+ export declare class DeepgramProvider implements STTProvider {
3
+ readonly type: "deepgram";
4
+ readonly supportedModes: STTMode[];
5
+ private _state;
6
+ private apiKey;
7
+ private language;
8
+ private modelId;
9
+ private ws;
10
+ private transcriptCbs;
11
+ private stateCbs;
12
+ private errorCbs;
13
+ get state(): STTState;
14
+ init(config: STTProviderConfig): Promise<void>;
15
+ start(): void;
16
+ /** Send raw audio data (PCM Int16 or Float32 as ArrayBuffer) to the Deepgram stream. */
17
+ sendAudio(data: ArrayBuffer | Int16Array | Float32Array): void;
18
+ stop(): void;
19
+ abort(): void;
20
+ dispose(): void;
21
+ onTranscript(cb: (t: STTTranscript) => void): () => void;
22
+ onStateChange(cb: (s: STTState) => void): () => void;
23
+ onError(cb: (e: STTError) => void): () => void;
24
+ private closeSocket;
25
+ private setState;
26
+ private emitTranscript;
27
+ private emitError;
28
+ }
29
+ //# sourceMappingURL=deepgram.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deepgram.d.ts","sourceRoot":"","sources":["../../../stt/providers/deepgram.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,iBAAiB,EACjB,OAAO,EACP,QAAQ,EACR,aAAa,EACb,QAAQ,EACT,MAAM,UAAU,CAAC;AAalB,qBAAa,gBAAiB,YAAW,WAAW;IAClD,QAAQ,CAAC,IAAI,aAAuB;IACpC,QAAQ,CAAC,cAAc,EAAE,OAAO,EAAE,CAAiB;IAEnD,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,OAAO,CAAY;IAC3B,OAAO,CAAC,EAAE,CAA0B;IAEpC,OAAO,CAAC,aAAa,CAAyC;IAC9D,OAAO,CAAC,QAAQ,CAAoC;IACpD,OAAO,CAAC,QAAQ,CAAoC;IAEpD,IAAI,KAAK,IAAI,QAAQ,CAEpB;IAEK,IAAI,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAYpD,KAAK,IAAI,IAAI;IA2Db,wFAAwF;IACxF,SAAS,CAAC,IAAI,EAAE,WAAW,GAAG,UAAU,GAAG,YAAY,GAAG,IAAI;IAU9D,IAAI,IAAI,IAAI;IAQZ,KAAK,IAAI,IAAI;IAIb,OAAO,IAAI,IAAI;IAOf,YAAY,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,GAAG,MAAM,IAAI;IAKxD,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,KAAK,IAAI,GAAG,MAAM,IAAI;IAKpD,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,KAAK,IAAI,GAAG,MAAM,IAAI;IAO9C,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,QAAQ;IAMhB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,SAAS;CAGlB"}
@@ -0,0 +1,145 @@
1
+ export class DeepgramProvider {
2
+ constructor() {
3
+ this.type = 'deepgram';
4
+ this.supportedModes = ['streaming'];
5
+ this._state = 'idle';
6
+ this.apiKey = '';
7
+ this.language = 'en';
8
+ this.modelId = 'nova-2';
9
+ this.ws = null;
10
+ this.transcriptCbs = [];
11
+ this.stateCbs = [];
12
+ this.errorCbs = [];
13
+ }
14
+ get state() {
15
+ return this._state;
16
+ }
17
+ async init(config) {
18
+ this.apiKey = config.apiKey ?? '';
19
+ this.language = config.language ?? 'en';
20
+ this.modelId = config.modelId ?? 'nova-2';
21
+ if (!this.apiKey) {
22
+ const err = { code: 'not-allowed', message: 'Deepgram API key is required', provider: this.type };
23
+ this.emitError(err);
24
+ throw new Error(err.message);
25
+ }
26
+ }
27
+ start() {
28
+ if (this.ws) {
29
+ this.closeSocket();
30
+ }
31
+ const params = new URLSearchParams({
32
+ model: this.modelId,
33
+ language: this.language,
34
+ interim_results: 'true',
35
+ punctuate: 'true',
36
+ encoding: 'linear16',
37
+ sample_rate: '16000',
38
+ });
39
+ const url = `wss://api.deepgram.com/v1/listen?${params.toString()}`;
40
+ this.ws = new WebSocket(url, ['token', this.apiKey]);
41
+ this.ws.binaryType = 'arraybuffer';
42
+ this.ws.onopen = () => {
43
+ this.setState('listening');
44
+ };
45
+ this.ws.onmessage = (event) => {
46
+ try {
47
+ const data = JSON.parse(event.data);
48
+ const alt = data.channel?.alternatives?.[0];
49
+ if (!alt?.transcript)
50
+ return;
51
+ const transcript = {
52
+ text: alt.transcript,
53
+ isFinal: data.is_final ?? false,
54
+ confidence: alt.confidence ?? 0,
55
+ timestamp: Date.now(),
56
+ };
57
+ this.emitTranscript(transcript);
58
+ }
59
+ catch {
60
+ // Non-JSON message, ignore
61
+ }
62
+ };
63
+ this.ws.onerror = () => {
64
+ const err = {
65
+ code: 'network',
66
+ message: 'Deepgram WebSocket error',
67
+ provider: this.type,
68
+ };
69
+ this.emitError(err);
70
+ this.setState('error');
71
+ };
72
+ this.ws.onclose = () => {
73
+ this.ws = null;
74
+ if (this._state === 'listening') {
75
+ this.setState('idle');
76
+ }
77
+ };
78
+ }
79
+ /** Send raw audio data (PCM Int16 or Float32 as ArrayBuffer) to the Deepgram stream. */
80
+ sendAudio(data) {
81
+ if (!this.ws || this.ws.readyState !== WebSocket.OPEN)
82
+ return;
83
+ if (data instanceof ArrayBuffer) {
84
+ this.ws.send(data);
85
+ }
86
+ else {
87
+ this.ws.send(data.buffer);
88
+ }
89
+ }
90
+ stop() {
91
+ if (this.ws && this.ws.readyState === WebSocket.OPEN) {
92
+ // Send close message per Deepgram protocol
93
+ this.ws.send(JSON.stringify({ type: 'CloseStream' }));
94
+ }
95
+ this.closeSocket();
96
+ }
97
+ abort() {
98
+ this.closeSocket();
99
+ }
100
+ dispose() {
101
+ this.closeSocket();
102
+ this.transcriptCbs = [];
103
+ this.stateCbs = [];
104
+ this.errorCbs = [];
105
+ }
106
+ onTranscript(cb) {
107
+ this.transcriptCbs.push(cb);
108
+ return () => { this.transcriptCbs = this.transcriptCbs.filter((c) => c !== cb); };
109
+ }
110
+ onStateChange(cb) {
111
+ this.stateCbs.push(cb);
112
+ return () => { this.stateCbs = this.stateCbs.filter((c) => c !== cb); };
113
+ }
114
+ onError(cb) {
115
+ this.errorCbs.push(cb);
116
+ return () => { this.errorCbs = this.errorCbs.filter((c) => c !== cb); };
117
+ }
118
+ // ── Private ──
119
+ closeSocket() {
120
+ if (this.ws) {
121
+ try {
122
+ this.ws.close();
123
+ }
124
+ catch { /* ignore */ }
125
+ this.ws = null;
126
+ }
127
+ this.setState('idle');
128
+ }
129
+ setState(s) {
130
+ if (this._state === s)
131
+ return;
132
+ this._state = s;
133
+ for (const cb of this.stateCbs)
134
+ cb(s);
135
+ }
136
+ emitTranscript(t) {
137
+ for (const cb of this.transcriptCbs)
138
+ cb(t);
139
+ }
140
+ emitError(e) {
141
+ for (const cb of this.errorCbs)
142
+ cb(e);
143
+ }
144
+ }
145
+ //# sourceMappingURL=deepgram.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deepgram.js","sourceRoot":"","sources":["../../../stt/providers/deepgram.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { STTProvider, STTProviderConfig, STTMode, STTState, STTTranscript, STTError } from '../types';
2
+ export declare class WebSpeechProvider implements STTProvider {
3
+ readonly type: "web-speech";
4
+ readonly supportedModes: STTMode[];
5
+ private _state;
6
+ private recognition;
7
+ private config;
8
+ private stopping;
9
+ private transcriptCbs;
10
+ private stateCbs;
11
+ private errorCbs;
12
+ get state(): STTState;
13
+ init(config: STTProviderConfig): Promise<void>;
14
+ start(): void;
15
+ stop(): void;
16
+ abort(): void;
17
+ dispose(): void;
18
+ onTranscript(cb: (t: STTTranscript) => void): () => void;
19
+ onStateChange(cb: (s: STTState) => void): () => void;
20
+ onError(cb: (e: STTError) => void): () => void;
21
+ private setState;
22
+ private emitTranscript;
23
+ private emitError;
24
+ }
25
+ //# sourceMappingURL=web-speech.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-speech.d.ts","sourceRoot":"","sources":["../../../stt/providers/web-speech.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,iBAAiB,EACjB,OAAO,EACP,QAAQ,EACR,aAAa,EACb,QAAQ,EACT,MAAM,UAAU,CAAC;AAuDlB,qBAAa,iBAAkB,YAAW,WAAW;IACnD,QAAQ,CAAC,IAAI,eAAyB;IACtC,QAAQ,CAAC,cAAc,EAAE,OAAO,EAAE,CAAiB;IAEnD,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,WAAW,CAA0C;IAC7D,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,QAAQ,CAAS;IAEzB,OAAO,CAAC,aAAa,CAAyC;IAC9D,OAAO,CAAC,QAAQ,CAAoC;IACpD,OAAO,CAAC,QAAQ,CAAoC;IAEpD,IAAI,KAAK,IAAI,QAAQ,CAEpB;IAEK,IAAI,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IASpD,KAAK,IAAI,IAAI;IA2Db,IAAI,IAAI,IAAI;IAOZ,KAAK,IAAI,IAAI;IAOb,OAAO,IAAI,IAAI;IAOf,YAAY,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,GAAG,MAAM,IAAI;IAOxD,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,KAAK,IAAI,GAAG,MAAM,IAAI;IAOpD,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,KAAK,IAAI,GAAG,MAAM,IAAI;IAS9C,OAAO,CAAC,QAAQ;IAMhB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,SAAS;CAGlB"}
@@ -0,0 +1,153 @@
1
+ function getSpeechRecognitionCtor() {
2
+ if (typeof window === 'undefined')
3
+ return null;
4
+ const w = window;
5
+ return (w.SpeechRecognition ?? w.webkitSpeechRecognition);
6
+ }
7
+ // ── Provider ──
8
+ export class WebSpeechProvider {
9
+ constructor() {
10
+ this.type = 'web-speech';
11
+ this.supportedModes = ['streaming'];
12
+ this._state = 'idle';
13
+ this.recognition = null;
14
+ this.config = {};
15
+ this.stopping = false;
16
+ this.transcriptCbs = [];
17
+ this.stateCbs = [];
18
+ this.errorCbs = [];
19
+ }
20
+ get state() {
21
+ return this._state;
22
+ }
23
+ async init(config) {
24
+ const Ctor = getSpeechRecognitionCtor();
25
+ if (!Ctor) {
26
+ this.emitError({ code: 'unsupported', message: 'SpeechRecognition not available in this browser', provider: this.type });
27
+ throw new Error('SpeechRecognition not supported');
28
+ }
29
+ this.config = config;
30
+ }
31
+ start() {
32
+ const Ctor = getSpeechRecognitionCtor();
33
+ if (!Ctor) {
34
+ this.emitError({ code: 'unsupported', message: 'SpeechRecognition not available', provider: this.type });
35
+ return;
36
+ }
37
+ // Tear down previous instance if any
38
+ if (this.recognition) {
39
+ try {
40
+ this.recognition.abort();
41
+ }
42
+ catch { /* ignore */ }
43
+ }
44
+ this.stopping = false;
45
+ const recognition = new Ctor();
46
+ recognition.continuous = this.config.continuous ?? true;
47
+ recognition.interimResults = true;
48
+ recognition.lang = this.config.language ?? 'en-US';
49
+ recognition.onstart = () => {
50
+ this.setState('listening');
51
+ };
52
+ recognition.onresult = (event) => {
53
+ for (let i = event.resultIndex; i < event.results.length; i++) {
54
+ const result = event.results[i];
55
+ if (!result?.[0])
56
+ continue;
57
+ const transcript = {
58
+ text: result[0].transcript,
59
+ isFinal: result.isFinal,
60
+ confidence: result[0].confidence ?? 0,
61
+ timestamp: Date.now(),
62
+ };
63
+ this.emitTranscript(transcript);
64
+ }
65
+ };
66
+ recognition.onerror = (event) => {
67
+ // Suppress no-speech and aborted-while-stopping
68
+ if (event.error === 'no-speech')
69
+ return;
70
+ if (event.error === 'aborted' && this.stopping)
71
+ return;
72
+ const code = mapErrorCode(event.error);
73
+ this.emitError({ code, message: event.message || event.error, provider: this.type });
74
+ if (code !== 'no-speech') {
75
+ this.setState('error');
76
+ }
77
+ };
78
+ recognition.onend = () => {
79
+ this.recognition = null;
80
+ this.setState('idle');
81
+ };
82
+ this.recognition = recognition;
83
+ recognition.start();
84
+ }
85
+ stop() {
86
+ this.stopping = true;
87
+ if (this.recognition) {
88
+ this.recognition.stop();
89
+ }
90
+ }
91
+ abort() {
92
+ this.stopping = true;
93
+ if (this.recognition) {
94
+ this.recognition.abort();
95
+ }
96
+ }
97
+ dispose() {
98
+ this.abort();
99
+ this.transcriptCbs = [];
100
+ this.stateCbs = [];
101
+ this.errorCbs = [];
102
+ }
103
+ onTranscript(cb) {
104
+ this.transcriptCbs.push(cb);
105
+ return () => {
106
+ this.transcriptCbs = this.transcriptCbs.filter((c) => c !== cb);
107
+ };
108
+ }
109
+ onStateChange(cb) {
110
+ this.stateCbs.push(cb);
111
+ return () => {
112
+ this.stateCbs = this.stateCbs.filter((c) => c !== cb);
113
+ };
114
+ }
115
+ onError(cb) {
116
+ this.errorCbs.push(cb);
117
+ return () => {
118
+ this.errorCbs = this.errorCbs.filter((c) => c !== cb);
119
+ };
120
+ }
121
+ // ── Private helpers ──
122
+ setState(s) {
123
+ if (this._state === s)
124
+ return;
125
+ this._state = s;
126
+ for (const cb of this.stateCbs)
127
+ cb(s);
128
+ }
129
+ emitTranscript(t) {
130
+ for (const cb of this.transcriptCbs)
131
+ cb(t);
132
+ }
133
+ emitError(e) {
134
+ for (const cb of this.errorCbs)
135
+ cb(e);
136
+ }
137
+ }
138
+ function mapErrorCode(error) {
139
+ switch (error) {
140
+ case 'not-allowed':
141
+ case 'service-not-allowed':
142
+ return 'not-allowed';
143
+ case 'no-speech':
144
+ return 'no-speech';
145
+ case 'network':
146
+ return 'network';
147
+ case 'aborted':
148
+ return 'aborted';
149
+ default:
150
+ return 'unknown';
151
+ }
152
+ }
153
+ //# sourceMappingURL=web-speech.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-speech.js","sourceRoot":"","sources":["../../../stt/providers/web-speech.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { STTProvider, STTProviderConfig, STTMode, STTState, STTTranscript, STTError } from '../types';
2
+ export declare class WhisperApiProvider implements STTProvider {
3
+ readonly type: "whisper-api";
4
+ readonly supportedModes: STTMode[];
5
+ private _state;
6
+ private apiKey;
7
+ private language;
8
+ private modelId;
9
+ private transcriptCbs;
10
+ private stateCbs;
11
+ private errorCbs;
12
+ get state(): STTState;
13
+ init(config: STTProviderConfig): Promise<void>;
14
+ start(): void;
15
+ stop(): void;
16
+ abort(): void;
17
+ dispose(): void;
18
+ transcribe(audio: Float32Array, sampleRate: number): Promise<STTTranscript>;
19
+ onTranscript(cb: (t: STTTranscript) => void): () => void;
20
+ onStateChange(cb: (s: STTState) => void): () => void;
21
+ onError(cb: (e: STTError) => void): () => void;
22
+ private setState;
23
+ private emitTranscript;
24
+ private emitError;
25
+ }
26
+ //# sourceMappingURL=whisper-api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whisper-api.d.ts","sourceRoot":"","sources":["../../../stt/providers/whisper-api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,iBAAiB,EACjB,OAAO,EACP,QAAQ,EACR,aAAa,EACb,QAAQ,EACT,MAAM,UAAU,CAAC;AAKlB,qBAAa,kBAAmB,YAAW,WAAW;IACpD,QAAQ,CAAC,IAAI,gBAA0B;IACvC,QAAQ,CAAC,cAAc,EAAE,OAAO,EAAE,CAAa;IAE/C,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,OAAO,CAAe;IAE9B,OAAO,CAAC,aAAa,CAAyC;IAC9D,OAAO,CAAC,QAAQ,CAAoC;IACpD,OAAO,CAAC,QAAQ,CAAoC;IAEpD,IAAI,KAAK,IAAI,QAAQ,CAEpB;IAEK,IAAI,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAYpD,KAAK,IAAI,IAAI;IAIb,IAAI,IAAI,IAAI;IAIZ,KAAK,IAAI,IAAI;IAIb,OAAO,IAAI,IAAI;IAOT,UAAU,CAAC,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAuDjF,YAAY,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,GAAG,MAAM,IAAI;IAKxD,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,KAAK,IAAI,GAAG,MAAM,IAAI;IAKpD,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,KAAK,IAAI,GAAG,MAAM,IAAI;IAO9C,OAAO,CAAC,QAAQ;IAMhB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,SAAS;CAGlB"}
@@ -0,0 +1,120 @@
1
+ import { float32ToWav } from '../audio/pcm-utils';
2
+ const WHISPER_API_URL = 'https://api.openai.com/v1/audio/transcriptions';
3
+ export class WhisperApiProvider {
4
+ constructor() {
5
+ this.type = 'whisper-api';
6
+ this.supportedModes = ['batch'];
7
+ this._state = 'idle';
8
+ this.apiKey = '';
9
+ this.language = 'en';
10
+ this.modelId = 'whisper-1';
11
+ this.transcriptCbs = [];
12
+ this.stateCbs = [];
13
+ this.errorCbs = [];
14
+ }
15
+ get state() {
16
+ return this._state;
17
+ }
18
+ async init(config) {
19
+ this.apiKey = config.apiKey ?? '';
20
+ this.language = config.language ?? 'en';
21
+ this.modelId = config.modelId ?? 'whisper-1';
22
+ if (!this.apiKey) {
23
+ const err = { code: 'not-allowed', message: 'API key is required', provider: this.type };
24
+ this.emitError(err);
25
+ throw new Error(err.message);
26
+ }
27
+ }
28
+ start() {
29
+ // Batch mode — no-op; audio is fed via transcribe()
30
+ }
31
+ stop() {
32
+ this.setState('idle');
33
+ }
34
+ abort() {
35
+ this.setState('idle');
36
+ }
37
+ dispose() {
38
+ this.transcriptCbs = [];
39
+ this.stateCbs = [];
40
+ this.errorCbs = [];
41
+ this.setState('idle');
42
+ }
43
+ async transcribe(audio, sampleRate) {
44
+ this.setState('processing');
45
+ try {
46
+ const wavBlob = float32ToWav(audio, sampleRate);
47
+ const formData = new FormData();
48
+ formData.append('file', wavBlob, 'audio.wav');
49
+ formData.append('model', this.modelId);
50
+ formData.append('language', this.language);
51
+ const response = await fetch(WHISPER_API_URL, {
52
+ method: 'POST',
53
+ headers: {
54
+ Authorization: `Bearer ${this.apiKey}`,
55
+ },
56
+ body: formData,
57
+ });
58
+ if (!response.ok) {
59
+ const code = response.status === 401 ? 'not-allowed' : 'network';
60
+ const message = `Whisper API error: ${response.status} ${response.statusText}`;
61
+ const err = { code, message, provider: this.type };
62
+ this.emitError(err);
63
+ this.setState('error');
64
+ throw new Error(message);
65
+ }
66
+ const json = (await response.json());
67
+ const transcript = {
68
+ text: json.text,
69
+ isFinal: true,
70
+ confidence: 1,
71
+ timestamp: Date.now(),
72
+ };
73
+ this.emitTranscript(transcript);
74
+ this.setState('idle');
75
+ return transcript;
76
+ }
77
+ catch (err) {
78
+ // If already handled (HTTP error), just rethrow
79
+ if (this._state === 'error')
80
+ throw err;
81
+ const sttError = {
82
+ code: 'network',
83
+ message: err?.message ?? 'Network error',
84
+ provider: this.type,
85
+ };
86
+ this.emitError(sttError);
87
+ this.setState('error');
88
+ throw err;
89
+ }
90
+ }
91
+ onTranscript(cb) {
92
+ this.transcriptCbs.push(cb);
93
+ return () => { this.transcriptCbs = this.transcriptCbs.filter((c) => c !== cb); };
94
+ }
95
+ onStateChange(cb) {
96
+ this.stateCbs.push(cb);
97
+ return () => { this.stateCbs = this.stateCbs.filter((c) => c !== cb); };
98
+ }
99
+ onError(cb) {
100
+ this.errorCbs.push(cb);
101
+ return () => { this.errorCbs = this.errorCbs.filter((c) => c !== cb); };
102
+ }
103
+ // ── Private ──
104
+ setState(s) {
105
+ if (this._state === s)
106
+ return;
107
+ this._state = s;
108
+ for (const cb of this.stateCbs)
109
+ cb(s);
110
+ }
111
+ emitTranscript(t) {
112
+ for (const cb of this.transcriptCbs)
113
+ cb(t);
114
+ }
115
+ emitError(e) {
116
+ for (const cb of this.errorCbs)
117
+ cb(e);
118
+ }
119
+ }
120
+ //# sourceMappingURL=whisper-api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whisper-api.js","sourceRoot":"","sources":["../../../stt/providers/whisper-api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { STTProvider, STTProviderConfig, STTMode, STTState, STTTranscript, STTError } from '../../types';
2
+ export declare class WhisperLocalProvider implements STTProvider {
3
+ readonly type: "whisper-local";
4
+ readonly supportedModes: STTMode[];
5
+ private _state;
6
+ private worker;
7
+ private config;
8
+ private ready;
9
+ private transcriptCbs;
10
+ private stateCbs;
11
+ private errorCbs;
12
+ private pendingResolve;
13
+ private pendingReject;
14
+ private initResolve;
15
+ private initReject;
16
+ get state(): STTState;
17
+ init(config: STTProviderConfig): Promise<void>;
18
+ start(): void;
19
+ stop(): void;
20
+ abort(): void;
21
+ dispose(): void;
22
+ transcribe(audio: Float32Array, sampleRate: number): Promise<STTTranscript>;
23
+ onTranscript(cb: (t: STTTranscript) => void): () => void;
24
+ onStateChange(cb: (s: STTState) => void): () => void;
25
+ onError(cb: (e: STTError) => void): () => void;
26
+ private handleWorkerMessage;
27
+ private setState;
28
+ private emitTranscript;
29
+ private emitError;
30
+ }
31
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../../stt/providers/whisper-local/provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,iBAAiB,EACjB,OAAO,EACP,QAAQ,EACR,aAAa,EACb,QAAQ,EACT,MAAM,aAAa,CAAC;AAkBrB,qBAAa,oBAAqB,YAAW,WAAW;IACtD,QAAQ,CAAC,IAAI,kBAA4B;IACzC,QAAQ,CAAC,cAAc,EAAE,OAAO,EAAE,CAAa;IAE/C,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,KAAK,CAAS;IAEtB,OAAO,CAAC,aAAa,CAAyC;IAC9D,OAAO,CAAC,QAAQ,CAAoC;IACpD,OAAO,CAAC,QAAQ,CAAoC;IAEpD,OAAO,CAAC,cAAc,CAA6C;IACnE,OAAO,CAAC,aAAa,CAAqC;IAC1D,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,UAAU,CAAqC;IAEvD,IAAI,KAAK,IAAI,QAAQ,CAEpB;IAEK,IAAI,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAsCpD,KAAK,IAAI,IAAI;IAOb,IAAI,IAAI,IAAI;IAMZ,KAAK,IAAI,IAAI;IASb,OAAO,IAAI,IAAI;IAYT,UAAU,CAAC,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAkBjF,YAAY,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,aAAa,KAAK,IAAI,GAAG,MAAM,IAAI;IAKxD,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,KAAK,IAAI,GAAG,MAAM,IAAI;IAKpD,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,KAAK,IAAI,GAAG,MAAM,IAAI;IAO9C,OAAO,CAAC,mBAAmB;IA0D3B,OAAO,CAAC,QAAQ;IAMhB,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,SAAS;CAGlB"}