@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.
Files changed (205) hide show
  1. package/README.md +795 -0
  2. package/dist/Foundation/ErrorTypes.d.ts +61 -0
  3. package/dist/Foundation/ErrorTypes.d.ts.map +1 -0
  4. package/dist/Foundation/ErrorTypes.js +90 -0
  5. package/dist/Foundation/ErrorTypes.js.map +1 -0
  6. package/dist/Foundation/EventBus.d.ts +171 -0
  7. package/dist/Foundation/EventBus.d.ts.map +1 -0
  8. package/dist/Foundation/EventBus.js +113 -0
  9. package/dist/Foundation/EventBus.js.map +1 -0
  10. package/dist/Foundation/PlatformAdapter.d.ts +101 -0
  11. package/dist/Foundation/PlatformAdapter.d.ts.map +1 -0
  12. package/dist/Foundation/PlatformAdapter.js +417 -0
  13. package/dist/Foundation/PlatformAdapter.js.map +1 -0
  14. package/dist/Foundation/SDKLogger.d.ts +33 -0
  15. package/dist/Foundation/SDKLogger.d.ts.map +1 -0
  16. package/dist/Foundation/SDKLogger.js +82 -0
  17. package/dist/Foundation/SDKLogger.js.map +1 -0
  18. package/dist/Foundation/SherpaONNXBridge.d.ts +134 -0
  19. package/dist/Foundation/SherpaONNXBridge.d.ts.map +1 -0
  20. package/dist/Foundation/SherpaONNXBridge.js +332 -0
  21. package/dist/Foundation/SherpaONNXBridge.js.map +1 -0
  22. package/dist/Foundation/StructOffsets.d.ts +147 -0
  23. package/dist/Foundation/StructOffsets.d.ts.map +1 -0
  24. package/dist/Foundation/StructOffsets.js +161 -0
  25. package/dist/Foundation/StructOffsets.js.map +1 -0
  26. package/dist/Foundation/WASMBridge.d.ts +241 -0
  27. package/dist/Foundation/WASMBridge.d.ts.map +1 -0
  28. package/dist/Foundation/WASMBridge.js +393 -0
  29. package/dist/Foundation/WASMBridge.js.map +1 -0
  30. package/dist/Infrastructure/ArchiveUtility.d.ts +25 -0
  31. package/dist/Infrastructure/ArchiveUtility.d.ts.map +1 -0
  32. package/dist/Infrastructure/ArchiveUtility.js +139 -0
  33. package/dist/Infrastructure/ArchiveUtility.js.map +1 -0
  34. package/dist/Infrastructure/AudioCapture.d.ts +87 -0
  35. package/dist/Infrastructure/AudioCapture.d.ts.map +1 -0
  36. package/dist/Infrastructure/AudioCapture.js +231 -0
  37. package/dist/Infrastructure/AudioCapture.js.map +1 -0
  38. package/dist/Infrastructure/AudioPlayback.d.ts +53 -0
  39. package/dist/Infrastructure/AudioPlayback.d.ts.map +1 -0
  40. package/dist/Infrastructure/AudioPlayback.js +117 -0
  41. package/dist/Infrastructure/AudioPlayback.js.map +1 -0
  42. package/dist/Infrastructure/DeviceCapabilities.d.ts +39 -0
  43. package/dist/Infrastructure/DeviceCapabilities.d.ts.map +1 -0
  44. package/dist/Infrastructure/DeviceCapabilities.js +111 -0
  45. package/dist/Infrastructure/DeviceCapabilities.js.map +1 -0
  46. package/dist/Infrastructure/ExtensionRegistry.d.ts +30 -0
  47. package/dist/Infrastructure/ExtensionRegistry.d.ts.map +1 -0
  48. package/dist/Infrastructure/ExtensionRegistry.js +41 -0
  49. package/dist/Infrastructure/ExtensionRegistry.js.map +1 -0
  50. package/dist/Infrastructure/ModelDownloader.d.ts +98 -0
  51. package/dist/Infrastructure/ModelDownloader.d.ts.map +1 -0
  52. package/dist/Infrastructure/ModelDownloader.js +431 -0
  53. package/dist/Infrastructure/ModelDownloader.js.map +1 -0
  54. package/dist/Infrastructure/ModelLoaderTypes.d.ts +34 -0
  55. package/dist/Infrastructure/ModelLoaderTypes.d.ts.map +1 -0
  56. package/dist/Infrastructure/ModelLoaderTypes.js +12 -0
  57. package/dist/Infrastructure/ModelLoaderTypes.js.map +1 -0
  58. package/dist/Infrastructure/ModelManager.d.ts +219 -0
  59. package/dist/Infrastructure/ModelManager.d.ts.map +1 -0
  60. package/dist/Infrastructure/ModelManager.js +885 -0
  61. package/dist/Infrastructure/ModelManager.js.map +1 -0
  62. package/dist/Infrastructure/ModelRegistry.d.ts +131 -0
  63. package/dist/Infrastructure/ModelRegistry.d.ts.map +1 -0
  64. package/dist/Infrastructure/ModelRegistry.js +122 -0
  65. package/dist/Infrastructure/ModelRegistry.js.map +1 -0
  66. package/dist/Infrastructure/OPFSStorage.d.ts +143 -0
  67. package/dist/Infrastructure/OPFSStorage.d.ts.map +1 -0
  68. package/dist/Infrastructure/OPFSStorage.js +330 -0
  69. package/dist/Infrastructure/OPFSStorage.js.map +1 -0
  70. package/dist/Infrastructure/VLMWorkerBridge.d.ts +211 -0
  71. package/dist/Infrastructure/VLMWorkerBridge.d.ts.map +1 -0
  72. package/dist/Infrastructure/VLMWorkerBridge.js +264 -0
  73. package/dist/Infrastructure/VLMWorkerBridge.js.map +1 -0
  74. package/dist/Infrastructure/VLMWorkerRuntime.d.ts +38 -0
  75. package/dist/Infrastructure/VLMWorkerRuntime.d.ts.map +1 -0
  76. package/dist/Infrastructure/VLMWorkerRuntime.js +503 -0
  77. package/dist/Infrastructure/VLMWorkerRuntime.js.map +1 -0
  78. package/dist/Infrastructure/VideoCapture.d.ts +118 -0
  79. package/dist/Infrastructure/VideoCapture.d.ts.map +1 -0
  80. package/dist/Infrastructure/VideoCapture.js +207 -0
  81. package/dist/Infrastructure/VideoCapture.js.map +1 -0
  82. package/dist/Public/Extensions/DiffusionTypes.d.ts +64 -0
  83. package/dist/Public/Extensions/DiffusionTypes.d.ts.map +1 -0
  84. package/dist/Public/Extensions/DiffusionTypes.js +28 -0
  85. package/dist/Public/Extensions/DiffusionTypes.js.map +1 -0
  86. package/dist/Public/Extensions/EmbeddingsTypes.d.ts +33 -0
  87. package/dist/Public/Extensions/EmbeddingsTypes.d.ts.map +1 -0
  88. package/dist/Public/Extensions/EmbeddingsTypes.js +13 -0
  89. package/dist/Public/Extensions/EmbeddingsTypes.js.map +1 -0
  90. package/dist/Public/Extensions/RunAnywhere+Diffusion.d.ts +44 -0
  91. package/dist/Public/Extensions/RunAnywhere+Diffusion.d.ts.map +1 -0
  92. package/dist/Public/Extensions/RunAnywhere+Diffusion.js +189 -0
  93. package/dist/Public/Extensions/RunAnywhere+Diffusion.js.map +1 -0
  94. package/dist/Public/Extensions/RunAnywhere+Embeddings.d.ts +56 -0
  95. package/dist/Public/Extensions/RunAnywhere+Embeddings.d.ts.map +1 -0
  96. package/dist/Public/Extensions/RunAnywhere+Embeddings.js +240 -0
  97. package/dist/Public/Extensions/RunAnywhere+Embeddings.js.map +1 -0
  98. package/dist/Public/Extensions/RunAnywhere+ModelManagement.d.ts +53 -0
  99. package/dist/Public/Extensions/RunAnywhere+ModelManagement.d.ts.map +1 -0
  100. package/dist/Public/Extensions/RunAnywhere+ModelManagement.js +153 -0
  101. package/dist/Public/Extensions/RunAnywhere+ModelManagement.js.map +1 -0
  102. package/dist/Public/Extensions/RunAnywhere+STT.d.ts +95 -0
  103. package/dist/Public/Extensions/RunAnywhere+STT.d.ts.map +1 -0
  104. package/dist/Public/Extensions/RunAnywhere+STT.js +417 -0
  105. package/dist/Public/Extensions/RunAnywhere+STT.js.map +1 -0
  106. package/dist/Public/Extensions/RunAnywhere+StructuredOutput.d.ts +69 -0
  107. package/dist/Public/Extensions/RunAnywhere+StructuredOutput.d.ts.map +1 -0
  108. package/dist/Public/Extensions/RunAnywhere+StructuredOutput.js +196 -0
  109. package/dist/Public/Extensions/RunAnywhere+StructuredOutput.js.map +1 -0
  110. package/dist/Public/Extensions/RunAnywhere+TTS.d.ts +55 -0
  111. package/dist/Public/Extensions/RunAnywhere+TTS.d.ts.map +1 -0
  112. package/dist/Public/Extensions/RunAnywhere+TTS.js +253 -0
  113. package/dist/Public/Extensions/RunAnywhere+TTS.js.map +1 -0
  114. package/dist/Public/Extensions/RunAnywhere+TextGeneration.d.ts +80 -0
  115. package/dist/Public/Extensions/RunAnywhere+TextGeneration.d.ts.map +1 -0
  116. package/dist/Public/Extensions/RunAnywhere+TextGeneration.js +436 -0
  117. package/dist/Public/Extensions/RunAnywhere+TextGeneration.js.map +1 -0
  118. package/dist/Public/Extensions/RunAnywhere+ToolCalling.d.ts +82 -0
  119. package/dist/Public/Extensions/RunAnywhere+ToolCalling.d.ts.map +1 -0
  120. package/dist/Public/Extensions/RunAnywhere+ToolCalling.js +576 -0
  121. package/dist/Public/Extensions/RunAnywhere+ToolCalling.js.map +1 -0
  122. package/dist/Public/Extensions/RunAnywhere+VAD.d.ts +70 -0
  123. package/dist/Public/Extensions/RunAnywhere+VAD.d.ts.map +1 -0
  124. package/dist/Public/Extensions/RunAnywhere+VAD.js +231 -0
  125. package/dist/Public/Extensions/RunAnywhere+VAD.js.map +1 -0
  126. package/dist/Public/Extensions/RunAnywhere+VLM.d.ts +58 -0
  127. package/dist/Public/Extensions/RunAnywhere+VLM.d.ts.map +1 -0
  128. package/dist/Public/Extensions/RunAnywhere+VLM.js +262 -0
  129. package/dist/Public/Extensions/RunAnywhere+VLM.js.map +1 -0
  130. package/dist/Public/Extensions/RunAnywhere+VoiceAgent.d.ts +49 -0
  131. package/dist/Public/Extensions/RunAnywhere+VoiceAgent.d.ts.map +1 -0
  132. package/dist/Public/Extensions/RunAnywhere+VoiceAgent.js +222 -0
  133. package/dist/Public/Extensions/RunAnywhere+VoiceAgent.js.map +1 -0
  134. package/dist/Public/Extensions/RunAnywhere+VoicePipeline.d.ts +63 -0
  135. package/dist/Public/Extensions/RunAnywhere+VoicePipeline.d.ts.map +1 -0
  136. package/dist/Public/Extensions/RunAnywhere+VoicePipeline.js +168 -0
  137. package/dist/Public/Extensions/RunAnywhere+VoicePipeline.js.map +1 -0
  138. package/dist/Public/Extensions/STTTypes.d.ts +53 -0
  139. package/dist/Public/Extensions/STTTypes.d.ts.map +1 -0
  140. package/dist/Public/Extensions/STTTypes.js +16 -0
  141. package/dist/Public/Extensions/STTTypes.js.map +1 -0
  142. package/dist/Public/Extensions/TTSTypes.d.ts +31 -0
  143. package/dist/Public/Extensions/TTSTypes.d.ts.map +1 -0
  144. package/dist/Public/Extensions/TTSTypes.js +3 -0
  145. package/dist/Public/Extensions/TTSTypes.js.map +1 -0
  146. package/dist/Public/Extensions/ToolCallingTypes.d.ts +78 -0
  147. package/dist/Public/Extensions/ToolCallingTypes.d.ts.map +1 -0
  148. package/dist/Public/Extensions/ToolCallingTypes.js +8 -0
  149. package/dist/Public/Extensions/ToolCallingTypes.js.map +1 -0
  150. package/dist/Public/Extensions/VADTypes.d.ts +30 -0
  151. package/dist/Public/Extensions/VADTypes.d.ts.map +1 -0
  152. package/dist/Public/Extensions/VADTypes.js +8 -0
  153. package/dist/Public/Extensions/VADTypes.js.map +1 -0
  154. package/dist/Public/Extensions/VLMTypes.d.ts +56 -0
  155. package/dist/Public/Extensions/VLMTypes.d.ts.map +1 -0
  156. package/dist/Public/Extensions/VLMTypes.js +24 -0
  157. package/dist/Public/Extensions/VLMTypes.js.map +1 -0
  158. package/dist/Public/Extensions/VoiceAgentTypes.d.ts +42 -0
  159. package/dist/Public/Extensions/VoiceAgentTypes.d.ts.map +1 -0
  160. package/dist/Public/Extensions/VoiceAgentTypes.js +12 -0
  161. package/dist/Public/Extensions/VoiceAgentTypes.js.map +1 -0
  162. package/dist/Public/Extensions/VoicePipelineTypes.d.ts +69 -0
  163. package/dist/Public/Extensions/VoicePipelineTypes.d.ts.map +1 -0
  164. package/dist/Public/Extensions/VoicePipelineTypes.js +9 -0
  165. package/dist/Public/Extensions/VoicePipelineTypes.js.map +1 -0
  166. package/dist/Public/RunAnywhere.d.ts +121 -0
  167. package/dist/Public/RunAnywhere.d.ts.map +1 -0
  168. package/dist/Public/RunAnywhere.js +332 -0
  169. package/dist/Public/RunAnywhere.js.map +1 -0
  170. package/dist/index.d.ts +67 -0
  171. package/dist/index.d.ts.map +1 -0
  172. package/dist/index.js +53 -0
  173. package/dist/index.js.map +1 -0
  174. package/dist/types/LLMTypes.d.ts +48 -0
  175. package/dist/types/LLMTypes.d.ts.map +1 -0
  176. package/dist/types/LLMTypes.js +8 -0
  177. package/dist/types/LLMTypes.js.map +1 -0
  178. package/dist/types/enums.d.ts +144 -0
  179. package/dist/types/enums.d.ts.map +1 -0
  180. package/dist/types/enums.js +159 -0
  181. package/dist/types/enums.js.map +1 -0
  182. package/dist/types/index.d.ts +9 -0
  183. package/dist/types/index.d.ts.map +1 -0
  184. package/dist/types/index.js +8 -0
  185. package/dist/types/index.js.map +1 -0
  186. package/dist/types/models.d.ts +154 -0
  187. package/dist/types/models.d.ts.map +1 -0
  188. package/dist/types/models.js +8 -0
  189. package/dist/types/models.js.map +1 -0
  190. package/dist/workers/vlm-worker.d.ts +9 -0
  191. package/dist/workers/vlm-worker.d.ts.map +1 -0
  192. package/dist/workers/vlm-worker.js +10 -0
  193. package/dist/workers/vlm-worker.js.map +1 -0
  194. package/package.json +62 -0
  195. package/wasm/racommons-webgpu.js +156 -0
  196. package/wasm/racommons-webgpu.wasm +0 -0
  197. package/wasm/racommons.js +126 -0
  198. package/wasm/racommons.wasm +0 -0
  199. package/wasm/sherpa/sherpa-onnx-asr.js +1538 -0
  200. package/wasm/sherpa/sherpa-onnx-glue-original.js +19 -0
  201. package/wasm/sherpa/sherpa-onnx-glue.js +17 -0
  202. package/wasm/sherpa/sherpa-onnx-tts.js +657 -0
  203. package/wasm/sherpa/sherpa-onnx-vad.js +337 -0
  204. package/wasm/sherpa/sherpa-onnx-wave.js +88 -0
  205. 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"}