@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,222 @@
|
|
|
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 { RunAnywhere } from '../RunAnywhere';
|
|
19
|
+
import { WASMBridge } from '../../Foundation/WASMBridge';
|
|
20
|
+
import { SDKError } from '../../Foundation/ErrorTypes';
|
|
21
|
+
import { SDKLogger } from '../../Foundation/SDKLogger';
|
|
22
|
+
import { EventBus } from '../../Foundation/EventBus';
|
|
23
|
+
import { SDKEventType } from '../../types/enums';
|
|
24
|
+
export { PipelineState } from './VoiceAgentTypes';
|
|
25
|
+
const logger = new SDKLogger('VoiceAgent');
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
// VoiceAgent Instance
|
|
28
|
+
// ---------------------------------------------------------------------------
|
|
29
|
+
export class VoiceAgentSession {
|
|
30
|
+
handle;
|
|
31
|
+
eventCallbackPtr = 0;
|
|
32
|
+
constructor(handle) {
|
|
33
|
+
this.handle = handle;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Load models for all components.
|
|
37
|
+
*/
|
|
38
|
+
async loadModels(models) {
|
|
39
|
+
const bridge = WASMBridge.shared;
|
|
40
|
+
if (models.stt) {
|
|
41
|
+
logger.info(`Loading STT model: ${models.stt.id}`);
|
|
42
|
+
const pathPtr = bridge.allocString(models.stt.path);
|
|
43
|
+
const idPtr = bridge.allocString(models.stt.id);
|
|
44
|
+
const namePtr = bridge.allocString(models.stt.name ?? models.stt.id);
|
|
45
|
+
try {
|
|
46
|
+
bridge.callWithCheck('rac_voice_agent_load_stt_model', ['number', 'number', 'number', 'number'], [this.handle, pathPtr, idPtr, namePtr]);
|
|
47
|
+
}
|
|
48
|
+
finally {
|
|
49
|
+
bridge.free(pathPtr);
|
|
50
|
+
bridge.free(idPtr);
|
|
51
|
+
bridge.free(namePtr);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
if (models.llm) {
|
|
55
|
+
logger.info(`Loading LLM model: ${models.llm.id}`);
|
|
56
|
+
const pathPtr = bridge.allocString(models.llm.path);
|
|
57
|
+
const idPtr = bridge.allocString(models.llm.id);
|
|
58
|
+
const namePtr = bridge.allocString(models.llm.name ?? models.llm.id);
|
|
59
|
+
try {
|
|
60
|
+
bridge.callWithCheck('rac_voice_agent_load_llm_model', ['number', 'number', 'number', 'number'], [this.handle, pathPtr, idPtr, namePtr]);
|
|
61
|
+
}
|
|
62
|
+
finally {
|
|
63
|
+
bridge.free(pathPtr);
|
|
64
|
+
bridge.free(idPtr);
|
|
65
|
+
bridge.free(namePtr);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (models.tts) {
|
|
69
|
+
logger.info(`Loading TTS voice: ${models.tts.id}`);
|
|
70
|
+
const pathPtr = bridge.allocString(models.tts.path);
|
|
71
|
+
const idPtr = bridge.allocString(models.tts.id);
|
|
72
|
+
const namePtr = bridge.allocString(models.tts.name ?? models.tts.id);
|
|
73
|
+
try {
|
|
74
|
+
bridge.callWithCheck('rac_voice_agent_load_tts_voice', ['number', 'number', 'number', 'number'], [this.handle, pathPtr, idPtr, namePtr]);
|
|
75
|
+
}
|
|
76
|
+
finally {
|
|
77
|
+
bridge.free(pathPtr);
|
|
78
|
+
bridge.free(idPtr);
|
|
79
|
+
bridge.free(namePtr);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// Initialize with loaded models
|
|
83
|
+
bridge.callWithCheck('rac_voice_agent_initialize_with_loaded_models', ['number'], [this.handle]);
|
|
84
|
+
logger.info('VoiceAgent initialized with loaded models');
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Process a complete voice turn (audio in -> text response + audio out).
|
|
88
|
+
*/
|
|
89
|
+
async processVoiceTurn(audioData) {
|
|
90
|
+
const bridge = WASMBridge.shared;
|
|
91
|
+
const m = bridge.module;
|
|
92
|
+
const audioPtr = m._malloc(audioData.length);
|
|
93
|
+
bridge.writeBytes(audioData, audioPtr);
|
|
94
|
+
// rac_voice_agent_result_t: { speech_detected, transcription, response, synthesized_audio, audio_size }
|
|
95
|
+
const resultSize = m._rac_wasm_sizeof_voice_agent_result();
|
|
96
|
+
const resultPtr = m._malloc(resultSize);
|
|
97
|
+
try {
|
|
98
|
+
bridge.callWithCheck('rac_voice_agent_process_voice_turn', ['number', 'number', 'number', 'number'], [this.handle, audioPtr, audioData.length, resultPtr]);
|
|
99
|
+
const speechDetected = m.getValue(resultPtr, 'i32') === 1;
|
|
100
|
+
const transcriptionPtr = m.getValue(resultPtr + 4, '*');
|
|
101
|
+
const responsePtr = m.getValue(resultPtr + 8, '*');
|
|
102
|
+
const audioDataPtr = m.getValue(resultPtr + 12, '*');
|
|
103
|
+
const audioSize = m.getValue(resultPtr + 16, 'i32');
|
|
104
|
+
const result = {
|
|
105
|
+
speechDetected,
|
|
106
|
+
transcription: transcriptionPtr ? bridge.readString(transcriptionPtr) : undefined,
|
|
107
|
+
response: responsePtr ? bridge.readString(responsePtr) : undefined,
|
|
108
|
+
};
|
|
109
|
+
if (audioDataPtr && audioSize > 0) {
|
|
110
|
+
const numSamples = audioSize / 4;
|
|
111
|
+
result.synthesizedAudio = bridge.readFloat32Array(audioDataPtr, numSamples);
|
|
112
|
+
}
|
|
113
|
+
// Free C result
|
|
114
|
+
bridge.callFunction('rac_voice_agent_result_free', null, ['number'], [resultPtr]);
|
|
115
|
+
EventBus.shared.emit('voice.turnCompleted', SDKEventType.Voice, {
|
|
116
|
+
speechDetected,
|
|
117
|
+
transcription: result.transcription ?? '',
|
|
118
|
+
response: result.response ?? '',
|
|
119
|
+
});
|
|
120
|
+
return result;
|
|
121
|
+
}
|
|
122
|
+
finally {
|
|
123
|
+
m._free(audioPtr);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/** Check if the voice agent is ready. */
|
|
127
|
+
get isReady() {
|
|
128
|
+
const bridge = WASMBridge.shared;
|
|
129
|
+
const m = bridge.module;
|
|
130
|
+
const outPtr = m._malloc(4);
|
|
131
|
+
try {
|
|
132
|
+
bridge.callFunction('rac_voice_agent_is_ready', 'number', ['number', 'number'], [this.handle, outPtr]);
|
|
133
|
+
return m.getValue(outPtr, 'i32') === 1;
|
|
134
|
+
}
|
|
135
|
+
finally {
|
|
136
|
+
m._free(outPtr);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/** Transcribe audio without the full pipeline. */
|
|
140
|
+
async transcribe(audioData) {
|
|
141
|
+
const bridge = WASMBridge.shared;
|
|
142
|
+
const m = bridge.module;
|
|
143
|
+
const audioPtr = m._malloc(audioData.length);
|
|
144
|
+
bridge.writeBytes(audioData, audioPtr);
|
|
145
|
+
const outPtr = m._malloc(4);
|
|
146
|
+
try {
|
|
147
|
+
bridge.callWithCheck('rac_voice_agent_transcribe', ['number', 'number', 'number', 'number'], [this.handle, audioPtr, audioData.length, outPtr]);
|
|
148
|
+
const textPtr = m.getValue(outPtr, '*');
|
|
149
|
+
const text = bridge.readString(textPtr);
|
|
150
|
+
if (textPtr)
|
|
151
|
+
m._free(textPtr);
|
|
152
|
+
return text;
|
|
153
|
+
}
|
|
154
|
+
finally {
|
|
155
|
+
m._free(audioPtr);
|
|
156
|
+
m._free(outPtr);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/** Generate LLM response without the full pipeline. */
|
|
160
|
+
async generateResponse(prompt) {
|
|
161
|
+
const bridge = WASMBridge.shared;
|
|
162
|
+
const m = bridge.module;
|
|
163
|
+
const promptPtr = bridge.allocString(prompt);
|
|
164
|
+
const outPtr = m._malloc(4);
|
|
165
|
+
try {
|
|
166
|
+
bridge.callWithCheck('rac_voice_agent_generate_response', ['number', 'number', 'number'], [this.handle, promptPtr, outPtr]);
|
|
167
|
+
const textPtr = m.getValue(outPtr, '*');
|
|
168
|
+
const text = bridge.readString(textPtr);
|
|
169
|
+
if (textPtr)
|
|
170
|
+
m._free(textPtr);
|
|
171
|
+
return text;
|
|
172
|
+
}
|
|
173
|
+
finally {
|
|
174
|
+
bridge.free(promptPtr);
|
|
175
|
+
m._free(outPtr);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/** Destroy the voice agent session. */
|
|
179
|
+
destroy() {
|
|
180
|
+
if (this.eventCallbackPtr !== 0) {
|
|
181
|
+
try {
|
|
182
|
+
WASMBridge.shared.module.removeFunction(this.eventCallbackPtr);
|
|
183
|
+
}
|
|
184
|
+
catch { /* ignore */ }
|
|
185
|
+
this.eventCallbackPtr = 0;
|
|
186
|
+
}
|
|
187
|
+
if (this.handle !== 0) {
|
|
188
|
+
try {
|
|
189
|
+
WASMBridge.shared.callFunction('rac_voice_agent_destroy', null, ['number'], [this.handle]);
|
|
190
|
+
}
|
|
191
|
+
catch { /* ignore */ }
|
|
192
|
+
this.handle = 0;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
// ---------------------------------------------------------------------------
|
|
197
|
+
// VoiceAgent Factory
|
|
198
|
+
// ---------------------------------------------------------------------------
|
|
199
|
+
export const VoiceAgent = {
|
|
200
|
+
/**
|
|
201
|
+
* Create a standalone VoiceAgent session.
|
|
202
|
+
* The agent manages its own STT, LLM, TTS, and VAD components.
|
|
203
|
+
*/
|
|
204
|
+
async create() {
|
|
205
|
+
if (!RunAnywhere.isInitialized) {
|
|
206
|
+
throw SDKError.notInitialized();
|
|
207
|
+
}
|
|
208
|
+
const bridge = WASMBridge.shared;
|
|
209
|
+
const m = bridge.module;
|
|
210
|
+
const handlePtr = m._malloc(4);
|
|
211
|
+
const result = bridge.callFunction('rac_voice_agent_create_standalone', 'number', ['number'], [handlePtr]);
|
|
212
|
+
if (result !== 0) {
|
|
213
|
+
m._free(handlePtr);
|
|
214
|
+
throw SDKError.fromRACResult(result, 'rac_voice_agent_create_standalone');
|
|
215
|
+
}
|
|
216
|
+
const handle = m.getValue(handlePtr, 'i32');
|
|
217
|
+
m._free(handlePtr);
|
|
218
|
+
logger.info('VoiceAgent session created');
|
|
219
|
+
return new VoiceAgentSession(handle);
|
|
220
|
+
},
|
|
221
|
+
};
|
|
222
|
+
//# sourceMappingURL=RunAnywhere+VoiceAgent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RunAnywhere+VoiceAgent.js","sourceRoot":"","sources":["../../../src/Public/Extensions/RunAnywhere+VoiceAgent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RunAnywhere Web SDK - VoicePipeline Extension
|
|
3
|
+
*
|
|
4
|
+
* High-level streaming voice orchestrator: STT -> LLM (streaming) -> TTS.
|
|
5
|
+
*
|
|
6
|
+
* Unlike VoiceAgent (which uses the C API for a batch pipeline), VoicePipeline
|
|
7
|
+
* composes the existing TypeScript SDK extensions (STT, TextGeneration, TTS)
|
|
8
|
+
* and provides streaming callbacks so the UI can update in real-time as each
|
|
9
|
+
* stage progresses.
|
|
10
|
+
*
|
|
11
|
+
* Usage:
|
|
12
|
+
* ```typescript
|
|
13
|
+
* import { VoicePipeline } from '@runanywhere/web';
|
|
14
|
+
*
|
|
15
|
+
* const pipeline = new VoicePipeline();
|
|
16
|
+
* const result = await pipeline.processTurn(audioData, {
|
|
17
|
+
* maxTokens: 150,
|
|
18
|
+
* systemPrompt: 'You are a helpful voice assistant.',
|
|
19
|
+
* }, {
|
|
20
|
+
* onTranscription: (text) => updateUI('You said: ' + text),
|
|
21
|
+
* onResponseToken: (_tok, acc) => updateUI('Assistant: ' + acc),
|
|
22
|
+
* onSynthesisComplete: (audio, sr) => playAudio(audio, sr),
|
|
23
|
+
* });
|
|
24
|
+
* ```
|
|
25
|
+
*
|
|
26
|
+
* The pipeline does NOT handle audio capture, VAD, or playback — those are
|
|
27
|
+
* app-level concerns (mic control, VAD thresholds, speaker output).
|
|
28
|
+
*/
|
|
29
|
+
import { PipelineState } from './VoiceAgentTypes';
|
|
30
|
+
import type { VoicePipelineCallbacks, VoicePipelineOptions, VoicePipelineTurnResult } from './VoicePipelineTypes';
|
|
31
|
+
export { PipelineState } from './VoiceAgentTypes';
|
|
32
|
+
export type { VoicePipelineCallbacks, VoicePipelineOptions, VoicePipelineTurnResult, } from './VoicePipelineTypes';
|
|
33
|
+
/**
|
|
34
|
+
* Streaming voice pipeline that orchestrates STT -> LLM -> TTS.
|
|
35
|
+
*
|
|
36
|
+
* Create one instance and reuse it across conversation turns. Each call to
|
|
37
|
+
* `processTurn()` runs the full pipeline once and returns the result.
|
|
38
|
+
*
|
|
39
|
+
* The LLM step uses streaming generation, so the `onResponseToken` callback
|
|
40
|
+
* fires for each token — enabling real-time UI updates.
|
|
41
|
+
*/
|
|
42
|
+
export declare class VoicePipeline {
|
|
43
|
+
private _cancelGeneration;
|
|
44
|
+
private _state;
|
|
45
|
+
/** Current pipeline state. */
|
|
46
|
+
get state(): PipelineState;
|
|
47
|
+
/**
|
|
48
|
+
* Run a complete voice turn: audio in -> transcription -> LLM response -> TTS audio.
|
|
49
|
+
*
|
|
50
|
+
* @param audioData Float32Array of PCM samples (mono, typically 16 kHz).
|
|
51
|
+
* @param options LLM / TTS / STT configuration for this turn.
|
|
52
|
+
* @param callbacks Streaming callbacks for real-time UI updates.
|
|
53
|
+
* @returns The full turn result once all stages complete.
|
|
54
|
+
*/
|
|
55
|
+
processTurn(audioData: Float32Array, options?: VoicePipelineOptions, callbacks?: VoicePipelineCallbacks): Promise<VoicePipelineTurnResult>;
|
|
56
|
+
/**
|
|
57
|
+
* Cancel in-progress LLM generation.
|
|
58
|
+
* Safe to call at any time — no-ops if nothing is in progress.
|
|
59
|
+
*/
|
|
60
|
+
cancel(): void;
|
|
61
|
+
private transition;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=RunAnywhere+VoicePipeline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RunAnywhere+VoicePipeline.d.ts","sourceRoot":"","sources":["../../../src/Public/Extensions/RunAnywhere+VoicePipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAMH,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EACV,sBAAsB,EACtB,oBAAoB,EACpB,uBAAuB,EACxB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,YAAY,EACV,sBAAsB,EACtB,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,sBAAsB,CAAC;AAqB9B;;;;;;;;GAQG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,iBAAiB,CAA6B;IACtD,OAAO,CAAC,MAAM,CAAqC;IAEnD,8BAA8B;IAC9B,IAAI,KAAK,IAAI,aAAa,CAEzB;IAED;;;;;;;OAOG;IACG,WAAW,CACf,SAAS,EAAE,YAAY,EACvB,OAAO,CAAC,EAAE,oBAAoB,EAC9B,SAAS,CAAC,EAAE,sBAAsB,GACjC,OAAO,CAAC,uBAAuB,CAAC;IAgGnC;;;OAGG;IACH,MAAM,IAAI,IAAI;IAYd,OAAO,CAAC,UAAU;CAInB"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RunAnywhere Web SDK - VoicePipeline Extension
|
|
3
|
+
*
|
|
4
|
+
* High-level streaming voice orchestrator: STT -> LLM (streaming) -> TTS.
|
|
5
|
+
*
|
|
6
|
+
* Unlike VoiceAgent (which uses the C API for a batch pipeline), VoicePipeline
|
|
7
|
+
* composes the existing TypeScript SDK extensions (STT, TextGeneration, TTS)
|
|
8
|
+
* and provides streaming callbacks so the UI can update in real-time as each
|
|
9
|
+
* stage progresses.
|
|
10
|
+
*
|
|
11
|
+
* Usage:
|
|
12
|
+
* ```typescript
|
|
13
|
+
* import { VoicePipeline } from '@runanywhere/web';
|
|
14
|
+
*
|
|
15
|
+
* const pipeline = new VoicePipeline();
|
|
16
|
+
* const result = await pipeline.processTurn(audioData, {
|
|
17
|
+
* maxTokens: 150,
|
|
18
|
+
* systemPrompt: 'You are a helpful voice assistant.',
|
|
19
|
+
* }, {
|
|
20
|
+
* onTranscription: (text) => updateUI('You said: ' + text),
|
|
21
|
+
* onResponseToken: (_tok, acc) => updateUI('Assistant: ' + acc),
|
|
22
|
+
* onSynthesisComplete: (audio, sr) => playAudio(audio, sr),
|
|
23
|
+
* });
|
|
24
|
+
* ```
|
|
25
|
+
*
|
|
26
|
+
* The pipeline does NOT handle audio capture, VAD, or playback — those are
|
|
27
|
+
* app-level concerns (mic control, VAD thresholds, speaker output).
|
|
28
|
+
*/
|
|
29
|
+
import { STT } from './RunAnywhere+STT';
|
|
30
|
+
import { TextGeneration } from './RunAnywhere+TextGeneration';
|
|
31
|
+
import { TTS } from './RunAnywhere+TTS';
|
|
32
|
+
import { SDKLogger } from '../../Foundation/SDKLogger';
|
|
33
|
+
import { PipelineState } from './VoiceAgentTypes';
|
|
34
|
+
export { PipelineState } from './VoiceAgentTypes';
|
|
35
|
+
const logger = new SDKLogger('VoicePipeline');
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
// Default options
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
const DEFAULT_OPTIONS = {
|
|
40
|
+
maxTokens: 150,
|
|
41
|
+
temperature: 0.7,
|
|
42
|
+
systemPrompt: 'You are a helpful voice assistant. Keep responses concise — 1-3 sentences. Be conversational and friendly.',
|
|
43
|
+
ttsSpeed: 1.0,
|
|
44
|
+
sampleRate: 16000,
|
|
45
|
+
};
|
|
46
|
+
// ---------------------------------------------------------------------------
|
|
47
|
+
// VoicePipeline
|
|
48
|
+
// ---------------------------------------------------------------------------
|
|
49
|
+
/**
|
|
50
|
+
* Streaming voice pipeline that orchestrates STT -> LLM -> TTS.
|
|
51
|
+
*
|
|
52
|
+
* Create one instance and reuse it across conversation turns. Each call to
|
|
53
|
+
* `processTurn()` runs the full pipeline once and returns the result.
|
|
54
|
+
*
|
|
55
|
+
* The LLM step uses streaming generation, so the `onResponseToken` callback
|
|
56
|
+
* fires for each token — enabling real-time UI updates.
|
|
57
|
+
*/
|
|
58
|
+
export class VoicePipeline {
|
|
59
|
+
_cancelGeneration = null;
|
|
60
|
+
_state = PipelineState.Idle;
|
|
61
|
+
/** Current pipeline state. */
|
|
62
|
+
get state() {
|
|
63
|
+
return this._state;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Run a complete voice turn: audio in -> transcription -> LLM response -> TTS audio.
|
|
67
|
+
*
|
|
68
|
+
* @param audioData Float32Array of PCM samples (mono, typically 16 kHz).
|
|
69
|
+
* @param options LLM / TTS / STT configuration for this turn.
|
|
70
|
+
* @param callbacks Streaming callbacks for real-time UI updates.
|
|
71
|
+
* @returns The full turn result once all stages complete.
|
|
72
|
+
*/
|
|
73
|
+
async processTurn(audioData, options, callbacks) {
|
|
74
|
+
const opts = { ...DEFAULT_OPTIONS, ...options };
|
|
75
|
+
const totalStart = performance.now();
|
|
76
|
+
// ── Step 1: STT ────────────────────────────────────────────────────
|
|
77
|
+
this.transition(PipelineState.ProcessingSTT, callbacks);
|
|
78
|
+
const sttStart = performance.now();
|
|
79
|
+
logger.info(`STT: ${(audioData.length / opts.sampleRate).toFixed(1)}s of audio`);
|
|
80
|
+
const sttResult = await STT.transcribe(audioData, {
|
|
81
|
+
sampleRate: opts.sampleRate,
|
|
82
|
+
});
|
|
83
|
+
const sttMs = performance.now() - sttStart;
|
|
84
|
+
const userText = sttResult.text.trim();
|
|
85
|
+
logger.info(`STT complete: "${userText}" (${sttMs.toFixed(0)}ms)`);
|
|
86
|
+
callbacks?.onTranscription?.(userText, sttResult);
|
|
87
|
+
if (!userText) {
|
|
88
|
+
this.transition(PipelineState.Idle, callbacks);
|
|
89
|
+
return {
|
|
90
|
+
transcription: '',
|
|
91
|
+
response: '',
|
|
92
|
+
timing: { sttMs, llmMs: 0, ttsMs: 0, totalMs: performance.now() - totalStart },
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
// ── Step 2: LLM (streaming) ────────────────────────────────────────
|
|
96
|
+
this.transition(PipelineState.GeneratingResponse, callbacks);
|
|
97
|
+
const llmStart = performance.now();
|
|
98
|
+
const { stream, result: llmResultPromise, cancel } = await TextGeneration.generateStream(userText, {
|
|
99
|
+
maxTokens: opts.maxTokens,
|
|
100
|
+
temperature: opts.temperature,
|
|
101
|
+
systemPrompt: opts.systemPrompt,
|
|
102
|
+
});
|
|
103
|
+
this._cancelGeneration = cancel;
|
|
104
|
+
let accumulated = '';
|
|
105
|
+
for await (const token of stream) {
|
|
106
|
+
accumulated += token;
|
|
107
|
+
callbacks?.onResponseToken?.(token, accumulated);
|
|
108
|
+
}
|
|
109
|
+
this._cancelGeneration = null;
|
|
110
|
+
const llmResult = await llmResultPromise;
|
|
111
|
+
const fullResponse = llmResult.text || accumulated;
|
|
112
|
+
const llmMs = performance.now() - llmStart;
|
|
113
|
+
logger.info(`LLM complete: ${llmResult.tokensUsed} tokens, ${llmResult.tokensPerSecond.toFixed(1)} tok/s (${llmMs.toFixed(0)}ms)`);
|
|
114
|
+
callbacks?.onResponseComplete?.(fullResponse, llmResult);
|
|
115
|
+
if (!fullResponse.trim()) {
|
|
116
|
+
this.transition(PipelineState.Idle, callbacks);
|
|
117
|
+
return {
|
|
118
|
+
transcription: userText,
|
|
119
|
+
response: '',
|
|
120
|
+
timing: { sttMs, llmMs, ttsMs: 0, totalMs: performance.now() - totalStart },
|
|
121
|
+
llmResult,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
// ── Step 3: TTS ────────────────────────────────────────────────────
|
|
125
|
+
this.transition(PipelineState.PlayingTTS, callbacks);
|
|
126
|
+
const ttsStart = performance.now();
|
|
127
|
+
const ttsResult = await TTS.synthesize(fullResponse.trim(), {
|
|
128
|
+
speed: opts.ttsSpeed,
|
|
129
|
+
});
|
|
130
|
+
const ttsMs = performance.now() - ttsStart;
|
|
131
|
+
logger.info(`TTS complete: ${ttsResult.durationMs}ms audio in ${ttsResult.processingTimeMs}ms`);
|
|
132
|
+
callbacks?.onSynthesisComplete?.(ttsResult.audioData, ttsResult.sampleRate, ttsResult);
|
|
133
|
+
// ── Done ───────────────────────────────────────────────────────────
|
|
134
|
+
this.transition(PipelineState.Idle, callbacks);
|
|
135
|
+
return {
|
|
136
|
+
transcription: userText,
|
|
137
|
+
response: fullResponse,
|
|
138
|
+
synthesizedAudio: ttsResult.audioData,
|
|
139
|
+
sampleRate: ttsResult.sampleRate,
|
|
140
|
+
timing: {
|
|
141
|
+
sttMs,
|
|
142
|
+
llmMs,
|
|
143
|
+
ttsMs,
|
|
144
|
+
totalMs: performance.now() - totalStart,
|
|
145
|
+
},
|
|
146
|
+
llmResult,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Cancel in-progress LLM generation.
|
|
151
|
+
* Safe to call at any time — no-ops if nothing is in progress.
|
|
152
|
+
*/
|
|
153
|
+
cancel() {
|
|
154
|
+
if (this._cancelGeneration) {
|
|
155
|
+
this._cancelGeneration();
|
|
156
|
+
this._cancelGeneration = null;
|
|
157
|
+
logger.info('Generation cancelled');
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
// ---------------------------------------------------------------------------
|
|
161
|
+
// Internals
|
|
162
|
+
// ---------------------------------------------------------------------------
|
|
163
|
+
transition(newState, callbacks) {
|
|
164
|
+
this._state = newState;
|
|
165
|
+
callbacks?.onStateChange?.(newState);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=RunAnywhere+VoicePipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RunAnywhere+VoicePipeline.js","sourceRoot":"","sources":["../../../src/Public/Extensions/RunAnywhere+VoicePipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAOlD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAOlD,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,eAAe,CAAC,CAAC;AAE9C,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E,MAAM,eAAe,GAAmC;IACtD,SAAS,EAAE,GAAG;IACd,WAAW,EAAE,GAAG;IAChB,YAAY,EACV,4GAA4G;IAC9G,QAAQ,EAAE,GAAG;IACb,UAAU,EAAE,KAAK;CAClB,CAAC;AAEF,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E;;;;;;;;GAQG;AACH,MAAM,OAAO,aAAa;IAChB,iBAAiB,GAAwB,IAAI,CAAC;IAC9C,MAAM,GAAkB,aAAa,CAAC,IAAI,CAAC;IAEnD,8BAA8B;IAC9B,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,WAAW,CACf,SAAuB,EACvB,OAA8B,EAC9B,SAAkC;QAElC,MAAM,IAAI,GAAG,EAAE,GAAG,eAAe,EAAE,GAAG,OAAO,EAAE,CAAC;QAChD,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAErC,sEAAsE;QACtE,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;QAExD,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;QAEjF,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,SAAS,EAAE;YAChD,UAAU,EAAE,IAAI,CAAC,UAAU;SAC5B,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC;QAC3C,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAEvC,MAAM,CAAC,IAAI,CAAC,kBAAkB,QAAQ,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACnE,SAAS,EAAE,eAAe,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QAElD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YAC/C,OAAO;gBACL,aAAa,EAAE,EAAE;gBACjB,QAAQ,EAAE,EAAE;gBACZ,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,UAAU,EAAE;aAC/E,CAAC;QACJ,CAAC;QAED,sEAAsE;QACtE,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC;QAE7D,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QACnC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,GAAG,MAAM,cAAc,CAAC,cAAc,CACtF,QAAQ,EACR;YACE,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,YAAY,EAAE,IAAI,CAAC,YAAY;SAChC,CACF,CAAC;QACF,IAAI,CAAC,iBAAiB,GAAG,MAAM,CAAC;QAEhC,IAAI,WAAW,GAAG,EAAE,CAAC;QACrB,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YACjC,WAAW,IAAI,KAAK,CAAC;YACrB,SAAS,EAAE,eAAe,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QACnD,CAAC;QACD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAE9B,MAAM,SAAS,GAAG,MAAM,gBAAgB,CAAC;QACzC,MAAM,YAAY,GAAG,SAAS,CAAC,IAAI,IAAI,WAAW,CAAC;QACnD,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC;QAE3C,MAAM,CAAC,IAAI,CAAC,iBAAiB,SAAS,CAAC,UAAU,YAAY,SAAS,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACnI,SAAS,EAAE,kBAAkB,EAAE,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;QAEzD,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC;YACzB,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;YAC/C,OAAO;gBACL,aAAa,EAAE,QAAQ;gBACvB,QAAQ,EAAE,EAAE;gBACZ,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,UAAU,EAAE;gBAC3E,SAAS;aACV,CAAC;QACJ,CAAC;QAED,sEAAsE;QACtE,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QAErD,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QACnC,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE;YAC1D,KAAK,EAAE,IAAI,CAAC,QAAQ;SACrB,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC;QAE3C,MAAM,CAAC,IAAI,CAAC,iBAAiB,SAAS,CAAC,UAAU,eAAe,SAAS,CAAC,gBAAgB,IAAI,CAAC,CAAC;QAChG,SAAS,EAAE,mBAAmB,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QAEvF,sEAAsE;QACtE,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAE/C,OAAO;YACL,aAAa,EAAE,QAAQ;YACvB,QAAQ,EAAE,YAAY;YACtB,gBAAgB,EAAE,SAAS,CAAC,SAAS;YACrC,UAAU,EAAE,SAAS,CAAC,UAAU;YAChC,MAAM,EAAE;gBACN,KAAK;gBACL,KAAK;gBACL,KAAK;gBACL,OAAO,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,UAAU;aACxC;YACD,SAAS;SACV,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,MAAM;QACJ,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC3B,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACzB,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED,8EAA8E;IAC9E,YAAY;IACZ,8EAA8E;IAEtE,UAAU,CAAC,QAAuB,EAAE,SAAkC;QAC5E,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAC;QACvB,SAAS,EAAE,aAAa,EAAE,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC;CACF"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RunAnywhere Web SDK - Speech-to-Text Types
|
|
3
|
+
*
|
|
4
|
+
* Type definitions for STT models and transcription results.
|
|
5
|
+
* Separated from the main STT extension for clean imports.
|
|
6
|
+
*/
|
|
7
|
+
export declare enum STTModelType {
|
|
8
|
+
Whisper = "whisper",
|
|
9
|
+
Zipformer = "zipformer",
|
|
10
|
+
Paraformer = "paraformer"
|
|
11
|
+
}
|
|
12
|
+
export interface STTModelConfig {
|
|
13
|
+
modelId: string;
|
|
14
|
+
type: STTModelType;
|
|
15
|
+
/**
|
|
16
|
+
* Model files already written to sherpa-onnx virtual FS.
|
|
17
|
+
* Paths are FS paths (e.g., '/models/whisper-tiny/encoder.onnx').
|
|
18
|
+
*/
|
|
19
|
+
modelFiles: STTWhisperFiles | STTZipformerFiles | STTParaformerFiles;
|
|
20
|
+
/** Sample rate (default: 16000) */
|
|
21
|
+
sampleRate?: number;
|
|
22
|
+
/** Language code (e.g., 'en', 'zh') */
|
|
23
|
+
language?: string;
|
|
24
|
+
}
|
|
25
|
+
export interface STTWhisperFiles {
|
|
26
|
+
encoder: string;
|
|
27
|
+
decoder: string;
|
|
28
|
+
tokens: string;
|
|
29
|
+
}
|
|
30
|
+
export interface STTZipformerFiles {
|
|
31
|
+
encoder: string;
|
|
32
|
+
decoder: string;
|
|
33
|
+
joiner: string;
|
|
34
|
+
tokens: string;
|
|
35
|
+
}
|
|
36
|
+
export interface STTParaformerFiles {
|
|
37
|
+
model: string;
|
|
38
|
+
tokens: string;
|
|
39
|
+
}
|
|
40
|
+
export interface STTTranscriptionResult {
|
|
41
|
+
text: string;
|
|
42
|
+
confidence: number;
|
|
43
|
+
detectedLanguage?: string;
|
|
44
|
+
processingTimeMs: number;
|
|
45
|
+
words?: STTWord[];
|
|
46
|
+
}
|
|
47
|
+
export interface STTWord {
|
|
48
|
+
text: string;
|
|
49
|
+
startMs: number;
|
|
50
|
+
endMs: number;
|
|
51
|
+
confidence: number;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=STTTypes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"STTTypes.d.ts","sourceRoot":"","sources":["../../../src/Public/Extensions/STTTypes.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,oBAAY,YAAY;IACtB,OAAO,YAAY;IACnB,SAAS,cAAc;IACvB,UAAU,eAAe;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,YAAY,CAAC;IACnB;;;OAGG;IACH,UAAU,EAAE,eAAe,GAAG,iBAAiB,GAAG,kBAAkB,CAAC;IACrE,mCAAmC;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uCAAuC;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RunAnywhere Web SDK - Speech-to-Text Types
|
|
3
|
+
*
|
|
4
|
+
* Type definitions for STT models and transcription results.
|
|
5
|
+
* Separated from the main STT extension for clean imports.
|
|
6
|
+
*/
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
// STT Types
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
export var STTModelType;
|
|
11
|
+
(function (STTModelType) {
|
|
12
|
+
STTModelType["Whisper"] = "whisper";
|
|
13
|
+
STTModelType["Zipformer"] = "zipformer";
|
|
14
|
+
STTModelType["Paraformer"] = "paraformer";
|
|
15
|
+
})(STTModelType || (STTModelType = {}));
|
|
16
|
+
//# sourceMappingURL=STTTypes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"STTTypes.js","sourceRoot":"","sources":["../../../src/Public/Extensions/STTTypes.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,MAAM,CAAN,IAAY,YAIX;AAJD,WAAY,YAAY;IACtB,mCAAmB,CAAA;IACnB,uCAAuB,CAAA;IACvB,yCAAyB,CAAA;AAC3B,CAAC,EAJW,YAAY,KAAZ,YAAY,QAIvB"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/** RunAnywhere Web SDK - TTS Types */
|
|
2
|
+
export interface TTSVoiceConfig {
|
|
3
|
+
voiceId: string;
|
|
4
|
+
/** Path to the VITS/Piper model ONNX file in sherpa FS */
|
|
5
|
+
modelPath: string;
|
|
6
|
+
/** Path to the tokens.txt file in sherpa FS */
|
|
7
|
+
tokensPath: string;
|
|
8
|
+
/** Path to the espeak-ng-data directory in sherpa FS (for Piper models) */
|
|
9
|
+
dataDir?: string;
|
|
10
|
+
/** Path to the lexicon file in sherpa FS (optional) */
|
|
11
|
+
lexicon?: string;
|
|
12
|
+
/** Number of threads (default: 1) */
|
|
13
|
+
numThreads?: number;
|
|
14
|
+
}
|
|
15
|
+
export interface TTSSynthesisResult {
|
|
16
|
+
/** Raw PCM audio data */
|
|
17
|
+
audioData: Float32Array;
|
|
18
|
+
/** Audio sample rate */
|
|
19
|
+
sampleRate: number;
|
|
20
|
+
/** Duration in milliseconds */
|
|
21
|
+
durationMs: number;
|
|
22
|
+
/** Processing time in milliseconds */
|
|
23
|
+
processingTimeMs: number;
|
|
24
|
+
}
|
|
25
|
+
export interface TTSSynthesizeOptions {
|
|
26
|
+
/** Speaker ID for multi-speaker models (default: 0) */
|
|
27
|
+
speakerId?: number;
|
|
28
|
+
/** Speed factor (default: 1.0, >1 = faster, <1 = slower) */
|
|
29
|
+
speed?: number;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=TTSTypes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TTSTypes.d.ts","sourceRoot":"","sources":["../../../src/Public/Extensions/TTSTypes.ts"],"names":[],"mappings":"AAAA,sCAAsC;AAEtC,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,SAAS,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,UAAU,EAAE,MAAM,CAAC;IACnB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qCAAqC;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,yBAAyB;IACzB,SAAS,EAAE,YAAY,CAAC;IACxB,wBAAwB;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,+BAA+B;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,oBAAoB;IACnC,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TTSTypes.js","sourceRoot":"","sources":["../../../src/Public/Extensions/TTSTypes.ts"],"names":[],"mappings":"AAAA,sCAAsC"}
|