@runanywhere/web 0.1.0-beta.1
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/README.md +795 -0
- package/dist/Foundation/ErrorTypes.d.ts +61 -0
- package/dist/Foundation/ErrorTypes.d.ts.map +1 -0
- package/dist/Foundation/ErrorTypes.js +90 -0
- package/dist/Foundation/ErrorTypes.js.map +1 -0
- package/dist/Foundation/EventBus.d.ts +171 -0
- package/dist/Foundation/EventBus.d.ts.map +1 -0
- package/dist/Foundation/EventBus.js +113 -0
- package/dist/Foundation/EventBus.js.map +1 -0
- package/dist/Foundation/PlatformAdapter.d.ts +101 -0
- package/dist/Foundation/PlatformAdapter.d.ts.map +1 -0
- package/dist/Foundation/PlatformAdapter.js +417 -0
- package/dist/Foundation/PlatformAdapter.js.map +1 -0
- package/dist/Foundation/SDKLogger.d.ts +33 -0
- package/dist/Foundation/SDKLogger.d.ts.map +1 -0
- package/dist/Foundation/SDKLogger.js +82 -0
- package/dist/Foundation/SDKLogger.js.map +1 -0
- package/dist/Foundation/SherpaONNXBridge.d.ts +134 -0
- package/dist/Foundation/SherpaONNXBridge.d.ts.map +1 -0
- package/dist/Foundation/SherpaONNXBridge.js +332 -0
- package/dist/Foundation/SherpaONNXBridge.js.map +1 -0
- package/dist/Foundation/StructOffsets.d.ts +147 -0
- package/dist/Foundation/StructOffsets.d.ts.map +1 -0
- package/dist/Foundation/StructOffsets.js +161 -0
- package/dist/Foundation/StructOffsets.js.map +1 -0
- package/dist/Foundation/WASMBridge.d.ts +241 -0
- package/dist/Foundation/WASMBridge.d.ts.map +1 -0
- package/dist/Foundation/WASMBridge.js +393 -0
- package/dist/Foundation/WASMBridge.js.map +1 -0
- package/dist/Infrastructure/ArchiveUtility.d.ts +25 -0
- package/dist/Infrastructure/ArchiveUtility.d.ts.map +1 -0
- package/dist/Infrastructure/ArchiveUtility.js +139 -0
- package/dist/Infrastructure/ArchiveUtility.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 +117 -0
- package/dist/Infrastructure/AudioPlayback.js.map +1 -0
- package/dist/Infrastructure/DeviceCapabilities.d.ts +39 -0
- package/dist/Infrastructure/DeviceCapabilities.d.ts.map +1 -0
- package/dist/Infrastructure/DeviceCapabilities.js +111 -0
- package/dist/Infrastructure/DeviceCapabilities.js.map +1 -0
- package/dist/Infrastructure/ExtensionRegistry.d.ts +30 -0
- package/dist/Infrastructure/ExtensionRegistry.d.ts.map +1 -0
- package/dist/Infrastructure/ExtensionRegistry.js +41 -0
- package/dist/Infrastructure/ExtensionRegistry.js.map +1 -0
- package/dist/Infrastructure/ModelDownloader.d.ts +98 -0
- package/dist/Infrastructure/ModelDownloader.d.ts.map +1 -0
- package/dist/Infrastructure/ModelDownloader.js +431 -0
- package/dist/Infrastructure/ModelDownloader.js.map +1 -0
- package/dist/Infrastructure/ModelLoaderTypes.d.ts +34 -0
- package/dist/Infrastructure/ModelLoaderTypes.d.ts.map +1 -0
- package/dist/Infrastructure/ModelLoaderTypes.js +12 -0
- package/dist/Infrastructure/ModelLoaderTypes.js.map +1 -0
- package/dist/Infrastructure/ModelManager.d.ts +219 -0
- package/dist/Infrastructure/ModelManager.d.ts.map +1 -0
- package/dist/Infrastructure/ModelManager.js +885 -0
- package/dist/Infrastructure/ModelManager.js.map +1 -0
- package/dist/Infrastructure/ModelRegistry.d.ts +131 -0
- package/dist/Infrastructure/ModelRegistry.d.ts.map +1 -0
- package/dist/Infrastructure/ModelRegistry.js +122 -0
- package/dist/Infrastructure/ModelRegistry.js.map +1 -0
- package/dist/Infrastructure/OPFSStorage.d.ts +143 -0
- package/dist/Infrastructure/OPFSStorage.d.ts.map +1 -0
- package/dist/Infrastructure/OPFSStorage.js +330 -0
- package/dist/Infrastructure/OPFSStorage.js.map +1 -0
- package/dist/Infrastructure/VLMWorkerBridge.d.ts +211 -0
- package/dist/Infrastructure/VLMWorkerBridge.d.ts.map +1 -0
- package/dist/Infrastructure/VLMWorkerBridge.js +264 -0
- package/dist/Infrastructure/VLMWorkerBridge.js.map +1 -0
- package/dist/Infrastructure/VLMWorkerRuntime.d.ts +38 -0
- package/dist/Infrastructure/VLMWorkerRuntime.d.ts.map +1 -0
- package/dist/Infrastructure/VLMWorkerRuntime.js +503 -0
- package/dist/Infrastructure/VLMWorkerRuntime.js.map +1 -0
- package/dist/Infrastructure/VideoCapture.d.ts +118 -0
- package/dist/Infrastructure/VideoCapture.d.ts.map +1 -0
- package/dist/Infrastructure/VideoCapture.js +207 -0
- package/dist/Infrastructure/VideoCapture.js.map +1 -0
- package/dist/Public/Extensions/DiffusionTypes.d.ts +64 -0
- package/dist/Public/Extensions/DiffusionTypes.d.ts.map +1 -0
- package/dist/Public/Extensions/DiffusionTypes.js +28 -0
- package/dist/Public/Extensions/DiffusionTypes.js.map +1 -0
- package/dist/Public/Extensions/EmbeddingsTypes.d.ts +33 -0
- package/dist/Public/Extensions/EmbeddingsTypes.d.ts.map +1 -0
- package/dist/Public/Extensions/EmbeddingsTypes.js +13 -0
- package/dist/Public/Extensions/EmbeddingsTypes.js.map +1 -0
- package/dist/Public/Extensions/RunAnywhere+Diffusion.d.ts +44 -0
- package/dist/Public/Extensions/RunAnywhere+Diffusion.d.ts.map +1 -0
- package/dist/Public/Extensions/RunAnywhere+Diffusion.js +189 -0
- package/dist/Public/Extensions/RunAnywhere+Diffusion.js.map +1 -0
- package/dist/Public/Extensions/RunAnywhere+Embeddings.d.ts +56 -0
- package/dist/Public/Extensions/RunAnywhere+Embeddings.d.ts.map +1 -0
- package/dist/Public/Extensions/RunAnywhere+Embeddings.js +240 -0
- package/dist/Public/Extensions/RunAnywhere+Embeddings.js.map +1 -0
- package/dist/Public/Extensions/RunAnywhere+ModelManagement.d.ts +53 -0
- package/dist/Public/Extensions/RunAnywhere+ModelManagement.d.ts.map +1 -0
- package/dist/Public/Extensions/RunAnywhere+ModelManagement.js +153 -0
- package/dist/Public/Extensions/RunAnywhere+ModelManagement.js.map +1 -0
- package/dist/Public/Extensions/RunAnywhere+STT.d.ts +95 -0
- package/dist/Public/Extensions/RunAnywhere+STT.d.ts.map +1 -0
- package/dist/Public/Extensions/RunAnywhere+STT.js +417 -0
- package/dist/Public/Extensions/RunAnywhere+STT.js.map +1 -0
- package/dist/Public/Extensions/RunAnywhere+StructuredOutput.d.ts +69 -0
- package/dist/Public/Extensions/RunAnywhere+StructuredOutput.d.ts.map +1 -0
- package/dist/Public/Extensions/RunAnywhere+StructuredOutput.js +196 -0
- package/dist/Public/Extensions/RunAnywhere+StructuredOutput.js.map +1 -0
- package/dist/Public/Extensions/RunAnywhere+TTS.d.ts +55 -0
- package/dist/Public/Extensions/RunAnywhere+TTS.d.ts.map +1 -0
- package/dist/Public/Extensions/RunAnywhere+TTS.js +253 -0
- package/dist/Public/Extensions/RunAnywhere+TTS.js.map +1 -0
- package/dist/Public/Extensions/RunAnywhere+TextGeneration.d.ts +80 -0
- package/dist/Public/Extensions/RunAnywhere+TextGeneration.d.ts.map +1 -0
- package/dist/Public/Extensions/RunAnywhere+TextGeneration.js +436 -0
- package/dist/Public/Extensions/RunAnywhere+TextGeneration.js.map +1 -0
- package/dist/Public/Extensions/RunAnywhere+ToolCalling.d.ts +82 -0
- package/dist/Public/Extensions/RunAnywhere+ToolCalling.d.ts.map +1 -0
- package/dist/Public/Extensions/RunAnywhere+ToolCalling.js +576 -0
- package/dist/Public/Extensions/RunAnywhere+ToolCalling.js.map +1 -0
- package/dist/Public/Extensions/RunAnywhere+VAD.d.ts +70 -0
- package/dist/Public/Extensions/RunAnywhere+VAD.d.ts.map +1 -0
- package/dist/Public/Extensions/RunAnywhere+VAD.js +231 -0
- package/dist/Public/Extensions/RunAnywhere+VAD.js.map +1 -0
- package/dist/Public/Extensions/RunAnywhere+VLM.d.ts +58 -0
- package/dist/Public/Extensions/RunAnywhere+VLM.d.ts.map +1 -0
- package/dist/Public/Extensions/RunAnywhere+VLM.js +262 -0
- package/dist/Public/Extensions/RunAnywhere+VLM.js.map +1 -0
- package/dist/Public/Extensions/RunAnywhere+VoiceAgent.d.ts +49 -0
- package/dist/Public/Extensions/RunAnywhere+VoiceAgent.d.ts.map +1 -0
- package/dist/Public/Extensions/RunAnywhere+VoiceAgent.js +222 -0
- package/dist/Public/Extensions/RunAnywhere+VoiceAgent.js.map +1 -0
- package/dist/Public/Extensions/RunAnywhere+VoicePipeline.d.ts +63 -0
- package/dist/Public/Extensions/RunAnywhere+VoicePipeline.d.ts.map +1 -0
- package/dist/Public/Extensions/RunAnywhere+VoicePipeline.js +168 -0
- package/dist/Public/Extensions/RunAnywhere+VoicePipeline.js.map +1 -0
- package/dist/Public/Extensions/STTTypes.d.ts +53 -0
- package/dist/Public/Extensions/STTTypes.d.ts.map +1 -0
- package/dist/Public/Extensions/STTTypes.js +16 -0
- package/dist/Public/Extensions/STTTypes.js.map +1 -0
- package/dist/Public/Extensions/TTSTypes.d.ts +31 -0
- package/dist/Public/Extensions/TTSTypes.d.ts.map +1 -0
- package/dist/Public/Extensions/TTSTypes.js +3 -0
- package/dist/Public/Extensions/TTSTypes.js.map +1 -0
- package/dist/Public/Extensions/ToolCallingTypes.d.ts +78 -0
- package/dist/Public/Extensions/ToolCallingTypes.d.ts.map +1 -0
- package/dist/Public/Extensions/ToolCallingTypes.js +8 -0
- package/dist/Public/Extensions/ToolCallingTypes.js.map +1 -0
- package/dist/Public/Extensions/VADTypes.d.ts +30 -0
- package/dist/Public/Extensions/VADTypes.d.ts.map +1 -0
- package/dist/Public/Extensions/VADTypes.js +8 -0
- package/dist/Public/Extensions/VADTypes.js.map +1 -0
- package/dist/Public/Extensions/VLMTypes.d.ts +56 -0
- package/dist/Public/Extensions/VLMTypes.d.ts.map +1 -0
- package/dist/Public/Extensions/VLMTypes.js +24 -0
- package/dist/Public/Extensions/VLMTypes.js.map +1 -0
- package/dist/Public/Extensions/VoiceAgentTypes.d.ts +42 -0
- package/dist/Public/Extensions/VoiceAgentTypes.d.ts.map +1 -0
- package/dist/Public/Extensions/VoiceAgentTypes.js +12 -0
- package/dist/Public/Extensions/VoiceAgentTypes.js.map +1 -0
- package/dist/Public/Extensions/VoicePipelineTypes.d.ts +69 -0
- package/dist/Public/Extensions/VoicePipelineTypes.d.ts.map +1 -0
- package/dist/Public/Extensions/VoicePipelineTypes.js +9 -0
- package/dist/Public/Extensions/VoicePipelineTypes.js.map +1 -0
- package/dist/Public/RunAnywhere.d.ts +121 -0
- package/dist/Public/RunAnywhere.d.ts.map +1 -0
- package/dist/Public/RunAnywhere.js +332 -0
- package/dist/Public/RunAnywhere.js.map +1 -0
- package/dist/index.d.ts +67 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +53 -0
- package/dist/index.js.map +1 -0
- package/dist/types/LLMTypes.d.ts +48 -0
- package/dist/types/LLMTypes.d.ts.map +1 -0
- package/dist/types/LLMTypes.js +8 -0
- package/dist/types/LLMTypes.js.map +1 -0
- package/dist/types/enums.d.ts +144 -0
- package/dist/types/enums.d.ts.map +1 -0
- package/dist/types/enums.js +159 -0
- package/dist/types/enums.js.map +1 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +8 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/models.d.ts +154 -0
- package/dist/types/models.d.ts.map +1 -0
- package/dist/types/models.js +8 -0
- package/dist/types/models.js.map +1 -0
- package/dist/workers/vlm-worker.d.ts +9 -0
- package/dist/workers/vlm-worker.d.ts.map +1 -0
- package/dist/workers/vlm-worker.js +10 -0
- package/dist/workers/vlm-worker.js.map +1 -0
- package/package.json +62 -0
- package/wasm/racommons-webgpu.js +156 -0
- package/wasm/racommons-webgpu.wasm +0 -0
- package/wasm/racommons.js +126 -0
- package/wasm/racommons.wasm +0 -0
- package/wasm/sherpa/sherpa-onnx-asr.js +1538 -0
- package/wasm/sherpa/sherpa-onnx-glue-original.js +19 -0
- package/wasm/sherpa/sherpa-onnx-glue.js +17 -0
- package/wasm/sherpa/sherpa-onnx-tts.js +657 -0
- package/wasm/sherpa/sherpa-onnx-vad.js +337 -0
- package/wasm/sherpa/sherpa-onnx-wave.js +88 -0
- package/wasm/sherpa/sherpa-onnx.wasm +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RunAnywhere+VAD.d.ts","sourceRoot":"","sources":["../../../src/Public/Extensions/RunAnywhere+VAD.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AASH,OAAO,KAAK,EAAE,sBAAsB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAMxF,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,YAAY,EAAE,sBAAsB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAiBxF,cAAM,OAAO;IACX,QAAQ,CAAC,aAAa,SAAS;IAC/B,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,mBAAmB,CAAuC;IAClE,OAAO,CAAC,gBAAgB,CAAS;IAEjC;;;OAGG;IACG,SAAS,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAmEtD,mCAAmC;IACnC,IAAI,aAAa,IAAI,OAAO,CAE3B;IAED;;;OAGG;IACH,gBAAgB,CAAC,QAAQ,EAAE,sBAAsB,GAAG,MAAM,IAAI;IAK9D;;;;;;;;;OASG;IACH,cAAc,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO;IAqC9C;;;;;;OAMG;IACH,gBAAgB,IAAI,aAAa,GAAG,IAAI;IAiCxC,4CAA4C;IAC5C,IAAI,cAAc,IAAI,OAAO,CAG5B;IAED,uBAAuB;IACvB,KAAK,IAAI,IAAI;IAMb,yCAAyC;IACzC,KAAK,IAAI,IAAI;IAKb,kCAAkC;IAClC,OAAO,IAAI,IAAI;CAUhB;AAED,eAAO,MAAM,GAAG,SAAgB,CAAC"}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RunAnywhere Web SDK - Voice Activity Detection Extension
|
|
3
|
+
*
|
|
4
|
+
* Adds VAD capabilities via sherpa-onnx WASM using Silero VAD model.
|
|
5
|
+
* Detects speech segments in audio streams with high accuracy.
|
|
6
|
+
*
|
|
7
|
+
* Mirrors: sdk/runanywhere-swift/Sources/RunAnywhere/Public/Extensions/VAD/
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* import { VAD } from '@runanywhere/web';
|
|
11
|
+
*
|
|
12
|
+
* await VAD.loadModel({
|
|
13
|
+
* modelPath: '/models/vad/silero_vad.onnx',
|
|
14
|
+
* threshold: 0.5,
|
|
15
|
+
* });
|
|
16
|
+
*
|
|
17
|
+
* const hasVoice = VAD.processSamples(audioFloat32Array);
|
|
18
|
+
* if (hasVoice) console.log('Speech detected!');
|
|
19
|
+
*/
|
|
20
|
+
import { RunAnywhere } from '../RunAnywhere';
|
|
21
|
+
import { SherpaONNXBridge } from '../../Foundation/SherpaONNXBridge';
|
|
22
|
+
import { SDKError, SDKErrorCode } from '../../Foundation/ErrorTypes';
|
|
23
|
+
import { SDKLogger } from '../../Foundation/SDKLogger';
|
|
24
|
+
import { EventBus } from '../../Foundation/EventBus';
|
|
25
|
+
import { SDKEventType } from '../../types/enums';
|
|
26
|
+
import { SpeechActivity } from './VADTypes';
|
|
27
|
+
// @ts-expect-error -- sherpa-onnx JS wrappers ship without type declarations
|
|
28
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
29
|
+
import { initSherpaOnnxVadModelConfig, freeConfig } from '../../../wasm/sherpa/sherpa-onnx-vad.js';
|
|
30
|
+
export { SpeechActivity } from './VADTypes';
|
|
31
|
+
const logger = new SDKLogger('VAD');
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
// Internal Helpers
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
function requireSherpa() {
|
|
36
|
+
if (!RunAnywhere.isInitialized)
|
|
37
|
+
throw SDKError.notInitialized();
|
|
38
|
+
return SherpaONNXBridge.shared;
|
|
39
|
+
}
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
// VAD Extension
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
class VADImpl {
|
|
44
|
+
extensionName = 'VAD';
|
|
45
|
+
_vadHandle = 0;
|
|
46
|
+
_sampleRate = 16000;
|
|
47
|
+
_jsActivityCallback = null;
|
|
48
|
+
_lastSpeechState = false;
|
|
49
|
+
/**
|
|
50
|
+
* Load the Silero VAD model via sherpa-onnx.
|
|
51
|
+
* The model file must already be in the sherpa-onnx virtual FS.
|
|
52
|
+
*/
|
|
53
|
+
async loadModel(config) {
|
|
54
|
+
const sherpa = requireSherpa();
|
|
55
|
+
await sherpa.ensureLoaded();
|
|
56
|
+
const m = sherpa.module;
|
|
57
|
+
// Clean up previous
|
|
58
|
+
this.cleanup();
|
|
59
|
+
this._sampleRate = config.sampleRate ?? 16000;
|
|
60
|
+
logger.info('Loading Silero VAD model');
|
|
61
|
+
EventBus.shared.emit('model.loadStarted', SDKEventType.Model, {
|
|
62
|
+
modelId: 'silero-vad', component: 'vad',
|
|
63
|
+
});
|
|
64
|
+
const startMs = performance.now();
|
|
65
|
+
const bufferSizeInSeconds = 30; // 30 second circular buffer
|
|
66
|
+
// Build the struct-based config matching sherpa-onnx C API layout.
|
|
67
|
+
// Uses initSherpaOnnxVadModelConfig from sherpa-onnx-vad.js which
|
|
68
|
+
// allocates a C struct in WASM memory (not JSON).
|
|
69
|
+
const configObj = {
|
|
70
|
+
sileroVad: {
|
|
71
|
+
model: config.modelPath,
|
|
72
|
+
threshold: config.threshold ?? 0.5,
|
|
73
|
+
minSilenceDuration: config.minSilenceDuration ?? 0.5,
|
|
74
|
+
minSpeechDuration: config.minSpeechDuration ?? 0.25,
|
|
75
|
+
maxSpeechDuration: config.maxSpeechDuration ?? 5.0,
|
|
76
|
+
windowSize: config.windowSize ?? 512,
|
|
77
|
+
},
|
|
78
|
+
tenVad: {
|
|
79
|
+
model: '',
|
|
80
|
+
threshold: 0.5,
|
|
81
|
+
minSilenceDuration: 0.5,
|
|
82
|
+
minSpeechDuration: 0.25,
|
|
83
|
+
maxSpeechDuration: 20,
|
|
84
|
+
windowSize: 256,
|
|
85
|
+
},
|
|
86
|
+
sampleRate: this._sampleRate,
|
|
87
|
+
numThreads: 1,
|
|
88
|
+
provider: 'cpu',
|
|
89
|
+
debug: 0,
|
|
90
|
+
};
|
|
91
|
+
const configStruct = initSherpaOnnxVadModelConfig(configObj, m);
|
|
92
|
+
try {
|
|
93
|
+
this._vadHandle = m._SherpaOnnxCreateVoiceActivityDetector(configStruct.ptr, bufferSizeInSeconds);
|
|
94
|
+
freeConfig(configStruct, m);
|
|
95
|
+
if (this._vadHandle === 0) {
|
|
96
|
+
throw new SDKError(SDKErrorCode.ModelLoadFailed, 'Failed to create VAD from Silero model');
|
|
97
|
+
}
|
|
98
|
+
const loadTimeMs = Math.round(performance.now() - startMs);
|
|
99
|
+
logger.info(`Silero VAD loaded in ${loadTimeMs}ms`);
|
|
100
|
+
EventBus.shared.emit('model.loadCompleted', SDKEventType.Model, {
|
|
101
|
+
modelId: 'silero-vad', component: 'vad', loadTimeMs,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
this.cleanup();
|
|
106
|
+
throw error;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/** Whether VAD model is loaded. */
|
|
110
|
+
get isInitialized() {
|
|
111
|
+
return this._vadHandle !== 0;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Register a callback for speech activity events.
|
|
115
|
+
* Called when speech starts, ends, or is ongoing.
|
|
116
|
+
*/
|
|
117
|
+
onSpeechActivity(callback) {
|
|
118
|
+
this._jsActivityCallback = callback;
|
|
119
|
+
return () => { this._jsActivityCallback = null; };
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Process audio samples through VAD.
|
|
123
|
+
* Returns whether speech was detected in this frame.
|
|
124
|
+
*
|
|
125
|
+
* The Silero VAD expects 512-sample windows at 16kHz.
|
|
126
|
+
* This method handles arbitrary-length input by feeding in chunks.
|
|
127
|
+
*
|
|
128
|
+
* @param samples - Float32Array of PCM audio samples (mono, 16kHz)
|
|
129
|
+
* @returns Whether speech is currently detected
|
|
130
|
+
*/
|
|
131
|
+
processSamples(samples) {
|
|
132
|
+
if (this._vadHandle === 0) {
|
|
133
|
+
logger.warning('VAD not initialized. Call loadModel() first.');
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
const m = SherpaONNXBridge.shared.module;
|
|
137
|
+
// Copy samples to WASM memory
|
|
138
|
+
const audioPtr = m._malloc(samples.length * 4);
|
|
139
|
+
m.HEAPF32.set(samples, audioPtr / 4);
|
|
140
|
+
try {
|
|
141
|
+
// Feed samples to VAD
|
|
142
|
+
m._SherpaOnnxVoiceActivityDetectorAcceptWaveform(this._vadHandle, audioPtr, samples.length);
|
|
143
|
+
// Check detection state
|
|
144
|
+
const detected = m._SherpaOnnxVoiceActivityDetectorDetected(this._vadHandle) !== 0;
|
|
145
|
+
// Emit speech activity callbacks
|
|
146
|
+
if (detected && !this._lastSpeechState) {
|
|
147
|
+
this._jsActivityCallback?.(SpeechActivity.Started);
|
|
148
|
+
EventBus.shared.emit('vad.speechStarted', SDKEventType.Voice, { activity: SpeechActivity.Started });
|
|
149
|
+
}
|
|
150
|
+
else if (!detected && this._lastSpeechState) {
|
|
151
|
+
this._jsActivityCallback?.(SpeechActivity.Ended);
|
|
152
|
+
EventBus.shared.emit('vad.speechEnded', SDKEventType.Voice, { activity: SpeechActivity.Ended });
|
|
153
|
+
}
|
|
154
|
+
else if (detected) {
|
|
155
|
+
this._jsActivityCallback?.(SpeechActivity.Ongoing);
|
|
156
|
+
}
|
|
157
|
+
this._lastSpeechState = detected;
|
|
158
|
+
return detected;
|
|
159
|
+
}
|
|
160
|
+
finally {
|
|
161
|
+
m._free(audioPtr);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Get the next available speech segment (if any).
|
|
166
|
+
* Returns null if no complete segments are available.
|
|
167
|
+
*
|
|
168
|
+
* After calling processSamples(), check for available segments
|
|
169
|
+
* using this method. Call repeatedly until it returns null.
|
|
170
|
+
*/
|
|
171
|
+
popSpeechSegment() {
|
|
172
|
+
if (this._vadHandle === 0)
|
|
173
|
+
return null;
|
|
174
|
+
const m = SherpaONNXBridge.shared.module;
|
|
175
|
+
// Check if there's a segment available
|
|
176
|
+
if (m._SherpaOnnxVoiceActivityDetectorEmpty(this._vadHandle) !== 0) {
|
|
177
|
+
return null;
|
|
178
|
+
}
|
|
179
|
+
// Get the front segment
|
|
180
|
+
const segmentPtr = m._SherpaOnnxVoiceActivityDetectorFront(this._vadHandle);
|
|
181
|
+
if (segmentPtr === 0)
|
|
182
|
+
return null;
|
|
183
|
+
// Read segment struct: { int32_t start; const float* samples; int32_t n; }
|
|
184
|
+
// (matches sherpa-onnx-vad.js Vad.front() layout)
|
|
185
|
+
const startTime = m.HEAP32[segmentPtr / 4];
|
|
186
|
+
const samplesPtr = m.HEAP32[segmentPtr / 4 + 1];
|
|
187
|
+
const numSamples = m.HEAP32[segmentPtr / 4 + 2];
|
|
188
|
+
// Copy samples from WASM heap
|
|
189
|
+
const samples = new Float32Array(numSamples);
|
|
190
|
+
if (samplesPtr && numSamples > 0) {
|
|
191
|
+
samples.set(m.HEAPF32.subarray(samplesPtr / 4, samplesPtr / 4 + numSamples));
|
|
192
|
+
}
|
|
193
|
+
// Destroy the segment and pop
|
|
194
|
+
m._SherpaOnnxDestroySpeechSegment(segmentPtr);
|
|
195
|
+
m._SherpaOnnxVoiceActivityDetectorPop(this._vadHandle);
|
|
196
|
+
return { startTime, samples };
|
|
197
|
+
}
|
|
198
|
+
/** Whether speech is currently detected. */
|
|
199
|
+
get isSpeechActive() {
|
|
200
|
+
if (this._vadHandle === 0)
|
|
201
|
+
return false;
|
|
202
|
+
return SherpaONNXBridge.shared.module._SherpaOnnxVoiceActivityDetectorDetected(this._vadHandle) !== 0;
|
|
203
|
+
}
|
|
204
|
+
/** Reset VAD state. */
|
|
205
|
+
reset() {
|
|
206
|
+
if (this._vadHandle === 0)
|
|
207
|
+
return;
|
|
208
|
+
SherpaONNXBridge.shared.module._SherpaOnnxVoiceActivityDetectorReset(this._vadHandle);
|
|
209
|
+
this._lastSpeechState = false;
|
|
210
|
+
}
|
|
211
|
+
/** Flush remaining audio through VAD. */
|
|
212
|
+
flush() {
|
|
213
|
+
if (this._vadHandle === 0)
|
|
214
|
+
return;
|
|
215
|
+
SherpaONNXBridge.shared.module._SherpaOnnxVoiceActivityDetectorFlush(this._vadHandle);
|
|
216
|
+
}
|
|
217
|
+
/** Clean up the VAD resources. */
|
|
218
|
+
cleanup() {
|
|
219
|
+
if (this._vadHandle !== 0) {
|
|
220
|
+
try {
|
|
221
|
+
SherpaONNXBridge.shared.module._SherpaOnnxDestroyVoiceActivityDetector(this._vadHandle);
|
|
222
|
+
}
|
|
223
|
+
catch { /* ignore */ }
|
|
224
|
+
this._vadHandle = 0;
|
|
225
|
+
}
|
|
226
|
+
this._jsActivityCallback = null;
|
|
227
|
+
this._lastSpeechState = false;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
export const VAD = new VADImpl();
|
|
231
|
+
//# sourceMappingURL=RunAnywhere+VAD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RunAnywhere+VAD.js","sourceRoot":"","sources":["../../../src/Public/Extensions/RunAnywhere+VAD.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RunAnywhere Web SDK - Vision Language Model Extension
|
|
3
|
+
*
|
|
4
|
+
* Adds VLM capabilities for image understanding + text generation.
|
|
5
|
+
* Uses the RACommons rac_vlm_component_* C API (llama.cpp mtmd backend).
|
|
6
|
+
*
|
|
7
|
+
* Mirrors: sdk/runanywhere-swift/Sources/RunAnywhere/Public/Extensions/VLM/
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* import { VLM } from '@runanywhere/web';
|
|
11
|
+
*
|
|
12
|
+
* await VLM.loadModel('/models/qwen2-vl.gguf', '/models/qwen2-vl-mmproj.gguf', 'qwen2-vl');
|
|
13
|
+
* const result = await VLM.process(imageData, 'Describe this image');
|
|
14
|
+
* console.log(result.text);
|
|
15
|
+
*/
|
|
16
|
+
import type { VLMImage, VLMGenerationOptions, VLMGenerationResult } from './VLMTypes';
|
|
17
|
+
export type { VLMImage, VLMGenerationOptions, VLMGenerationResult, VLMStreamingResult } from './VLMTypes';
|
|
18
|
+
export { VLMImageFormat, VLMModelFamily } from './VLMTypes';
|
|
19
|
+
declare class VLMImpl {
|
|
20
|
+
readonly extensionName = "VLM";
|
|
21
|
+
private _vlmComponentHandle;
|
|
22
|
+
private _vlmBackendRegistered;
|
|
23
|
+
private requireBridge;
|
|
24
|
+
/**
|
|
25
|
+
* Ensure the llama.cpp VLM backend is registered with the service registry.
|
|
26
|
+
* Must be called before creating the VLM component so it can find a provider.
|
|
27
|
+
*/
|
|
28
|
+
private ensureVLMBackendRegistered;
|
|
29
|
+
private ensureVLMComponent;
|
|
30
|
+
/**
|
|
31
|
+
* Load a VLM model (GGUF model + multimodal projector).
|
|
32
|
+
*
|
|
33
|
+
* @param modelPath - Path to the GGUF model file in WASM FS
|
|
34
|
+
* @param mmprojPath - Path to the mmproj file in WASM FS
|
|
35
|
+
* @param modelId - Unique model identifier
|
|
36
|
+
* @param modelName - Display name (optional)
|
|
37
|
+
*/
|
|
38
|
+
loadModel(modelPath: string, mmprojPath: string, modelId: string, modelName?: string): Promise<void>;
|
|
39
|
+
/** Unload the VLM model. */
|
|
40
|
+
unloadModel(): Promise<void>;
|
|
41
|
+
/** Check if a VLM model is loaded. */
|
|
42
|
+
get isModelLoaded(): boolean;
|
|
43
|
+
/**
|
|
44
|
+
* Process an image with a text prompt.
|
|
45
|
+
*
|
|
46
|
+
* @param image - Image input (file path, pixel data, or base64)
|
|
47
|
+
* @param prompt - Text prompt describing what to do with the image
|
|
48
|
+
* @param options - Generation options
|
|
49
|
+
* @returns VLM generation result
|
|
50
|
+
*/
|
|
51
|
+
process(image: VLMImage, prompt: string, options?: VLMGenerationOptions): Promise<VLMGenerationResult>;
|
|
52
|
+
/** Cancel in-progress VLM generation. */
|
|
53
|
+
cancel(): void;
|
|
54
|
+
/** Clean up the VLM component and unregister backend. */
|
|
55
|
+
cleanup(): void;
|
|
56
|
+
}
|
|
57
|
+
export declare const VLM: VLMImpl;
|
|
58
|
+
//# sourceMappingURL=RunAnywhere+VLM.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RunAnywhere+VLM.d.ts","sourceRoot":"","sources":["../../../src/Public/Extensions/RunAnywhere+VLM.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAUH,OAAO,KAAK,EAAE,QAAQ,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAItF,YAAY,EAAE,QAAQ,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAC1G,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAM5D,cAAM,OAAO;IACX,QAAQ,CAAC,aAAa,SAAS;IAC/B,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,qBAAqB,CAAS;IAEtC,OAAO,CAAC,aAAa;IAKrB;;;OAGG;IACH,OAAO,CAAC,0BAA0B;IAyBlC,OAAO,CAAC,kBAAkB;IAsB1B;;;;;;;OAOG;IACG,SAAS,CACb,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC;IA8BhB,4BAA4B;IACtB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAUlC,sCAAsC;IACtC,IAAI,aAAa,IAAI,OAAO,CAO3B;IAED;;;;;;;OAOG;IACG,OAAO,CACX,KAAK,EAAE,QAAQ,EACf,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,mBAAmB,CAAC;IA+G/B,yCAAyC;IACzC,MAAM,IAAI,IAAI;IAOd,yDAAyD;IACzD,OAAO,IAAI,IAAI;CAqBhB;AAED,eAAO,MAAM,GAAG,SAAgB,CAAC"}
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RunAnywhere Web SDK - Vision Language Model Extension
|
|
3
|
+
*
|
|
4
|
+
* Adds VLM capabilities for image understanding + text generation.
|
|
5
|
+
* Uses the RACommons rac_vlm_component_* C API (llama.cpp mtmd backend).
|
|
6
|
+
*
|
|
7
|
+
* Mirrors: sdk/runanywhere-swift/Sources/RunAnywhere/Public/Extensions/VLM/
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* import { VLM } from '@runanywhere/web';
|
|
11
|
+
*
|
|
12
|
+
* await VLM.loadModel('/models/qwen2-vl.gguf', '/models/qwen2-vl-mmproj.gguf', 'qwen2-vl');
|
|
13
|
+
* const result = await VLM.process(imageData, 'Describe this image');
|
|
14
|
+
* console.log(result.text);
|
|
15
|
+
*/
|
|
16
|
+
import { RunAnywhere } from '../RunAnywhere';
|
|
17
|
+
import { WASMBridge } from '../../Foundation/WASMBridge';
|
|
18
|
+
import { Offsets } from '../../Foundation/StructOffsets';
|
|
19
|
+
import { SDKError, SDKErrorCode } from '../../Foundation/ErrorTypes';
|
|
20
|
+
import { SDKLogger } from '../../Foundation/SDKLogger';
|
|
21
|
+
import { EventBus } from '../../Foundation/EventBus';
|
|
22
|
+
import { SDKEventType } from '../../types/enums';
|
|
23
|
+
import { VLMImageFormat, VLMModelFamily } from './VLMTypes';
|
|
24
|
+
const logger = new SDKLogger('VLM');
|
|
25
|
+
export { VLMImageFormat, VLMModelFamily } from './VLMTypes';
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
// VLM Extension
|
|
28
|
+
// ---------------------------------------------------------------------------
|
|
29
|
+
class VLMImpl {
|
|
30
|
+
extensionName = 'VLM';
|
|
31
|
+
_vlmComponentHandle = 0;
|
|
32
|
+
_vlmBackendRegistered = false;
|
|
33
|
+
requireBridge() {
|
|
34
|
+
if (!RunAnywhere.isInitialized)
|
|
35
|
+
throw SDKError.notInitialized();
|
|
36
|
+
return WASMBridge.shared;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Ensure the llama.cpp VLM backend is registered with the service registry.
|
|
40
|
+
* Must be called before creating the VLM component so it can find a provider.
|
|
41
|
+
*/
|
|
42
|
+
ensureVLMBackendRegistered() {
|
|
43
|
+
if (this._vlmBackendRegistered)
|
|
44
|
+
return;
|
|
45
|
+
const bridge = this.requireBridge();
|
|
46
|
+
const m = bridge.module;
|
|
47
|
+
// Check if the backend registration function exists (only when built with --vlm)
|
|
48
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
49
|
+
const fn = m['_rac_backend_llamacpp_vlm_register'];
|
|
50
|
+
if (!fn) {
|
|
51
|
+
throw new SDKError(SDKErrorCode.BackendNotAvailable, 'VLM backend not available. Rebuild WASM with --vlm flag.');
|
|
52
|
+
}
|
|
53
|
+
const result = m.ccall('rac_backend_llamacpp_vlm_register', 'number', [], []);
|
|
54
|
+
if (result !== 0) {
|
|
55
|
+
bridge.checkResult(result, 'rac_backend_llamacpp_vlm_register');
|
|
56
|
+
}
|
|
57
|
+
this._vlmBackendRegistered = true;
|
|
58
|
+
logger.info('VLM backend (llama.cpp mtmd) registered');
|
|
59
|
+
}
|
|
60
|
+
ensureVLMComponent() {
|
|
61
|
+
if (this._vlmComponentHandle !== 0)
|
|
62
|
+
return this._vlmComponentHandle;
|
|
63
|
+
// Register the VLM backend first
|
|
64
|
+
this.ensureVLMBackendRegistered();
|
|
65
|
+
const bridge = this.requireBridge();
|
|
66
|
+
const m = bridge.module;
|
|
67
|
+
const handlePtr = m._malloc(4);
|
|
68
|
+
const result = m.ccall('rac_vlm_component_create', 'number', ['number'], [handlePtr]);
|
|
69
|
+
if (result !== 0) {
|
|
70
|
+
m._free(handlePtr);
|
|
71
|
+
bridge.checkResult(result, 'rac_vlm_component_create');
|
|
72
|
+
}
|
|
73
|
+
this._vlmComponentHandle = m.getValue(handlePtr, 'i32');
|
|
74
|
+
m._free(handlePtr);
|
|
75
|
+
logger.debug('VLM component created');
|
|
76
|
+
return this._vlmComponentHandle;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Load a VLM model (GGUF model + multimodal projector).
|
|
80
|
+
*
|
|
81
|
+
* @param modelPath - Path to the GGUF model file in WASM FS
|
|
82
|
+
* @param mmprojPath - Path to the mmproj file in WASM FS
|
|
83
|
+
* @param modelId - Unique model identifier
|
|
84
|
+
* @param modelName - Display name (optional)
|
|
85
|
+
*/
|
|
86
|
+
async loadModel(modelPath, mmprojPath, modelId, modelName) {
|
|
87
|
+
const bridge = this.requireBridge();
|
|
88
|
+
const m = bridge.module;
|
|
89
|
+
const handle = this.ensureVLMComponent();
|
|
90
|
+
logger.info(`Loading VLM model: ${modelId}`);
|
|
91
|
+
EventBus.shared.emit('model.loadStarted', SDKEventType.Model, { modelId, component: 'vlm' });
|
|
92
|
+
const pathPtr = bridge.allocString(modelPath);
|
|
93
|
+
const projPtr = bridge.allocString(mmprojPath);
|
|
94
|
+
const idPtr = bridge.allocString(modelId);
|
|
95
|
+
const namePtr = bridge.allocString(modelName ?? modelId);
|
|
96
|
+
try {
|
|
97
|
+
const result = m.ccall('rac_vlm_component_load_model', 'number', ['number', 'number', 'number', 'number', 'number'], [handle, pathPtr, projPtr, idPtr, namePtr]);
|
|
98
|
+
bridge.checkResult(result, 'rac_vlm_component_load_model');
|
|
99
|
+
logger.info(`VLM model loaded: ${modelId}`);
|
|
100
|
+
EventBus.shared.emit('model.loadCompleted', SDKEventType.Model, { modelId, component: 'vlm' });
|
|
101
|
+
}
|
|
102
|
+
finally {
|
|
103
|
+
bridge.free(pathPtr);
|
|
104
|
+
bridge.free(projPtr);
|
|
105
|
+
bridge.free(idPtr);
|
|
106
|
+
bridge.free(namePtr);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/** Unload the VLM model. */
|
|
110
|
+
async unloadModel() {
|
|
111
|
+
if (this._vlmComponentHandle === 0)
|
|
112
|
+
return;
|
|
113
|
+
const bridge = this.requireBridge();
|
|
114
|
+
const result = bridge.module.ccall('rac_vlm_component_unload', 'number', ['number'], [this._vlmComponentHandle]);
|
|
115
|
+
bridge.checkResult(result, 'rac_vlm_component_unload');
|
|
116
|
+
logger.info('VLM model unloaded');
|
|
117
|
+
}
|
|
118
|
+
/** Check if a VLM model is loaded. */
|
|
119
|
+
get isModelLoaded() {
|
|
120
|
+
if (this._vlmComponentHandle === 0)
|
|
121
|
+
return false;
|
|
122
|
+
try {
|
|
123
|
+
return WASMBridge.shared.module.ccall('rac_vlm_component_is_loaded', 'number', ['number'], [this._vlmComponentHandle]) === 1;
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Process an image with a text prompt.
|
|
131
|
+
*
|
|
132
|
+
* @param image - Image input (file path, pixel data, or base64)
|
|
133
|
+
* @param prompt - Text prompt describing what to do with the image
|
|
134
|
+
* @param options - Generation options
|
|
135
|
+
* @returns VLM generation result
|
|
136
|
+
*/
|
|
137
|
+
async process(image, prompt, options = {}) {
|
|
138
|
+
const bridge = this.requireBridge();
|
|
139
|
+
const m = bridge.module;
|
|
140
|
+
const handle = this.ensureVLMComponent();
|
|
141
|
+
if (!this.isModelLoaded) {
|
|
142
|
+
throw new SDKError(SDKErrorCode.ModelNotLoaded, 'No VLM model loaded. Call loadModel() first.');
|
|
143
|
+
}
|
|
144
|
+
logger.debug(`VLM process: "${prompt.substring(0, 50)}..."`);
|
|
145
|
+
// Build rac_vlm_image_t struct
|
|
146
|
+
const imageSize = m._rac_wasm_sizeof_vlm_image();
|
|
147
|
+
const imagePtr = m._malloc(imageSize);
|
|
148
|
+
for (let i = 0; i < imageSize; i++)
|
|
149
|
+
m.setValue(imagePtr + i, 0, 'i8');
|
|
150
|
+
let filePathPtr = 0;
|
|
151
|
+
let base64Ptr = 0;
|
|
152
|
+
let pixelPtr = 0;
|
|
153
|
+
const vi = Offsets.vlmImage;
|
|
154
|
+
m.setValue(imagePtr + vi.format, image.format, 'i32');
|
|
155
|
+
if (image.format === VLMImageFormat.FilePath && image.filePath) {
|
|
156
|
+
filePathPtr = bridge.allocString(image.filePath);
|
|
157
|
+
m.setValue(imagePtr + vi.filePath, filePathPtr, '*');
|
|
158
|
+
}
|
|
159
|
+
else if (image.format === VLMImageFormat.Base64 && image.base64Data) {
|
|
160
|
+
base64Ptr = bridge.allocString(image.base64Data);
|
|
161
|
+
m.setValue(imagePtr + vi.base64Data, base64Ptr, '*');
|
|
162
|
+
}
|
|
163
|
+
else if (image.format === VLMImageFormat.RGBPixels && image.pixelData) {
|
|
164
|
+
pixelPtr = m._malloc(image.pixelData.length);
|
|
165
|
+
bridge.writeBytes(image.pixelData, pixelPtr);
|
|
166
|
+
m.setValue(imagePtr + vi.pixelData, pixelPtr, '*');
|
|
167
|
+
}
|
|
168
|
+
m.setValue(imagePtr + vi.width, image.width ?? 0, 'i32');
|
|
169
|
+
m.setValue(imagePtr + vi.height, image.height ?? 0, 'i32');
|
|
170
|
+
// data_size: use pixel data length for RGB, base64 string length for base64
|
|
171
|
+
const dataSize = image.pixelData?.length ?? image.base64Data?.length ?? 0;
|
|
172
|
+
m.setValue(imagePtr + vi.dataSize, dataSize, 'i32');
|
|
173
|
+
// Build rac_vlm_options_t
|
|
174
|
+
const optSize = m._rac_wasm_sizeof_vlm_options();
|
|
175
|
+
const optPtr = m._malloc(optSize);
|
|
176
|
+
for (let i = 0; i < optSize; i++)
|
|
177
|
+
m.setValue(optPtr + i, 0, 'i8');
|
|
178
|
+
const vo = Offsets.vlmOptions;
|
|
179
|
+
m.setValue(optPtr + vo.maxTokens, options.maxTokens ?? 512, 'i32');
|
|
180
|
+
m.setValue(optPtr + vo.temperature, options.temperature ?? 0.7, 'float');
|
|
181
|
+
m.setValue(optPtr + vo.topP, options.topP ?? 0.9, 'float');
|
|
182
|
+
m.setValue(optPtr + vo.streamingEnabled, options.streaming ? 1 : 0, 'i32');
|
|
183
|
+
let sysPtr = 0;
|
|
184
|
+
if (options.systemPrompt) {
|
|
185
|
+
sysPtr = bridge.allocString(options.systemPrompt);
|
|
186
|
+
m.setValue(optPtr + vo.systemPrompt, sysPtr, '*');
|
|
187
|
+
}
|
|
188
|
+
m.setValue(optPtr + vo.modelFamily, options.modelFamily ?? VLMModelFamily.Auto, 'i32');
|
|
189
|
+
const promptPtr = bridge.allocString(prompt);
|
|
190
|
+
// Result struct
|
|
191
|
+
const resSize = m._rac_wasm_sizeof_vlm_result();
|
|
192
|
+
const resPtr = m._malloc(resSize);
|
|
193
|
+
try {
|
|
194
|
+
const r = m.ccall('rac_vlm_component_process', 'number', ['number', 'number', 'number', 'number', 'number'], [handle, imagePtr, promptPtr, optPtr, resPtr]);
|
|
195
|
+
bridge.checkResult(r, 'rac_vlm_component_process');
|
|
196
|
+
// Read rac_vlm_result_t (offsets from compiler via StructOffsets)
|
|
197
|
+
const vr = Offsets.vlmResult;
|
|
198
|
+
const textPtr = m.getValue(resPtr + vr.text, '*');
|
|
199
|
+
const vlmResult = {
|
|
200
|
+
text: bridge.readString(textPtr),
|
|
201
|
+
promptTokens: m.getValue(resPtr + vr.promptTokens, 'i32'),
|
|
202
|
+
imageTokens: m.getValue(resPtr + vr.imageTokens, 'i32'),
|
|
203
|
+
completionTokens: m.getValue(resPtr + vr.completionTokens, 'i32'),
|
|
204
|
+
totalTokens: m.getValue(resPtr + vr.totalTokens, 'i32'),
|
|
205
|
+
timeToFirstTokenMs: m.getValue(resPtr + vr.timeToFirstTokenMs, 'i32'),
|
|
206
|
+
imageEncodeTimeMs: m.getValue(resPtr + vr.imageEncodeTimeMs, 'i32'),
|
|
207
|
+
totalTimeMs: m.getValue(resPtr + vr.totalTimeMs, 'i32'),
|
|
208
|
+
tokensPerSecond: m.getValue(resPtr + vr.tokensPerSecond, 'float'),
|
|
209
|
+
hardwareUsed: bridge.accelerationMode,
|
|
210
|
+
};
|
|
211
|
+
m.ccall('rac_vlm_result_free', null, ['number'], [resPtr]);
|
|
212
|
+
EventBus.shared.emit('vlm.processed', SDKEventType.Generation, {
|
|
213
|
+
tokensPerSecond: vlmResult.tokensPerSecond,
|
|
214
|
+
totalTokens: vlmResult.totalTokens,
|
|
215
|
+
hardwareUsed: vlmResult.hardwareUsed,
|
|
216
|
+
});
|
|
217
|
+
return vlmResult;
|
|
218
|
+
}
|
|
219
|
+
finally {
|
|
220
|
+
bridge.free(promptPtr);
|
|
221
|
+
m._free(imagePtr);
|
|
222
|
+
m._free(optPtr);
|
|
223
|
+
if (filePathPtr)
|
|
224
|
+
bridge.free(filePathPtr);
|
|
225
|
+
if (base64Ptr)
|
|
226
|
+
bridge.free(base64Ptr);
|
|
227
|
+
if (pixelPtr)
|
|
228
|
+
m._free(pixelPtr);
|
|
229
|
+
if (sysPtr)
|
|
230
|
+
bridge.free(sysPtr);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
/** Cancel in-progress VLM generation. */
|
|
234
|
+
cancel() {
|
|
235
|
+
if (this._vlmComponentHandle === 0)
|
|
236
|
+
return;
|
|
237
|
+
WASMBridge.shared.module.ccall('rac_vlm_component_cancel', 'number', ['number'], [this._vlmComponentHandle]);
|
|
238
|
+
}
|
|
239
|
+
/** Clean up the VLM component and unregister backend. */
|
|
240
|
+
cleanup() {
|
|
241
|
+
if (this._vlmComponentHandle !== 0) {
|
|
242
|
+
try {
|
|
243
|
+
WASMBridge.shared.module.ccall('rac_vlm_component_destroy', null, ['number'], [this._vlmComponentHandle]);
|
|
244
|
+
}
|
|
245
|
+
catch { /* ignore */ }
|
|
246
|
+
this._vlmComponentHandle = 0;
|
|
247
|
+
}
|
|
248
|
+
if (this._vlmBackendRegistered) {
|
|
249
|
+
try {
|
|
250
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
251
|
+
const fn = WASMBridge.shared.module['_rac_backend_llamacpp_vlm_unregister'];
|
|
252
|
+
if (fn) {
|
|
253
|
+
WASMBridge.shared.module.ccall('rac_backend_llamacpp_vlm_unregister', 'number', [], []);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
catch { /* ignore */ }
|
|
257
|
+
this._vlmBackendRegistered = false;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
export const VLM = new VLMImpl();
|
|
262
|
+
//# sourceMappingURL=RunAnywhere+VLM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RunAnywhere+VLM.js","sourceRoot":"","sources":["../../../src/Public/Extensions/RunAnywhere+VLM.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RunAnywhere Web SDK - VoiceAgent Extension
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates the complete voice pipeline: VAD -> STT -> LLM -> TTS.
|
|
5
|
+
* Uses the RACommons rac_voice_agent_* C API for pipeline management.
|
|
6
|
+
*
|
|
7
|
+
* Mirrors: sdk/runanywhere-swift/Sources/RunAnywhere/Public/Extensions/VoiceAgent/
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* import { VoiceAgent } from '@runanywhere/web';
|
|
11
|
+
*
|
|
12
|
+
* const agent = await VoiceAgent.create();
|
|
13
|
+
* await agent.loadModels({ stt: '/models/whisper.bin', llm: '/models/llama.gguf', tts: '/models/piper.onnx' });
|
|
14
|
+
* const result = await agent.processVoiceTurn(audioData);
|
|
15
|
+
* console.log('Transcription:', result.transcription);
|
|
16
|
+
* console.log('Response:', result.response);
|
|
17
|
+
*/
|
|
18
|
+
import type { VoiceAgentModels, VoiceTurnResult } from './VoiceAgentTypes';
|
|
19
|
+
export { PipelineState } from './VoiceAgentTypes';
|
|
20
|
+
export type { VoiceAgentModels, VoiceTurnResult, VoiceAgentEventData, VoiceAgentEventCallback } from './VoiceAgentTypes';
|
|
21
|
+
export declare class VoiceAgentSession {
|
|
22
|
+
private handle;
|
|
23
|
+
private eventCallbackPtr;
|
|
24
|
+
constructor(handle: number);
|
|
25
|
+
/**
|
|
26
|
+
* Load models for all components.
|
|
27
|
+
*/
|
|
28
|
+
loadModels(models: VoiceAgentModels): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* Process a complete voice turn (audio in -> text response + audio out).
|
|
31
|
+
*/
|
|
32
|
+
processVoiceTurn(audioData: Uint8Array): Promise<VoiceTurnResult>;
|
|
33
|
+
/** Check if the voice agent is ready. */
|
|
34
|
+
get isReady(): boolean;
|
|
35
|
+
/** Transcribe audio without the full pipeline. */
|
|
36
|
+
transcribe(audioData: Uint8Array): Promise<string>;
|
|
37
|
+
/** Generate LLM response without the full pipeline. */
|
|
38
|
+
generateResponse(prompt: string): Promise<string>;
|
|
39
|
+
/** Destroy the voice agent session. */
|
|
40
|
+
destroy(): void;
|
|
41
|
+
}
|
|
42
|
+
export declare const VoiceAgent: {
|
|
43
|
+
/**
|
|
44
|
+
* Create a standalone VoiceAgent session.
|
|
45
|
+
* The agent manages its own STT, LLM, TTS, and VAD components.
|
|
46
|
+
*/
|
|
47
|
+
create(): Promise<VoiceAgentSession>;
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=RunAnywhere+VoiceAgent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RunAnywhere+VoiceAgent.d.ts","sourceRoot":"","sources":["../../../src/Public/Extensions/RunAnywhere+VoiceAgent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAQH,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAE3E,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAQzH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,gBAAgB,CAAK;gBAEjB,MAAM,EAAE,MAAM;IAI1B;;OAEG;IACG,UAAU,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAoDzD;;OAEG;IACG,gBAAgB,CAAC,SAAS,EAAE,UAAU,GAAG,OAAO,CAAC,eAAe,CAAC;IAgDvE,yCAAyC;IACzC,IAAI,OAAO,IAAI,OAAO,CAUrB;IAED,kDAAkD;IAC5C,UAAU,CAAC,SAAS,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAsBxD,uDAAuD;IACjD,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAqBvD,uCAAuC;IACvC,OAAO,IAAI,IAAI;CAYhB;AAMD,eAAO,MAAM,UAAU;IACrB;;;OAGG;cACa,OAAO,CAAC,iBAAiB,CAAC;CAuB3C,CAAC"}
|