@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.
- package/dist/Extensions/RunAnywhere+STT.d.ts +95 -0
- package/dist/Extensions/RunAnywhere+STT.d.ts.map +1 -0
- package/dist/Extensions/RunAnywhere+STT.js +413 -0
- package/dist/Extensions/RunAnywhere+STT.js.map +1 -0
- package/dist/Extensions/RunAnywhere+TTS.d.ts +55 -0
- package/dist/Extensions/RunAnywhere+TTS.d.ts.map +1 -0
- package/dist/Extensions/RunAnywhere+TTS.js +249 -0
- package/dist/Extensions/RunAnywhere+TTS.js.map +1 -0
- package/dist/Extensions/RunAnywhere+VAD.d.ts +70 -0
- package/dist/Extensions/RunAnywhere+VAD.d.ts.map +1 -0
- package/dist/Extensions/RunAnywhere+VAD.js +227 -0
- package/dist/Extensions/RunAnywhere+VAD.js.map +1 -0
- package/dist/Extensions/STTTypes.d.ts +53 -0
- package/dist/Extensions/STTTypes.d.ts.map +1 -0
- package/dist/Extensions/STTTypes.js +16 -0
- package/dist/Extensions/STTTypes.js.map +1 -0
- package/dist/Extensions/TTSTypes.d.ts +31 -0
- package/dist/Extensions/TTSTypes.d.ts.map +1 -0
- package/dist/Extensions/TTSTypes.js +3 -0
- package/dist/Extensions/TTSTypes.js.map +1 -0
- package/dist/Extensions/VADTypes.d.ts +30 -0
- package/dist/Extensions/VADTypes.d.ts.map +1 -0
- package/dist/Extensions/VADTypes.js +8 -0
- package/dist/Extensions/VADTypes.js.map +1 -0
- package/dist/Foundation/SherpaONNXBridge.d.ts +147 -0
- package/dist/Foundation/SherpaONNXBridge.d.ts.map +1 -0
- package/dist/Foundation/SherpaONNXBridge.js +344 -0
- package/dist/Foundation/SherpaONNXBridge.js.map +1 -0
- package/dist/Infrastructure/AudioCapture.d.ts +87 -0
- package/dist/Infrastructure/AudioCapture.d.ts.map +1 -0
- package/dist/Infrastructure/AudioCapture.js +231 -0
- package/dist/Infrastructure/AudioCapture.js.map +1 -0
- package/dist/Infrastructure/AudioPlayback.d.ts +53 -0
- package/dist/Infrastructure/AudioPlayback.d.ts.map +1 -0
- package/dist/Infrastructure/AudioPlayback.js +115 -0
- package/dist/Infrastructure/AudioPlayback.js.map +1 -0
- package/dist/ONNX.d.ts +18 -0
- package/dist/ONNX.d.ts.map +1 -0
- package/dist/ONNX.js +32 -0
- package/dist/ONNX.js.map +1 -0
- package/dist/ONNXProvider.d.ts +28 -0
- package/dist/ONNXProvider.d.ts.map +1 -0
- package/dist/ONNXProvider.js +366 -0
- package/dist/ONNXProvider.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/package.json +65 -0
- package/wasm/sherpa/sherpa-onnx-asr.js +1539 -0
- package/wasm/sherpa/sherpa-onnx-glue.js +2 -0
- package/wasm/sherpa/sherpa-onnx-tts.js +654 -0
- package/wasm/sherpa/sherpa-onnx-vad.js +327 -0
- package/wasm/sherpa/sherpa-onnx-wave.js +88 -0
- 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"}
|