even-toolkit 1.1.2 → 1.3.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 (82) hide show
  1. package/README.md +74 -0
  2. package/dist/glasses/bridge.d.ts +5 -2
  3. package/dist/glasses/bridge.d.ts.map +1 -1
  4. package/dist/glasses/bridge.js +25 -2
  5. package/dist/glasses/bridge.js.map +1 -1
  6. package/dist/glasses/composer.js +2 -2
  7. package/dist/glasses/layout.d.ts +2 -0
  8. package/dist/glasses/layout.d.ts.map +1 -1
  9. package/dist/glasses/layout.js +4 -0
  10. package/dist/glasses/layout.js.map +1 -1
  11. package/dist/glasses/types.d.ts +23 -0
  12. package/dist/glasses/types.d.ts.map +1 -1
  13. package/dist/glasses/types.js +15 -0
  14. package/dist/glasses/types.js.map +1 -1
  15. package/dist/glasses/useGlasses.d.ts.map +1 -1
  16. package/dist/glasses/useGlasses.js +17 -4
  17. package/dist/glasses/useGlasses.js.map +1 -1
  18. package/dist/stt/debug.d.ts +8 -0
  19. package/dist/stt/debug.d.ts.map +1 -0
  20. package/dist/stt/debug.js +34 -0
  21. package/dist/stt/debug.js.map +1 -0
  22. package/dist/stt/engine.d.ts +9 -6
  23. package/dist/stt/engine.d.ts.map +1 -1
  24. package/dist/stt/engine.js +141 -75
  25. package/dist/stt/engine.js.map +1 -1
  26. package/dist/stt/index.d.ts +1 -0
  27. package/dist/stt/index.d.ts.map +1 -1
  28. package/dist/stt/index.js +1 -0
  29. package/dist/stt/index.js.map +1 -1
  30. package/dist/stt/providers/deepgram.d.ts +1 -1
  31. package/dist/stt/providers/deepgram.d.ts.map +1 -1
  32. package/dist/stt/providers/deepgram.js +24 -9
  33. package/dist/stt/providers/deepgram.js.map +1 -1
  34. package/dist/stt/providers/whisper-api.d.ts.map +1 -1
  35. package/dist/stt/providers/whisper-api.js +75 -4
  36. package/dist/stt/providers/whisper-api.js.map +1 -1
  37. package/dist/stt/react/useSTT.d.ts.map +1 -1
  38. package/dist/stt/react/useSTT.js +44 -11
  39. package/dist/stt/react/useSTT.js.map +1 -1
  40. package/dist/stt/registry.d.ts.map +1 -1
  41. package/dist/stt/registry.js +0 -8
  42. package/dist/stt/registry.js.map +1 -1
  43. package/dist/stt/sources/glass-bridge.d.ts +8 -15
  44. package/dist/stt/sources/glass-bridge.d.ts.map +1 -1
  45. package/dist/stt/sources/glass-bridge.js +66 -9
  46. package/dist/stt/sources/glass-bridge.js.map +1 -1
  47. package/dist/stt/sources/microphone.d.ts.map +1 -1
  48. package/dist/stt/sources/microphone.js +4 -0
  49. package/dist/stt/sources/microphone.js.map +1 -1
  50. package/dist/stt/types.d.ts +7 -3
  51. package/dist/stt/types.d.ts.map +1 -1
  52. package/glasses/bridge.ts +24 -3
  53. package/glasses/composer.ts +2 -2
  54. package/glasses/layout.ts +6 -0
  55. package/glasses/types.ts +28 -0
  56. package/glasses/useGlasses.ts +18 -5
  57. package/package.json +7 -19
  58. package/stt/debug.ts +38 -0
  59. package/stt/engine.ts +158 -83
  60. package/stt/index.ts +1 -0
  61. package/stt/providers/deepgram.ts +26 -9
  62. package/stt/providers/whisper-api.ts +78 -4
  63. package/stt/react/useSTT.ts +45 -11
  64. package/stt/registry.ts +0 -8
  65. package/stt/sources/glass-bridge.ts +69 -25
  66. package/stt/sources/microphone.ts +7 -0
  67. package/stt/types.ts +4 -3
  68. package/dist/stt/providers/web-speech.d.ts +0 -25
  69. package/dist/stt/providers/web-speech.d.ts.map +0 -1
  70. package/dist/stt/providers/web-speech.js +0 -153
  71. package/dist/stt/providers/web-speech.js.map +0 -1
  72. package/dist/stt/providers/whisper-local/provider.d.ts +0 -31
  73. package/dist/stt/providers/whisper-local/provider.d.ts.map +0 -1
  74. package/dist/stt/providers/whisper-local/provider.js +0 -174
  75. package/dist/stt/providers/whisper-local/provider.js.map +0 -1
  76. package/dist/stt/providers/whisper-local/worker.d.ts +0 -2
  77. package/dist/stt/providers/whisper-local/worker.d.ts.map +0 -1
  78. package/dist/stt/providers/whisper-local/worker.js +0 -35
  79. package/dist/stt/providers/whisper-local/worker.js.map +0 -1
  80. package/stt/providers/web-speech.ts +0 -221
  81. package/stt/providers/whisper-local/provider.ts +0 -226
  82. package/stt/providers/whisper-local/worker.ts +0 -40
@@ -1,14 +1,15 @@
1
1
  import { createProvider } from './registry';
2
2
  import { MicrophoneSource } from './sources/microphone';
3
+ import { GlassBridgeSource } from './sources/glass-bridge';
3
4
  import { resample } from './audio/resample';
4
5
  import { createVAD } from './audio/vad';
5
6
  import { createAudioBuffer } from './audio/buffer';
7
+ import { sttLog } from './debug';
6
8
  /**
7
- * STTEngine orchestrates source -> processing -> provider.
9
+ * STTEngine orchestrates audio source -> processing -> provider.
8
10
  *
9
- * For `web-speech` provider: skips audio source (it handles its own mic).
10
- * For other providers: starts audio source, pipes through optional resample
11
- * and VAD, buffers audio, and calls provider.transcribe() on speech end.
11
+ * Batch providers (whisper-api): record audio, then transcribe on stop.
12
+ * Streaming providers (deepgram): pipe audio in real-time via sendAudio.
12
13
  */
13
14
  export class STTEngine {
14
15
  constructor(config) {
@@ -20,11 +21,12 @@ export class STTEngine {
20
21
  this.errorListeners = [];
21
22
  this.providerUnsubs = [];
22
23
  this.vad = null;
23
- this.buffer = null;
24
+ this.chunkBuffer = null;
25
+ this.stopped = false;
24
26
  this.config = config;
25
27
  this.targetSampleRate = config.sampleRate ?? 16000;
26
28
  }
27
- // ── Event subscriptions ──
29
+ // -- Event subscriptions --
28
30
  onTranscript(cb) {
29
31
  this.transcriptListeners.push(cb);
30
32
  return () => {
@@ -50,23 +52,33 @@ export class STTEngine {
50
52
  };
51
53
  }
52
54
  emitTranscript(t) {
55
+ sttLog('transcript:', t.isFinal ? 'FINAL' : 'interim', `"${t.text}"`);
53
56
  for (const cb of this.transcriptListeners)
54
57
  cb(t);
55
58
  }
56
59
  emitState(s) {
60
+ sttLog('state ->', s);
57
61
  for (const cb of this.stateListeners)
58
62
  cb(s);
59
63
  }
60
64
  emitError(e) {
65
+ sttLog('ERROR:', e.code, e.message);
61
66
  for (const cb of this.errorListeners)
62
67
  cb(e);
63
68
  }
64
- // ── Lifecycle ──
69
+ // -- Lifecycle --
65
70
  async start() {
71
+ sttLog('engine.start()', 'provider:', this.config.provider, 'source:', this.config.source ?? 'auto');
72
+ this.stopped = false;
73
+ // Reuse existing provider if already initialized
74
+ if (this.provider) {
75
+ sttLog('engine: reusing provider');
76
+ return this.startAudioPipeline();
77
+ }
66
78
  this.emitState('loading');
67
79
  try {
68
- // Create and init provider
69
80
  this.provider = await createProvider(this.config.provider);
81
+ sttLog('provider created:', this.provider.type, 'modes:', this.provider.supportedModes);
70
82
  this.subscribeProvider(this.provider);
71
83
  await this.provider.init({
72
84
  language: this.config.language,
@@ -78,31 +90,11 @@ export class STTEngine {
78
90
  vadSilenceMs: typeof this.config.vad === 'object' ? this.config.vad.silenceMs : undefined,
79
91
  sampleRate: this.targetSampleRate,
80
92
  });
81
- // web-speech handles its own microphone
82
- if (this.config.provider === 'web-speech') {
83
- this.provider.start();
84
- return;
85
- }
86
- // Set up audio source
87
- this.source = this.resolveSource();
88
- await this.source.start();
89
- // Set up VAD if enabled
90
- if (this.config.vad) {
91
- const vadConfig = typeof this.config.vad === 'object' ? {
92
- silenceThresholdMs: this.config.vad.silenceMs,
93
- speechThresholdDb: this.config.vad.thresholdDb,
94
- } : undefined;
95
- this.vad = createVAD(vadConfig);
96
- }
97
- // Set up audio buffer for batch mode
98
- this.buffer = createAudioBuffer({ sampleRate: this.targetSampleRate });
99
- // Wire audio pipeline
100
- this.sourceUnsub = this.source.onAudioData((pcm, sampleRate) => {
101
- this.processAudio(pcm, sampleRate);
102
- });
103
- this.provider.start();
93
+ sttLog('provider.init() done');
94
+ await this.startAudioPipeline();
104
95
  }
105
96
  catch (err) {
97
+ sttLog('engine.start() FAILED:', err);
106
98
  const error = {
107
99
  code: 'unknown',
108
100
  message: err instanceof Error ? err.message : String(err),
@@ -110,27 +102,70 @@ export class STTEngine {
110
102
  };
111
103
  this.emitError(error);
112
104
  this.emitState('error');
113
- // Attempt fallback
114
105
  if (this.config.fallback) {
115
106
  await this.switchToFallback();
116
107
  }
117
108
  }
118
109
  }
110
+ /** Set up audio source + wire to provider. Reusable for restart. */
111
+ async startAudioPipeline() {
112
+ if (!this.provider)
113
+ throw new Error('No provider');
114
+ // Streaming providers -- pipe audio via sendAudio
115
+ if ('sendAudio' in this.provider) {
116
+ this.source = this.resolveSource();
117
+ sttLog('streaming + sendAudio: source =', this.source.constructor.name);
118
+ await this.source.start();
119
+ const provider = this.provider;
120
+ this.sourceUnsub = this.source.onAudioData((pcm, sampleRate) => {
121
+ const samples = sampleRate !== this.targetSampleRate
122
+ ? resample(pcm, sampleRate, this.targetSampleRate)
123
+ : pcm;
124
+ provider.sendAudio(samples);
125
+ });
126
+ this.emitState('listening');
127
+ this.provider.start();
128
+ sttLog('streaming provider started');
129
+ return;
130
+ }
131
+ // Batch providers: set up audio pipeline
132
+ this.source = this.resolveSource();
133
+ sttLog('audio source resolved:', this.source.constructor.name);
134
+ await this.source.start();
135
+ const vadConfig = typeof this.config.vad === 'object' ? {
136
+ silenceThresholdMs: this.config.vad.silenceMs ?? 2500,
137
+ speechThresholdDb: this.config.vad.thresholdDb,
138
+ } : { silenceThresholdMs: 2500 };
139
+ this.vad = createVAD(vadConfig);
140
+ this.chunkBuffer = createAudioBuffer({ sampleRate: this.targetSampleRate, maxSeconds: 120 });
141
+ this.sourceUnsub = this.source.onAudioData((pcm, sampleRate) => {
142
+ this.processAudio(pcm, sampleRate);
143
+ });
144
+ this.emitState('listening');
145
+ this.provider.start();
146
+ sttLog('engine listening');
147
+ }
119
148
  stop() {
120
- this.provider?.stop();
149
+ if (this.stopped)
150
+ return;
151
+ this.stopped = true;
152
+ sttLog('engine.stop()');
121
153
  this.sourceUnsub?.();
122
154
  this.sourceUnsub = null;
123
155
  this.source?.stop();
156
+ this.provider?.stop();
124
157
  this.vad?.reset();
125
- this.buffer?.clear();
158
+ this.transcribeFullBuffer();
126
159
  }
127
160
  abort() {
161
+ this.stopped = true;
162
+ sttLog('engine.abort()');
128
163
  this.provider?.abort();
129
164
  this.sourceUnsub?.();
130
165
  this.sourceUnsub = null;
131
166
  this.source?.stop();
132
167
  this.vad?.reset();
133
- this.buffer?.clear();
168
+ this.chunkBuffer?.clear();
134
169
  }
135
170
  dispose() {
136
171
  this.abort();
@@ -145,65 +180,97 @@ export class STTEngine {
145
180
  this.stateListeners.length = 0;
146
181
  this.errorListeners.length = 0;
147
182
  }
148
- // ── Internal ──
183
+ // -- Internal --
149
184
  resolveSource() {
150
185
  const src = this.config.source;
151
- if (!src || src === 'microphone') {
152
- return new MicrophoneSource();
186
+ // Explicit AudioSource object passed
187
+ if (src && typeof src === 'object') {
188
+ sttLog('resolveSource: using custom AudioSource object');
189
+ return src;
153
190
  }
191
+ // Explicit glass-bridge
154
192
  if (src === 'glass-bridge') {
155
- throw new Error('glass-bridge source requires a GlassBridgeSource instance. ' +
156
- 'Pass an AudioSource object directly via config.source.');
193
+ sttLog('resolveSource: explicit glass-bridge');
194
+ return new GlassBridgeSource();
195
+ }
196
+ // Auto-detect: if glasses bridge is available, prefer it
197
+ if (window.__evenBridge) {
198
+ sttLog('resolveSource: auto-detected __evenBridge -> using GlassBridgeSource');
199
+ return new GlassBridgeSource();
200
+ }
201
+ // Explicit microphone or fallback
202
+ if (!src || src === 'microphone') {
203
+ sttLog('resolveSource: using MicrophoneSource (browser mic)');
204
+ return new MicrophoneSource();
157
205
  }
158
- // Custom AudioSource instance
159
206
  return src;
160
207
  }
161
208
  processAudio(pcm, sampleRate) {
162
- // Resample if needed
163
- let samples = sampleRate !== this.targetSampleRate
209
+ if (this.stopped)
210
+ return;
211
+ const samples = sampleRate !== this.targetSampleRate
164
212
  ? resample(pcm, sampleRate, this.targetSampleRate)
165
213
  : pcm;
166
- if (!this.buffer)
167
- return;
168
- // If VAD is enabled, check for speech boundaries
214
+ this.chunkBuffer?.append(samples);
215
+ // VAD: detect speech end for auto-stop
169
216
  if (this.vad) {
170
217
  const result = this.vad.process(samples);
171
- if (result.isSpeech || result.speechEnded) {
172
- this.buffer.append(samples);
173
- }
174
- if (result.speechEnded) {
175
- this.flushBuffer();
218
+ if (result.speechEnded && !this.config.continuous) {
219
+ sttLog('VAD: speech ended -> auto-stop');
220
+ this.stop();
176
221
  }
177
222
  }
178
- else {
179
- // No VAD: accumulate everything, provider handles streaming
180
- this.buffer.append(samples);
181
- }
182
223
  }
183
- async flushBuffer() {
184
- if (!this.buffer || !this.provider)
224
+ /** On stop: transcribe the full recording buffer */
225
+ async transcribeFullBuffer() {
226
+ if (!this.provider?.transcribe || !this.chunkBuffer) {
227
+ this.emitState('idle');
185
228
  return;
186
- const audio = this.buffer.getAll();
187
- this.buffer.clear();
188
- if (audio.length === 0)
229
+ }
230
+ const audio = this.chunkBuffer.getAll();
231
+ this.chunkBuffer.clear();
232
+ this.chunkBuffer = null;
233
+ if (audio.length < this.targetSampleRate * 0.3) {
234
+ sttLog('audio too short, skipping');
235
+ this.emitState('idle');
189
236
  return;
190
- // If provider supports batch transcription
191
- if (this.provider.transcribe) {
192
- try {
193
- const transcript = await this.provider.transcribe(audio, this.targetSampleRate);
194
- this.emitTranscript(transcript);
195
- }
196
- catch (err) {
197
- this.emitError({
198
- code: 'unknown',
199
- message: err instanceof Error ? err.message : String(err),
200
- provider: this.config.provider,
237
+ }
238
+ this.emitState('processing');
239
+ sttLog('transcribing full buffer:', (audio.length / this.targetSampleRate).toFixed(1), 's,', (audio.byteLength / 1024).toFixed(0), 'KB');
240
+ try {
241
+ const result = await this.provider.transcribe(audio, this.targetSampleRate);
242
+ const text = result.text.trim();
243
+ sttLog('final result:', `"${text}"`);
244
+ if (text) {
245
+ this.emitTranscript({
246
+ text,
247
+ isFinal: true,
248
+ confidence: result.confidence,
249
+ timestamp: Date.now(),
201
250
  });
202
251
  }
203
252
  }
253
+ catch (err) {
254
+ this.emitError({
255
+ code: 'unknown',
256
+ message: err instanceof Error ? err.message : String(err),
257
+ provider: this.config.provider,
258
+ });
259
+ }
260
+ this.emitState('idle');
204
261
  }
205
262
  subscribeProvider(provider) {
206
- this.providerUnsubs.push(provider.onTranscript((t) => this.emitTranscript(t)), provider.onStateChange((s) => this.emitState(s)), provider.onError((e) => {
263
+ const isStreaming = provider.supportedModes.includes('streaming');
264
+ this.providerUnsubs.push(
265
+ // Forward transcripts from streaming providers (deepgram emits them directly)
266
+ // Batch providers (whisper-api) are handled by transcribeFullBuffer — don't double-emit
267
+ provider.onTranscript((t) => {
268
+ if (isStreaming)
269
+ this.emitTranscript(t);
270
+ }), provider.onStateChange((s) => {
271
+ if (isStreaming)
272
+ this.emitState(s);
273
+ }), provider.onError((e) => {
207
274
  this.emitError(e);
208
275
  if (this.config.fallback) {
209
276
  this.switchToFallback();
@@ -213,20 +280,19 @@ export class STTEngine {
213
280
  async switchToFallback() {
214
281
  if (!this.config.fallback)
215
282
  return;
216
- // Clean up current provider
283
+ sttLog('switching to fallback provider:', this.config.fallback);
217
284
  for (const unsub of this.providerUnsubs)
218
285
  unsub();
219
286
  this.providerUnsubs.length = 0;
220
287
  this.provider?.dispose();
221
288
  this.provider = null;
222
- // Switch to fallback
223
289
  const fallbackType = this.config.fallback;
224
290
  this.config = { ...this.config, provider: fallbackType, fallback: undefined };
225
291
  try {
226
292
  await this.start();
227
293
  }
228
294
  catch {
229
- // Fallback also failed — nothing more to do
295
+ // Fallback also failed
230
296
  }
231
297
  }
232
298
  }
@@ -1 +1 @@
1
- {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../stt/engine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../stt/engine.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC;;;;;GAKG;AAEH,MAAM,OAAO,SAAS;IAiBpB,YAAY,MAAuB;QAf3B,aAAQ,GAAuB,IAAI,CAAC;QACpC,WAAM,GAAuB,IAAI,CAAC;QAClC,gBAAW,GAAwB,IAAI,CAAC;QAExC,wBAAmB,GAAsC,EAAE,CAAC;QAC5D,mBAAc,GAAiC,EAAE,CAAC;QAClD,mBAAc,GAAiC,EAAE,CAAC;QAElD,mBAAc,GAAsB,EAAE,CAAC;QAEvC,QAAG,GAAwC,IAAI,CAAC;QAChD,gBAAW,GAAgD,IAAI,CAAC;QAEhE,YAAO,GAAG,KAAK,CAAC;QAGtB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,UAAU,IAAI,KAAK,CAAC;IACrD,CAAC;IAED,4BAA4B;IAE5B,YAAY,CAAC,EAA8B;QACzC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClC,OAAO,GAAG,EAAE;YACV,MAAM,GAAG,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACjD,IAAI,GAAG,IAAI,CAAC;gBAAE,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACxD,CAAC,CAAC;IACJ,CAAC;IAED,aAAa,CAAC,EAAyB;QACrC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7B,OAAO,GAAG,EAAE;YACV,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC5C,IAAI,GAAG,IAAI,CAAC;gBAAE,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACnD,CAAC,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,EAAyB;QAC/B,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7B,OAAO,GAAG,EAAE;YACV,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC5C,IAAI,GAAG,IAAI,CAAC;gBAAE,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACnD,CAAC,CAAC;IACJ,CAAC;IAEO,cAAc,CAAC,CAAgB;QACrC,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;QACtE,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,mBAAmB;YAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC;IAEO,SAAS,CAAC,CAAW;QAC3B,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QACtB,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,cAAc;YAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC;IAEO,SAAS,CAAC,CAAW;QAC3B,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;QACpC,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,cAAc;YAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC;IAED,kBAAkB;IAElB,KAAK,CAAC,KAAK;QACT,MAAM,CAAC,gBAAgB,EAAE,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,CAAC;QACrG,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QAErB,iDAAiD;QACjD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,CAAC,0BAA0B,CAAC,CAAC;YACnC,OAAO,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACnC,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAE1B,IAAI,CAAC;YACH,IAAI,CAAC,QAAQ,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC3D,MAAM,CAAC,mBAAmB,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;YACxF,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAEtC,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACvB,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAC9B,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;gBACtB,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;gBAC1B,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;gBAC5B,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;gBAClC,UAAU,EAAE,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG;gBACtF,YAAY,EAAE,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;gBACzF,UAAU,EAAE,IAAI,CAAC,gBAAgB;aAClC,CAAC,CAAC;YACH,MAAM,CAAC,sBAAsB,CAAC,CAAC;YAC/B,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAClC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC;YACtC,MAAM,KAAK,GAAa;gBACtB,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;gBACzD,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;aAC/B,CAAC;YACF,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YACtB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YAExB,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACzB,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAChC,CAAC;QACH,CAAC;IACH,CAAC;IAED,oEAAoE;IAC5D,KAAK,CAAC,kBAAkB;QAC9B,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;QAEnD,kDAAkD;QAClD,IAAI,WAAW,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACjC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;YACnC,MAAM,CAAC,iCAAiC,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YACxE,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAC1B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC/B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,EAAE,UAAU,EAAE,EAAE;gBAC7D,MAAM,OAAO,GAAG,UAAU,KAAK,IAAI,CAAC,gBAAgB;oBAClD,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,gBAAgB,CAAC;oBAClD,CAAC,CAAC,GAAG,CAAC;gBACP,QAAgB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YACvC,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YAC5B,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YACtB,MAAM,CAAC,4BAA4B,CAAC,CAAC;YACrC,OAAO;QACT,CAAC;QAED,yCAAyC;QACzC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACnC,MAAM,CAAC,wBAAwB,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC/D,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAE1B,MAAM,SAAS,GAAG,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC;YACtD,kBAAkB,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,IAAI,IAAI;YACrD,iBAAiB,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW;SAC/C,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC;QACjC,IAAI,CAAC,GAAG,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;QAChC,IAAI,CAAC,WAAW,GAAG,iBAAiB,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,gBAAgB,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;QAE7F,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,EAAE,UAAU,EAAE,EAAE;YAC7D,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAC5B,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACtB,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAC7B,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QACzB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,MAAM,CAAC,eAAe,CAAC,CAAC;QAExB,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACrB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;QACpB,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;QACtB,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC;QAElB,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC9B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,MAAM,CAAC,gBAAgB,CAAC,CAAC;QACzB,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC;QACvB,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACrB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;QACpB,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC;QAClB,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED,OAAO;QACL,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,cAAc;YAAE,KAAK,EAAE,CAAC;QACjD,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC;QACzB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,CAAC;QACpC,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC;IACjC,CAAC;IAED,iBAAiB;IAET,aAAa;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QAE/B,qCAAqC;QACrC,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YACnC,MAAM,CAAC,gDAAgD,CAAC,CAAC;YACzD,OAAO,GAAG,CAAC;QACb,CAAC;QAED,wBAAwB;QACxB,IAAI,GAAG,KAAK,cAAc,EAAE,CAAC;YAC3B,MAAM,CAAC,sCAAsC,CAAC,CAAC;YAC/C,OAAO,IAAI,iBAAiB,EAAE,CAAC;QACjC,CAAC;QAED,yDAAyD;QACzD,IAAK,MAAc,CAAC,YAAY,EAAE,CAAC;YACjC,MAAM,CAAC,sEAAsE,CAAC,CAAC;YAC/E,OAAO,IAAI,iBAAiB,EAAE,CAAC;QACjC,CAAC;QAED,kCAAkC;QAClC,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;YACjC,MAAM,CAAC,qDAAqD,CAAC,CAAC;YAC9D,OAAO,IAAI,gBAAgB,EAAE,CAAC;QAChC,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC;IAEO,YAAY,CAAC,GAAiB,EAAE,UAAkB;QACxD,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QAEzB,MAAM,OAAO,GAAG,UAAU,KAAK,IAAI,CAAC,gBAAgB;YAClD,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,gBAAgB,CAAC;YAClD,CAAC,CAAC,GAAG,CAAC;QAER,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QAElC,uCAAuC;QACvC,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACb,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACzC,IAAI,MAAM,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;gBAClD,MAAM,CAAC,gCAAgC,CAAC,CAAC;gBACzC,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAED,oDAAoD;IAC5C,KAAK,CAAC,oBAAoB;QAChC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACpD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACvB,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;QACxC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAExB,IAAI,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,gBAAgB,GAAG,GAAG,EAAE,CAAC;YAC/C,MAAM,CAAC,2BAA2B,CAAC,CAAC;YACpC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACvB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAC7B,MAAM,CAAC,2BAA2B,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAEzI,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAC5E,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAChC,MAAM,CAAC,eAAe,EAAE,IAAI,IAAI,GAAG,CAAC,CAAC;YAErC,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,CAAC,cAAc,CAAC;oBAClB,IAAI;oBACJ,OAAO,EAAE,IAAI;oBACb,UAAU,EAAE,MAAM,CAAC,UAAU;oBAC7B,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;iBACtB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,SAAS,CAAC;gBACb,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;gBACzD,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;aAC/B,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC;IAEO,iBAAiB,CAAC,QAAqB;QAC7C,MAAM,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAElE,IAAI,CAAC,cAAc,CAAC,IAAI;QACtB,8EAA8E;QAC9E,wFAAwF;QACxF,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE;YAC1B,IAAI,WAAW;gBAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;QAC1C,CAAC,CAAC,EACF,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,EAAE;YAC3B,IAAI,WAAW;gBAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC,CAAC,EACF,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACrB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAClB,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACzB,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,CAAC;QACH,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,gBAAgB;QAC5B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ;YAAE,OAAO;QAClC,MAAM,CAAC,iCAAiC,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAEhE,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,cAAc;YAAE,KAAK,EAAE,CAAC;QACjD,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC;QACzB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QAErB,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC1C,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;QAE9E,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,uBAAuB;QACzB,CAAC;IACH,CAAC;CACF"}
@@ -8,4 +8,5 @@ export * from './audio/pcm-utils';
8
8
  export * from './audio/resample';
9
9
  export * from './audio/vad';
10
10
  export { createAudioBuffer } from './audio/buffer';
11
+ export { sttLog } from './debug';
11
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../stt/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,cAAc,QAAQ,CAAC;AACvB,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../stt/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,cAAc,QAAQ,CAAC;AACvB,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC"}
package/dist/stt/index.js CHANGED
@@ -8,4 +8,5 @@ export * from './audio/pcm-utils';
8
8
  export * from './audio/resample';
9
9
  export * from './audio/vad';
10
10
  export { createAudioBuffer } from './audio/buffer';
11
+ export { sttLog } from './debug';
11
12
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../stt/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,cAAc,QAAQ,CAAC;AACvB,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../stt/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,cAAc,QAAQ,CAAC;AACvB,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC"}
@@ -13,7 +13,7 @@ export declare class DeepgramProvider implements STTProvider {
13
13
  get state(): STTState;
14
14
  init(config: STTProviderConfig): Promise<void>;
15
15
  start(): void;
16
- /** Send raw audio data (PCM Int16 or Float32 as ArrayBuffer) to the Deepgram stream. */
16
+ /** Send audio data to the Deepgram stream. Converts Float32 to Int16 (linear16). */
17
17
  sendAudio(data: ArrayBuffer | Int16Array | Float32Array): void;
18
18
  stop(): void;
19
19
  abort(): void;
@@ -1 +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"}
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;AAclB,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;IAmEb,oFAAoF;IACpF,SAAS,CAAC,IAAI,EAAE,WAAW,GAAG,UAAU,GAAG,YAAY,GAAG,IAAI;IAkB9D,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"}
@@ -1,3 +1,4 @@
1
+ import { sttLog } from '../debug';
1
2
  export class DeepgramProvider {
2
3
  constructor() {
3
4
  this.type = 'deepgram';
@@ -16,7 +17,7 @@ export class DeepgramProvider {
16
17
  }
17
18
  async init(config) {
18
19
  this.apiKey = config.apiKey ?? '';
19
- this.language = config.language ?? 'en';
20
+ this.language = (config.language ?? 'en').split('-')[0]; // Deepgram wants 'en' not 'en-US'
20
21
  this.modelId = config.modelId ?? 'nova-2';
21
22
  if (!this.apiKey) {
22
23
  const err = { code: 'not-allowed', message: 'Deepgram API key is required', provider: this.type };
@@ -39,19 +40,23 @@ export class DeepgramProvider {
39
40
  const url = `wss://api.deepgram.com/v1/listen?${params.toString()}`;
40
41
  this.ws = new WebSocket(url, ['token', this.apiKey]);
41
42
  this.ws.binaryType = 'arraybuffer';
43
+ sttLog('deepgram: connecting to', url.substring(0, 60) + '...');
42
44
  this.ws.onopen = () => {
45
+ sttLog('deepgram: connected');
43
46
  this.setState('listening');
44
47
  };
45
48
  this.ws.onmessage = (event) => {
46
49
  try {
47
50
  const data = JSON.parse(event.data);
48
51
  const alt = data.channel?.alternatives?.[0];
49
- if (!alt?.transcript)
52
+ const text = alt?.transcript ?? '';
53
+ if (!text)
50
54
  return;
55
+ sttLog('deepgram: got', data.is_final ? 'FINAL' : 'interim', `"${text}"`);
51
56
  const transcript = {
52
- text: alt.transcript,
57
+ text,
53
58
  isFinal: data.is_final ?? false,
54
- confidence: alt.confidence ?? 0,
59
+ confidence: alt?.confidence ?? 0,
55
60
  timestamp: Date.now(),
56
61
  };
57
62
  this.emitTranscript(transcript);
@@ -60,7 +65,8 @@ export class DeepgramProvider {
60
65
  // Non-JSON message, ignore
61
66
  }
62
67
  };
63
- this.ws.onerror = () => {
68
+ this.ws.onerror = (event) => {
69
+ sttLog('deepgram: WebSocket error', event);
64
70
  const err = {
65
71
  code: 'network',
66
72
  message: 'Deepgram WebSocket error',
@@ -76,16 +82,25 @@ export class DeepgramProvider {
76
82
  }
77
83
  };
78
84
  }
79
- /** Send raw audio data (PCM Int16 or Float32 as ArrayBuffer) to the Deepgram stream. */
85
+ /** Send audio data to the Deepgram stream. Converts Float32 to Int16 (linear16). */
80
86
  sendAudio(data) {
81
87
  if (!this.ws || this.ws.readyState !== WebSocket.OPEN)
82
88
  return;
83
- if (data instanceof ArrayBuffer) {
84
- this.ws.send(data);
89
+ if (data instanceof Float32Array) {
90
+ // Convert Float32 [-1, 1] to Int16 PCM (Deepgram expects linear16)
91
+ const int16 = new Int16Array(data.length);
92
+ for (let i = 0; i < data.length; i++) {
93
+ const s = Math.max(-1, Math.min(1, data[i]));
94
+ int16[i] = s < 0 ? s * 0x8000 : s * 0x7fff;
95
+ }
96
+ this.ws.send(int16.buffer);
85
97
  }
86
- else {
98
+ else if (data instanceof Int16Array) {
87
99
  this.ws.send(data.buffer);
88
100
  }
101
+ else {
102
+ this.ws.send(data);
103
+ }
89
104
  }
90
105
  stop() {
91
106
  if (this.ws && this.ws.readyState === WebSocket.OPEN) {
@@ -1 +1 @@
1
- {"version":3,"file":"deepgram.js","sourceRoot":"","sources":["../../../stt/providers/deepgram.ts"],"names":[],"mappings":"AAoBA,MAAM,OAAO,gBAAgB;IAA7B;QACW,SAAI,GAAG,UAAmB,CAAC;QAC3B,mBAAc,GAAc,CAAC,WAAW,CAAC,CAAC;QAE3C,WAAM,GAAa,MAAM,CAAC;QAC1B,WAAM,GAAG,EAAE,CAAC;QACZ,aAAQ,GAAG,IAAI,CAAC;QAChB,YAAO,GAAG,QAAQ,CAAC;QACnB,OAAE,GAAqB,IAAI,CAAC;QAE5B,kBAAa,GAAsC,EAAE,CAAC;QACtD,aAAQ,GAAiC,EAAE,CAAC;QAC5C,aAAQ,GAAiC,EAAE,CAAC;IAiJtD,CAAC;IA/IC,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAAyB;QAClC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;QAClC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC;QACxC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,QAAQ,CAAC;QAE1C,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,GAAG,GAAa,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,8BAA8B,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5G,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;YACjC,KAAK,EAAE,IAAI,CAAC,OAAO;YACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,eAAe,EAAE,MAAM;YACvB,SAAS,EAAE,MAAM;YACjB,QAAQ,EAAE,UAAU;YACpB,WAAW,EAAE,OAAO;SACrB,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,oCAAoC,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;QAEpE,IAAI,CAAC,EAAE,GAAG,IAAI,SAAS,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACrD,IAAI,CAAC,EAAE,CAAC,UAAU,GAAG,aAAa,CAAC;QAEnC,IAAI,CAAC,EAAE,CAAC,MAAM,GAAG,GAAG,EAAE;YACpB,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAC7B,CAAC,CAAC;QAEF,IAAI,CAAC,EAAE,CAAC,SAAS,GAAG,CAAC,KAAmB,EAAE,EAAE;YAC1C,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAc,CAAmB,CAAC;gBAChE,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC5C,IAAI,CAAC,GAAG,EAAE,UAAU;oBAAE,OAAO;gBAE7B,MAAM,UAAU,GAAkB;oBAChC,IAAI,EAAE,GAAG,CAAC,UAAU;oBACpB,OAAO,EAAE,IAAI,CAAC,QAAQ,IAAI,KAAK;oBAC/B,UAAU,EAAE,GAAG,CAAC,UAAU,IAAI,CAAC;oBAC/B,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;iBACtB,CAAC;gBACF,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;YAClC,CAAC;YAAC,MAAM,CAAC;gBACP,2BAA2B;YAC7B,CAAC;QACH,CAAC,CAAC;QAEF,IAAI,CAAC,EAAE,CAAC,OAAO,GAAG,GAAG,EAAE;YACrB,MAAM,GAAG,GAAa;gBACpB,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE,0BAA0B;gBACnC,QAAQ,EAAE,IAAI,CAAC,IAAI;aACpB,CAAC;YACF,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACpB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC,CAAC;QAEF,IAAI,CAAC,EAAE,CAAC,OAAO,GAAG,GAAG,EAAE;YACrB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;YACf,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;gBAChC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACxB,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;IAED,wFAAwF;IACxF,SAAS,CAAC,IAA6C;QACrD,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI;YAAE,OAAO;QAE9D,IAAI,IAAI,YAAY,WAAW,EAAE,CAAC;YAChC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YACrD,2CAA2C;YAC3C,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC;QACxD,CAAC;QACD,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,WAAW,EAAE,CAAC;IACrB,CAAC;IAED,OAAO;QACL,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;QACxB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACnB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;IACrB,CAAC;IAED,YAAY,CAAC,EAA8B;QACzC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5B,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACpF,CAAC;IAED,aAAa,CAAC,EAAyB;QACrC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACvB,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,OAAO,CAAC,EAAyB;QAC/B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACvB,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,gBAAgB;IAER,WAAW;QACjB,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,IAAI,CAAC;gBAAC,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;YAC/C,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;QACjB,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC;IAEO,QAAQ,CAAC,CAAW;QAC1B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAC9B,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAChB,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,QAAQ;YAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;IAEO,cAAc,CAAC,CAAgB;QACrC,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,aAAa;YAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC;IAEO,SAAS,CAAC,CAAW;QAC3B,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,QAAQ;YAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;CACF"}
1
+ {"version":3,"file":"deepgram.js","sourceRoot":"","sources":["../../../stt/providers/deepgram.ts"],"names":[],"mappings":"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"}
@@ -1 +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"}
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;AAgElB,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;IAsEjF,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"}
@@ -1,5 +1,62 @@
1
1
  import { float32ToWav } from '../audio/pcm-utils';
2
- const WHISPER_API_URL = 'https://api.openai.com/v1/audio/transcriptions';
2
+ import { sttLog } from '../debug';
3
+ // Use proxy path to avoid WebView fetch restrictions (CORS/upload limits)
4
+ // The proxy is configured in vite.config.ts: /__whisper → api.openai.com
5
+ const WHISPER_API_URL = '/__whisper/v1/audio/transcriptions';
6
+ // Whisper hallucinates these on silence/low audio — filter them out
7
+ const HALLUCINATION_PATTERNS = [
8
+ /sottotitoli/i,
9
+ /amara\.org/i,
10
+ /qtss/i,
11
+ /continua\./i,
12
+ /al prossimo episodio/i,
13
+ /prossimo episodio/i,
14
+ /alla prossima/i,
15
+ /a presto/i,
16
+ /thank you for watching/i,
17
+ /thanks for watching/i,
18
+ /please subscribe/i,
19
+ /see you next time/i,
20
+ /see you in the next/i,
21
+ /next episode/i,
22
+ /sous-titres/i,
23
+ /untertitel/i,
24
+ /subtítulos/i,
25
+ /bis zum nächsten/i,
26
+ /字幕/,
27
+ /you$/i,
28
+ /^\s*$/,
29
+ ];
30
+ /** Common phrases Whisper appends at the end of audio — strip them */
31
+ const TRAILING_HALLUCINATIONS = [
32
+ /\s*al prossimo episodio\.?\s*$/i,
33
+ /\s*alla prossima\.?\s*$/i,
34
+ /\s*a presto\.?\s*$/i,
35
+ /\s*grazie per la visione\.?\s*$/i,
36
+ /\s*thank you for watching\.?\s*$/i,
37
+ /\s*thanks for watching\.?\s*$/i,
38
+ /\s*see you next time\.?\s*$/i,
39
+ /\s*see you in the next episode\.?\s*$/i,
40
+ /\s*please subscribe\.?\s*$/i,
41
+ /\s*bis zum nächsten mal\.?\s*$/i,
42
+ ];
43
+ /** Check if text is just dots, punctuation, or too short to be real speech */
44
+ function isJunkTranscription(text) {
45
+ const cleaned = text.replace(/[\s.,!?;:…\-–—]+/g, '');
46
+ if (cleaned.length === 0)
47
+ return true;
48
+ if (cleaned.length < 2)
49
+ return true;
50
+ return HALLUCINATION_PATTERNS.some(p => p.test(text));
51
+ }
52
+ /** Strip trailing hallucination phrases from otherwise valid text */
53
+ function cleanTranscription(text) {
54
+ let result = text;
55
+ for (const pattern of TRAILING_HALLUCINATIONS) {
56
+ result = result.replace(pattern, '');
57
+ }
58
+ return result.trim();
59
+ }
3
60
  export class WhisperApiProvider {
4
61
  constructor() {
5
62
  this.type = 'whisper-api';
@@ -17,10 +74,10 @@ export class WhisperApiProvider {
17
74
  }
18
75
  async init(config) {
19
76
  this.apiKey = config.apiKey ?? '';
20
- this.language = config.language ?? 'en';
77
+ this.language = (config.language ?? 'en').split('-')[0];
21
78
  this.modelId = config.modelId ?? 'whisper-1';
22
79
  if (!this.apiKey) {
23
- const err = { code: 'not-allowed', message: 'API key is required', provider: this.type };
80
+ const err = { code: 'not-allowed', message: 'OpenAI API key required — set it in Settings', provider: this.type };
24
81
  this.emitError(err);
25
82
  throw new Error(err.message);
26
83
  }
@@ -44,6 +101,7 @@ export class WhisperApiProvider {
44
101
  this.setState('processing');
45
102
  try {
46
103
  const wavBlob = float32ToWav(audio, sampleRate);
104
+ sttLog('whisper-api: sending', (audio.length / sampleRate).toFixed(1), 's audio,', (wavBlob.size / 1024).toFixed(0), 'KB WAV');
47
105
  const formData = new FormData();
48
106
  formData.append('file', wavBlob, 'audio.wav');
49
107
  formData.append('model', this.modelId);
@@ -64,8 +122,21 @@ export class WhisperApiProvider {
64
122
  throw new Error(message);
65
123
  }
66
124
  const json = (await response.json());
125
+ // Filter and clean Whisper hallucinations
126
+ const rawText = json.text?.trim() ?? '';
127
+ const text = cleanTranscription(rawText);
128
+ if (isJunkTranscription(text)) {
129
+ const transcript = {
130
+ text: '',
131
+ isFinal: true,
132
+ confidence: 0,
133
+ timestamp: Date.now(),
134
+ };
135
+ this.setState('idle');
136
+ return transcript;
137
+ }
67
138
  const transcript = {
68
- text: json.text,
139
+ text,
69
140
  isFinal: true,
70
141
  confidence: 1,
71
142
  timestamp: Date.now(),