@runanywhere/web-onnx 0.1.0-beta.5

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 (55) hide show
  1. package/dist/Extensions/RunAnywhere+STT.d.ts +95 -0
  2. package/dist/Extensions/RunAnywhere+STT.d.ts.map +1 -0
  3. package/dist/Extensions/RunAnywhere+STT.js +413 -0
  4. package/dist/Extensions/RunAnywhere+STT.js.map +1 -0
  5. package/dist/Extensions/RunAnywhere+TTS.d.ts +55 -0
  6. package/dist/Extensions/RunAnywhere+TTS.d.ts.map +1 -0
  7. package/dist/Extensions/RunAnywhere+TTS.js +249 -0
  8. package/dist/Extensions/RunAnywhere+TTS.js.map +1 -0
  9. package/dist/Extensions/RunAnywhere+VAD.d.ts +70 -0
  10. package/dist/Extensions/RunAnywhere+VAD.d.ts.map +1 -0
  11. package/dist/Extensions/RunAnywhere+VAD.js +227 -0
  12. package/dist/Extensions/RunAnywhere+VAD.js.map +1 -0
  13. package/dist/Extensions/STTTypes.d.ts +53 -0
  14. package/dist/Extensions/STTTypes.d.ts.map +1 -0
  15. package/dist/Extensions/STTTypes.js +16 -0
  16. package/dist/Extensions/STTTypes.js.map +1 -0
  17. package/dist/Extensions/TTSTypes.d.ts +31 -0
  18. package/dist/Extensions/TTSTypes.d.ts.map +1 -0
  19. package/dist/Extensions/TTSTypes.js +3 -0
  20. package/dist/Extensions/TTSTypes.js.map +1 -0
  21. package/dist/Extensions/VADTypes.d.ts +30 -0
  22. package/dist/Extensions/VADTypes.d.ts.map +1 -0
  23. package/dist/Extensions/VADTypes.js +8 -0
  24. package/dist/Extensions/VADTypes.js.map +1 -0
  25. package/dist/Foundation/SherpaONNXBridge.d.ts +147 -0
  26. package/dist/Foundation/SherpaONNXBridge.d.ts.map +1 -0
  27. package/dist/Foundation/SherpaONNXBridge.js +344 -0
  28. package/dist/Foundation/SherpaONNXBridge.js.map +1 -0
  29. package/dist/Infrastructure/AudioCapture.d.ts +87 -0
  30. package/dist/Infrastructure/AudioCapture.d.ts.map +1 -0
  31. package/dist/Infrastructure/AudioCapture.js +231 -0
  32. package/dist/Infrastructure/AudioCapture.js.map +1 -0
  33. package/dist/Infrastructure/AudioPlayback.d.ts +53 -0
  34. package/dist/Infrastructure/AudioPlayback.d.ts.map +1 -0
  35. package/dist/Infrastructure/AudioPlayback.js +115 -0
  36. package/dist/Infrastructure/AudioPlayback.js.map +1 -0
  37. package/dist/ONNX.d.ts +18 -0
  38. package/dist/ONNX.d.ts.map +1 -0
  39. package/dist/ONNX.js +32 -0
  40. package/dist/ONNX.js.map +1 -0
  41. package/dist/ONNXProvider.d.ts +28 -0
  42. package/dist/ONNXProvider.d.ts.map +1 -0
  43. package/dist/ONNXProvider.js +366 -0
  44. package/dist/ONNXProvider.js.map +1 -0
  45. package/dist/index.d.ts +35 -0
  46. package/dist/index.d.ts.map +1 -0
  47. package/dist/index.js +34 -0
  48. package/dist/index.js.map +1 -0
  49. package/package.json +65 -0
  50. package/wasm/sherpa/sherpa-onnx-asr.js +1539 -0
  51. package/wasm/sherpa/sherpa-onnx-glue.js +2 -0
  52. package/wasm/sherpa/sherpa-onnx-tts.js +654 -0
  53. package/wasm/sherpa/sherpa-onnx-vad.js +327 -0
  54. package/wasm/sherpa/sherpa-onnx-wave.js +88 -0
  55. package/wasm/sherpa/sherpa-onnx.wasm +0 -0
@@ -0,0 +1,95 @@
1
+ /**
2
+ * RunAnywhere Web SDK - Speech-to-Text Extension
3
+ *
4
+ * Adds STT (speech recognition) capabilities via sherpa-onnx WASM.
5
+ * Supports both offline (Whisper) and online (streaming Zipformer) models.
6
+ *
7
+ * Uses the sherpa-onnx C struct packing helpers from sherpa-onnx-asr.js
8
+ * to properly allocate config structs in WASM memory (NOT JSON strings).
9
+ *
10
+ * Mirrors: sdk/runanywhere-swift/Sources/RunAnywhere/Public/Extensions/STT/
11
+ *
12
+ * Usage:
13
+ * import { STT } from '@runanywhere/web';
14
+ *
15
+ * // Load model files (downloaded separately)
16
+ * await STT.loadModel({
17
+ * modelId: 'whisper-tiny-en',
18
+ * type: 'whisper',
19
+ * modelFiles: {
20
+ * encoder: '/models/whisper-tiny-en/encoder.onnx',
21
+ * decoder: '/models/whisper-tiny-en/decoder.onnx',
22
+ * tokens: '/models/whisper-tiny-en/tokens.txt',
23
+ * },
24
+ * });
25
+ *
26
+ * const result = await STT.transcribe(audioFloat32Array);
27
+ * console.log(result.text);
28
+ */
29
+ import { STTModelType } from './STTTypes';
30
+ import type { STTModelConfig, STTTranscriptionResult } from './STTTypes';
31
+ export { STTModelType } from './STTTypes';
32
+ export type { STTModelConfig, STTWhisperFiles, STTZipformerFiles, STTParaformerFiles, STTTranscriptionResult, STTWord } from './STTTypes';
33
+ export interface STTTranscribeOptions {
34
+ language?: string;
35
+ sampleRate?: number;
36
+ }
37
+ /** Callback for streaming STT partial results */
38
+ export type STTStreamCallback = (text: string, isFinal: boolean) => void;
39
+ declare class STTImpl {
40
+ readonly extensionName = "STT";
41
+ private _offlineRecognizerHandle;
42
+ private _onlineRecognizerHandle;
43
+ private _currentModelType;
44
+ private _currentModelId;
45
+ /** Returns the currently loaded STT model type. */
46
+ get currentModelType(): STTModelType;
47
+ /**
48
+ * Load an STT model via sherpa-onnx.
49
+ * Model files must already be written to sherpa-onnx virtual FS
50
+ * (use SherpaONNXBridge.shared.downloadAndWrite() or .writeFile()).
51
+ */
52
+ loadModel(config: STTModelConfig): Promise<void>;
53
+ /** Unload the STT model. */
54
+ unloadModel(): Promise<void>;
55
+ /** Check if an STT model is loaded. */
56
+ get isModelLoaded(): boolean;
57
+ /** Get the current model ID. */
58
+ get modelId(): string;
59
+ /**
60
+ * Transcribe audio data (offline / non-streaming).
61
+ *
62
+ * @param audioSamples - Float32Array of PCM audio samples (mono, 16kHz)
63
+ * @param options - Transcription options
64
+ * @returns Transcription result
65
+ */
66
+ transcribe(audioSamples: Float32Array, options?: STTTranscribeOptions): Promise<STTTranscriptionResult>;
67
+ /** Internal: Transcribe via online recognizer (for streaming models used non-streaming) */
68
+ _transcribeViaOnline(audioSamples: Float32Array, options?: STTTranscribeOptions): Promise<STTTranscriptionResult>;
69
+ /**
70
+ * Create a streaming transcription session.
71
+ * Returns an object to feed audio chunks and get results.
72
+ */
73
+ createStreamingSession(options?: STTTranscribeOptions): STTStreamingSession;
74
+ /** Clean up the STT resources. */
75
+ cleanup(): void;
76
+ }
77
+ export declare const STT: STTImpl;
78
+ /** Returns the currently loaded STT model type. */
79
+ export declare function getCurrentSTTModelType(): STTModelType;
80
+ export interface STTStreamingSession {
81
+ /** Feed audio samples to the recognizer */
82
+ acceptWaveform(samples: Float32Array, sampleRate?: number): void;
83
+ /** Signal end of audio input */
84
+ inputFinished(): void;
85
+ /** Get current partial/final result */
86
+ getResult(): {
87
+ text: string;
88
+ isEndpoint: boolean;
89
+ };
90
+ /** Reset after endpoint */
91
+ reset(): void;
92
+ /** Destroy the streaming session */
93
+ destroy(): void;
94
+ }
95
+ //# sourceMappingURL=RunAnywhere+STT.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RunAnywhere+STT.d.ts","sourceRoot":"","sources":["../../src/Extensions/RunAnywhere+STT.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,KAAK,EAAE,cAAc,EAA0D,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAejI,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1I,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,iDAAiD;AACjD,MAAM,MAAM,iBAAiB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;AA8HzE,cAAM,OAAO;IACX,QAAQ,CAAC,aAAa,SAAS;IAC/B,OAAO,CAAC,wBAAwB,CAAK;IACrC,OAAO,CAAC,uBAAuB,CAAK;IACpC,OAAO,CAAC,iBAAiB,CAAsC;IAC/D,OAAO,CAAC,eAAe,CAAM;IAE7B,mDAAmD;IACnD,IAAI,gBAAgB,IAAI,YAAY,CAEnC;IAED;;;;OAIG;IACG,SAAS,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAyDtD,4BAA4B;IACtB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAKlC,uCAAuC;IACvC,IAAI,aAAa,IAAI,OAAO,CAE3B;IAED,gCAAgC;IAChC,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED;;;;;;OAMG;IACG,UAAU,CACd,YAAY,EAAE,YAAY,EAC1B,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,sBAAsB,CAAC;IA6DlC,2FAA2F;IACrF,oBAAoB,CACxB,YAAY,EAAE,YAAY,EAC1B,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,sBAAsB,CAAC;IAuClC;;;OAGG;IACH,sBAAsB,CAAC,OAAO,GAAE,oBAAyB,GAAG,mBAAmB;IAW/E,kCAAkC;IAClC,OAAO,IAAI,IAAI;CAkBhB;AAED,eAAO,MAAM,GAAG,SAAgB,CAAC;AAEjC,mDAAmD;AACnD,wBAAgB,sBAAsB,IAAI,YAAY,CAErD;AAMD,MAAM,WAAW,mBAAmB;IAClC,2CAA2C;IAC3C,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjE,gCAAgC;IAChC,aAAa,IAAI,IAAI,CAAC;IACtB,uCAAuC;IACvC,SAAS,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,OAAO,CAAA;KAAE,CAAC;IACnD,2BAA2B;IAC3B,KAAK,IAAI,IAAI,CAAC;IACd,oCAAoC;IACpC,OAAO,IAAI,IAAI,CAAC;CACjB"}
@@ -0,0 +1,413 @@
1
+ /**
2
+ * RunAnywhere Web SDK - Speech-to-Text Extension
3
+ *
4
+ * Adds STT (speech recognition) capabilities via sherpa-onnx WASM.
5
+ * Supports both offline (Whisper) and online (streaming Zipformer) models.
6
+ *
7
+ * Uses the sherpa-onnx C struct packing helpers from sherpa-onnx-asr.js
8
+ * to properly allocate config structs in WASM memory (NOT JSON strings).
9
+ *
10
+ * Mirrors: sdk/runanywhere-swift/Sources/RunAnywhere/Public/Extensions/STT/
11
+ *
12
+ * Usage:
13
+ * import { STT } from '@runanywhere/web';
14
+ *
15
+ * // Load model files (downloaded separately)
16
+ * await STT.loadModel({
17
+ * modelId: 'whisper-tiny-en',
18
+ * type: 'whisper',
19
+ * modelFiles: {
20
+ * encoder: '/models/whisper-tiny-en/encoder.onnx',
21
+ * decoder: '/models/whisper-tiny-en/decoder.onnx',
22
+ * tokens: '/models/whisper-tiny-en/tokens.txt',
23
+ * },
24
+ * });
25
+ *
26
+ * const result = await STT.transcribe(audioFloat32Array);
27
+ * console.log(result.text);
28
+ */
29
+ import { RunAnywhere, SDKError, SDKErrorCode, SDKLogger, EventBus, SDKEventType } from '@runanywhere/web';
30
+ import { SherpaONNXBridge } from '../Foundation/SherpaONNXBridge';
31
+ import { STTModelType } from './STTTypes';
32
+ // Import sherpa-onnx C struct packing helpers.
33
+ // These functions properly allocate and fill C structs in WASM memory
34
+ // for passing to the sherpa-onnx C API.
35
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
36
+ // @ts-ignore — JS helper file, no .d.ts available
37
+ import { initSherpaOnnxOfflineRecognizerConfig, initSherpaOnnxOnlineRecognizerConfig, freeConfig } from '../../wasm/sherpa/sherpa-onnx-asr.js';
38
+ const logger = new SDKLogger('STT');
39
+ // ---------------------------------------------------------------------------
40
+ // STT Types (re-exported from STTTypes.ts)
41
+ // ---------------------------------------------------------------------------
42
+ export { STTModelType } from './STTTypes';
43
+ // ---------------------------------------------------------------------------
44
+ // Config Builders (stateless helpers)
45
+ // ---------------------------------------------------------------------------
46
+ function requireSherpa() {
47
+ if (!RunAnywhere.isInitialized)
48
+ throw SDKError.notInitialized();
49
+ return SherpaONNXBridge.shared;
50
+ }
51
+ /**
52
+ * Build a sherpa-onnx offline recognizer config object suitable for
53
+ * `initSherpaOnnxOfflineRecognizerConfig()` from sherpa-onnx-asr.js.
54
+ *
55
+ * This returns a plain JS config object that the helper function will
56
+ * pack into a C struct in WASM memory.
57
+ */
58
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
59
+ function buildOfflineRecognizerConfig(config) {
60
+ const sampleRate = config.sampleRate ?? 16000;
61
+ const files = config.modelFiles;
62
+ // Base config with all model types empty (required for struct layout)
63
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
64
+ const modelConfig = {
65
+ transducer: { encoder: '', decoder: '', joiner: '' },
66
+ paraformer: { model: '' },
67
+ nemoCtc: { model: '' },
68
+ whisper: { encoder: '', decoder: '', language: '', task: '', tailPaddings: -1 },
69
+ tdnn: { model: '' },
70
+ senseVoice: { model: '', language: '', useInverseTextNormalization: 0 },
71
+ moonshine: { preprocessor: '', encoder: '', uncachedDecoder: '', cachedDecoder: '' },
72
+ fireRedAsr: { encoder: '', decoder: '' },
73
+ dolphin: { model: '' },
74
+ zipformerCtc: { model: '' },
75
+ canary: { encoder: '', decoder: '', srcLang: '', tgtLang: '', usePnc: 1 },
76
+ wenetCtc: { model: '' },
77
+ omnilingual: { model: '' },
78
+ tokens: '',
79
+ numThreads: 1,
80
+ provider: 'cpu',
81
+ debug: 0,
82
+ modelType: '',
83
+ modelingUnit: '',
84
+ bpeVocab: '',
85
+ teleSpeechCtc: '',
86
+ };
87
+ if (config.type === STTModelType.Whisper) {
88
+ const f = files;
89
+ modelConfig.whisper = {
90
+ encoder: f.encoder,
91
+ decoder: f.decoder,
92
+ language: config.language ?? 'en',
93
+ task: 'transcribe',
94
+ tailPaddings: -1,
95
+ };
96
+ modelConfig.tokens = f.tokens;
97
+ }
98
+ else if (config.type === STTModelType.Paraformer) {
99
+ const f = files;
100
+ modelConfig.paraformer = { model: f.model };
101
+ modelConfig.tokens = f.tokens;
102
+ }
103
+ return {
104
+ featConfig: { sampleRate, featureDim: 80 },
105
+ modelConfig,
106
+ lmConfig: { model: '', scale: 1.0 },
107
+ decodingMethod: 'greedy_search',
108
+ maxActivePaths: 4,
109
+ hotwordsFile: '',
110
+ hotwordsScore: 1.5,
111
+ ruleFsts: '',
112
+ ruleFars: '',
113
+ blankPenalty: 0,
114
+ };
115
+ }
116
+ /**
117
+ * Build a sherpa-onnx online recognizer config object suitable for
118
+ * `initSherpaOnnxOnlineRecognizerConfig()` from sherpa-onnx-asr.js.
119
+ */
120
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
121
+ function buildOnlineRecognizerConfig(config) {
122
+ const sampleRate = config.sampleRate ?? 16000;
123
+ const files = config.modelFiles;
124
+ return {
125
+ featConfig: { sampleRate, featureDim: 80 },
126
+ modelConfig: {
127
+ transducer: {
128
+ encoder: files.encoder,
129
+ decoder: files.decoder,
130
+ joiner: files.joiner,
131
+ },
132
+ paraformer: { encoder: '', decoder: '' },
133
+ zipformer2Ctc: { model: '' },
134
+ nemoCtc: { model: '' },
135
+ toneCtc: { model: '' },
136
+ tokens: files.tokens,
137
+ numThreads: 1,
138
+ provider: 'cpu',
139
+ debug: 0,
140
+ modelType: '',
141
+ modelingUnit: '',
142
+ bpeVocab: '',
143
+ },
144
+ decodingMethod: 'greedy_search',
145
+ maxActivePaths: 4,
146
+ enableEndpoint: 1,
147
+ rule1MinTrailingSilence: 2.4,
148
+ rule2MinTrailingSilence: 1.2,
149
+ rule3MinUtteranceLength: 20,
150
+ hotwordsFile: '',
151
+ hotwordsScore: 1.5,
152
+ ctcFstDecoderConfig: { graph: '', maxActive: 3000 },
153
+ ruleFsts: '',
154
+ ruleFars: '',
155
+ };
156
+ }
157
+ // ---------------------------------------------------------------------------
158
+ // STT Extension
159
+ // ---------------------------------------------------------------------------
160
+ class STTImpl {
161
+ extensionName = 'STT';
162
+ _offlineRecognizerHandle = 0;
163
+ _onlineRecognizerHandle = 0;
164
+ _currentModelType = STTModelType.Whisper;
165
+ _currentModelId = '';
166
+ /** Returns the currently loaded STT model type. */
167
+ get currentModelType() {
168
+ return this._currentModelType;
169
+ }
170
+ /**
171
+ * Load an STT model via sherpa-onnx.
172
+ * Model files must already be written to sherpa-onnx virtual FS
173
+ * (use SherpaONNXBridge.shared.downloadAndWrite() or .writeFile()).
174
+ */
175
+ async loadModel(config) {
176
+ const sherpa = requireSherpa();
177
+ await sherpa.ensureLoaded();
178
+ const m = sherpa.module;
179
+ // Clean up previous model
180
+ this.cleanup();
181
+ logger.info(`Loading STT model: ${config.modelId} (${config.type})`);
182
+ EventBus.shared.emit('model.loadStarted', SDKEventType.Model, {
183
+ modelId: config.modelId, component: 'stt',
184
+ });
185
+ const startMs = performance.now();
186
+ try {
187
+ if (config.type === STTModelType.Zipformer) {
188
+ // Streaming model: use online recognizer
189
+ const configObj = buildOnlineRecognizerConfig(config);
190
+ const configStruct = initSherpaOnnxOnlineRecognizerConfig(configObj, m);
191
+ this._onlineRecognizerHandle = m._SherpaOnnxCreateOnlineRecognizer(configStruct.ptr);
192
+ freeConfig(configStruct, m);
193
+ if (this._onlineRecognizerHandle === 0) {
194
+ throw new SDKError(SDKErrorCode.ModelLoadFailed, `Failed to create online recognizer for ${config.modelId}`);
195
+ }
196
+ }
197
+ else {
198
+ // Non-streaming model (Whisper, Paraformer): use offline recognizer
199
+ const configObj = buildOfflineRecognizerConfig(config);
200
+ logger.debug(`Offline config: ${JSON.stringify(configObj.modelConfig.whisper)}`);
201
+ const configStruct = initSherpaOnnxOfflineRecognizerConfig(configObj, m);
202
+ this._offlineRecognizerHandle = m._SherpaOnnxCreateOfflineRecognizer(configStruct.ptr);
203
+ freeConfig(configStruct, m);
204
+ if (this._offlineRecognizerHandle === 0) {
205
+ throw new SDKError(SDKErrorCode.ModelLoadFailed, `Failed to create offline recognizer for ${config.modelId}`);
206
+ }
207
+ }
208
+ this._currentModelType = config.type;
209
+ this._currentModelId = config.modelId;
210
+ const loadTimeMs = Math.round(performance.now() - startMs);
211
+ logger.info(`STT model loaded: ${config.modelId} in ${loadTimeMs}ms`);
212
+ EventBus.shared.emit('model.loadCompleted', SDKEventType.Model, {
213
+ modelId: config.modelId, component: 'stt', loadTimeMs,
214
+ });
215
+ }
216
+ catch (error) {
217
+ this.cleanup();
218
+ throw error;
219
+ }
220
+ }
221
+ /** Unload the STT model. */
222
+ async unloadModel() {
223
+ this.cleanup();
224
+ logger.info('STT model unloaded');
225
+ }
226
+ /** Check if an STT model is loaded. */
227
+ get isModelLoaded() {
228
+ return this._offlineRecognizerHandle !== 0 || this._onlineRecognizerHandle !== 0;
229
+ }
230
+ /** Get the current model ID. */
231
+ get modelId() {
232
+ return this._currentModelId;
233
+ }
234
+ /**
235
+ * Transcribe audio data (offline / non-streaming).
236
+ *
237
+ * @param audioSamples - Float32Array of PCM audio samples (mono, 16kHz)
238
+ * @param options - Transcription options
239
+ * @returns Transcription result
240
+ */
241
+ async transcribe(audioSamples, options = {}) {
242
+ const sherpa = requireSherpa();
243
+ const m = sherpa.module;
244
+ if (this._offlineRecognizerHandle === 0) {
245
+ if (this._onlineRecognizerHandle !== 0) {
246
+ // Streaming model: process all at once via online recognizer
247
+ return this._transcribeViaOnline(audioSamples, options);
248
+ }
249
+ throw new SDKError(SDKErrorCode.ModelNotLoaded, 'No STT model loaded. Call loadModel() first.');
250
+ }
251
+ const startMs = performance.now();
252
+ const sampleRate = options.sampleRate ?? 16000;
253
+ logger.debug(`Transcribing ${audioSamples.length} samples (${(audioSamples.length / sampleRate).toFixed(1)}s)`);
254
+ // Create stream
255
+ const stream = m._SherpaOnnxCreateOfflineStream(this._offlineRecognizerHandle);
256
+ if (stream === 0) {
257
+ throw new SDKError(SDKErrorCode.GenerationFailed, 'Failed to create offline stream');
258
+ }
259
+ // Copy audio to WASM memory
260
+ const audioPtr = m._malloc(audioSamples.length * 4);
261
+ m.HEAPF32.set(audioSamples, audioPtr / 4);
262
+ try {
263
+ // Feed audio
264
+ m._SherpaOnnxAcceptWaveformOffline(stream, sampleRate, audioPtr, audioSamples.length);
265
+ // Decode
266
+ m._SherpaOnnxDecodeOfflineStream(this._offlineRecognizerHandle, stream);
267
+ // Get result as JSON
268
+ const jsonPtr = m._SherpaOnnxGetOfflineStreamResultAsJson(stream);
269
+ const jsonStr = sherpa.readString(jsonPtr);
270
+ m._SherpaOnnxDestroyOfflineStreamResultJson(jsonPtr);
271
+ const result = JSON.parse(jsonStr || '{}');
272
+ const processingTimeMs = Math.round(performance.now() - startMs);
273
+ const transcription = {
274
+ text: (result.text ?? '').trim(),
275
+ confidence: result.confidence ?? 0,
276
+ detectedLanguage: result.lang,
277
+ processingTimeMs,
278
+ };
279
+ EventBus.shared.emit('stt.transcribed', SDKEventType.Voice, {
280
+ text: transcription.text,
281
+ confidence: transcription.confidence,
282
+ });
283
+ return transcription;
284
+ }
285
+ finally {
286
+ m._free(audioPtr);
287
+ m._SherpaOnnxDestroyOfflineStream(stream);
288
+ }
289
+ }
290
+ /** Internal: Transcribe via online recognizer (for streaming models used non-streaming) */
291
+ async _transcribeViaOnline(audioSamples, options = {}) {
292
+ const m = SherpaONNXBridge.shared.module;
293
+ const startMs = performance.now();
294
+ const sampleRate = options.sampleRate ?? 16000;
295
+ const stream = m._SherpaOnnxCreateOnlineStream(this._onlineRecognizerHandle);
296
+ if (stream === 0) {
297
+ throw new SDKError(SDKErrorCode.GenerationFailed, 'Failed to create online stream');
298
+ }
299
+ const audioPtr = m._malloc(audioSamples.length * 4);
300
+ m.HEAPF32.set(audioSamples, audioPtr / 4);
301
+ try {
302
+ m._SherpaOnnxOnlineStreamAcceptWaveform(stream, sampleRate, audioPtr, audioSamples.length);
303
+ m._SherpaOnnxOnlineStreamInputFinished(stream);
304
+ while (m._SherpaOnnxIsOnlineStreamReady(this._onlineRecognizerHandle, stream)) {
305
+ m._SherpaOnnxDecodeOnlineStream(this._onlineRecognizerHandle, stream);
306
+ }
307
+ const jsonPtr = m._SherpaOnnxGetOnlineStreamResultAsJson(this._onlineRecognizerHandle, stream);
308
+ const jsonStr = SherpaONNXBridge.shared.readString(jsonPtr);
309
+ m._SherpaOnnxDestroyOnlineStreamResultJson(jsonPtr);
310
+ const result = JSON.parse(jsonStr || '{}');
311
+ const processingTimeMs = Math.round(performance.now() - startMs);
312
+ return {
313
+ text: (result.text ?? '').trim(),
314
+ confidence: result.confidence ?? 0,
315
+ processingTimeMs,
316
+ };
317
+ }
318
+ finally {
319
+ m._free(audioPtr);
320
+ m._SherpaOnnxDestroyOnlineStream(stream);
321
+ }
322
+ }
323
+ /**
324
+ * Create a streaming transcription session.
325
+ * Returns an object to feed audio chunks and get results.
326
+ */
327
+ createStreamingSession(options = {}) {
328
+ if (this._onlineRecognizerHandle === 0) {
329
+ throw new SDKError(SDKErrorCode.ModelNotLoaded, 'No streaming STT model loaded. Use a zipformer model.');
330
+ }
331
+ return new STTStreamingSessionImpl(this._onlineRecognizerHandle, options);
332
+ }
333
+ /** Clean up the STT resources. */
334
+ cleanup() {
335
+ const sherpa = SherpaONNXBridge.shared;
336
+ if (!sherpa.isLoaded)
337
+ return;
338
+ const m = sherpa.module;
339
+ if (this._offlineRecognizerHandle !== 0) {
340
+ try {
341
+ m._SherpaOnnxDestroyOfflineRecognizer(this._offlineRecognizerHandle);
342
+ }
343
+ catch { /* ignore */ }
344
+ this._offlineRecognizerHandle = 0;
345
+ }
346
+ if (this._onlineRecognizerHandle !== 0) {
347
+ try {
348
+ m._SherpaOnnxDestroyOnlineRecognizer(this._onlineRecognizerHandle);
349
+ }
350
+ catch { /* ignore */ }
351
+ this._onlineRecognizerHandle = 0;
352
+ }
353
+ this._currentModelId = '';
354
+ }
355
+ }
356
+ export const STT = new STTImpl();
357
+ /** Returns the currently loaded STT model type. */
358
+ export function getCurrentSTTModelType() {
359
+ return STT.currentModelType;
360
+ }
361
+ class STTStreamingSessionImpl {
362
+ _stream;
363
+ _recognizer;
364
+ _sampleRate;
365
+ constructor(recognizer, options) {
366
+ this._recognizer = recognizer;
367
+ this._sampleRate = options.sampleRate ?? 16000;
368
+ const m = SherpaONNXBridge.shared.module;
369
+ this._stream = m._SherpaOnnxCreateOnlineStream(recognizer);
370
+ if (this._stream === 0) {
371
+ throw new SDKError(SDKErrorCode.GenerationFailed, 'Failed to create streaming session');
372
+ }
373
+ }
374
+ acceptWaveform(samples, sampleRate) {
375
+ const m = SherpaONNXBridge.shared.module;
376
+ const audioPtr = m._malloc(samples.length * 4);
377
+ m.HEAPF32.set(samples, audioPtr / 4);
378
+ m._SherpaOnnxOnlineStreamAcceptWaveform(this._stream, sampleRate ?? this._sampleRate, audioPtr, samples.length);
379
+ m._free(audioPtr);
380
+ // Decode available frames
381
+ while (m._SherpaOnnxIsOnlineStreamReady(this._recognizer, this._stream)) {
382
+ m._SherpaOnnxDecodeOnlineStream(this._recognizer, this._stream);
383
+ }
384
+ }
385
+ inputFinished() {
386
+ SherpaONNXBridge.shared.module._SherpaOnnxOnlineStreamInputFinished(this._stream);
387
+ }
388
+ getResult() {
389
+ const m = SherpaONNXBridge.shared.module;
390
+ const jsonPtr = m._SherpaOnnxGetOnlineStreamResultAsJson(this._recognizer, this._stream);
391
+ const jsonStr = SherpaONNXBridge.shared.readString(jsonPtr);
392
+ m._SherpaOnnxDestroyOnlineStreamResultJson(jsonPtr);
393
+ const result = JSON.parse(jsonStr || '{}');
394
+ const isEndpoint = m._SherpaOnnxOnlineStreamIsEndpoint(this._recognizer, this._stream) !== 0;
395
+ return {
396
+ text: (result.text ?? '').trim(),
397
+ isEndpoint,
398
+ };
399
+ }
400
+ reset() {
401
+ SherpaONNXBridge.shared.module._SherpaOnnxOnlineStreamReset(this._recognizer, this._stream);
402
+ }
403
+ destroy() {
404
+ if (this._stream !== 0) {
405
+ try {
406
+ SherpaONNXBridge.shared.module._SherpaOnnxDestroyOnlineStream(this._stream);
407
+ }
408
+ catch { /* ignore */ }
409
+ this._stream = 0;
410
+ }
411
+ }
412
+ }
413
+ //# sourceMappingURL=RunAnywhere+STT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RunAnywhere+STT.js","sourceRoot":"","sources":["../../src/Extensions/RunAnywhere+STT.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * RunAnywhere Web SDK - Text-to-Speech Extension
3
+ *
4
+ * Adds TTS (speech synthesis) capabilities via sherpa-onnx WASM.
5
+ * Uses Piper/VITS ONNX models for offline, on-device speech synthesis.
6
+ *
7
+ * Mirrors: sdk/runanywhere-swift/Sources/RunAnywhere/Public/Extensions/TTS/
8
+ *
9
+ * Usage:
10
+ * import { TTS } from '@runanywhere/web';
11
+ *
12
+ * await TTS.loadVoice({
13
+ * voiceId: 'piper-en-amy',
14
+ * modelPath: '/models/tts/model.onnx',
15
+ * tokensPath: '/models/tts/tokens.txt',
16
+ * dataDir: '/models/tts/espeak-ng-data',
17
+ * });
18
+ *
19
+ * const result = await TTS.synthesize('Hello world');
20
+ * // result.audioData is Float32Array of PCM samples
21
+ */
22
+ import type { TTSVoiceConfig, TTSSynthesisResult, TTSSynthesizeOptions } from './TTSTypes';
23
+ export type { TTSVoiceConfig, TTSSynthesisResult, TTSSynthesizeOptions } from './TTSTypes';
24
+ declare class TTSImpl {
25
+ readonly extensionName = "TTS";
26
+ private _ttsHandle;
27
+ private _currentVoiceId;
28
+ /**
29
+ * Load a TTS voice model via sherpa-onnx.
30
+ * Model files must already be written to sherpa-onnx virtual FS.
31
+ */
32
+ loadVoice(config: TTSVoiceConfig): Promise<void>;
33
+ /** Unload the TTS voice. */
34
+ unloadVoice(): Promise<void>;
35
+ /** Check if a TTS voice is loaded. */
36
+ get isVoiceLoaded(): boolean;
37
+ /** Get current voice ID. */
38
+ get voiceId(): string;
39
+ /** Get the sample rate of the loaded TTS model. */
40
+ get sampleRate(): number;
41
+ /** Get the number of speakers in the loaded model. */
42
+ get numSpeakers(): number;
43
+ /**
44
+ * Synthesize speech from text.
45
+ *
46
+ * @param text - Text to synthesize
47
+ * @param options - Synthesis options (speaker ID, speed)
48
+ * @returns Synthesis result with PCM audio data
49
+ */
50
+ synthesize(text: string, options?: TTSSynthesizeOptions): Promise<TTSSynthesisResult>;
51
+ /** Clean up the TTS resources. */
52
+ cleanup(): void;
53
+ }
54
+ export declare const TTS: TTSImpl;
55
+ //# sourceMappingURL=RunAnywhere+TTS.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RunAnywhere+TTS.d.ts","sourceRoot":"","sources":["../../src/Extensions/RunAnywhere+TTS.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAE3F,YAAY,EAAE,cAAc,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAoB3F,cAAM,OAAO;IACX,QAAQ,CAAC,aAAa,SAAS;IAC/B,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,eAAe,CAAM;IAE7B;;;OAGG;IACG,SAAS,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IA6EtD,4BAA4B;IACtB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAKlC,sCAAsC;IACtC,IAAI,aAAa,IAAI,OAAO,CAE3B;IAED,4BAA4B;IAC5B,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED,mDAAmD;IACnD,IAAI,UAAU,IAAI,MAAM,CAGvB;IAED,sDAAsD;IACtD,IAAI,WAAW,IAAI,MAAM,CAGxB;IAED;;;;;;OAMG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAsG/F,kCAAkC;IAClC,OAAO,IAAI,IAAI;CAShB;AAED,eAAO,MAAM,GAAG,SAAgB,CAAC"}