@elizaos/capacitor-swabble 1.0.0
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/ElizaosCapacitorSwabble.podspec +18 -0
- package/android/build.gradle +50 -0
- package/android/src/main/AndroidManifest.xml +4 -0
- package/android/src/main/java/ai/eliza/plugins/swabble/SwabblePlugin.kt +840 -0
- package/dist/esm/definitions.d.ts +218 -0
- package/dist/esm/definitions.d.ts.map +1 -0
- package/dist/esm/definitions.js +1 -0
- package/dist/esm/index.d.ts +4 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +6 -0
- package/dist/esm/web.d.ts +54 -0
- package/dist/esm/web.d.ts.map +1 -0
- package/dist/esm/web.js +461 -0
- package/dist/plugin.cjs.js +477 -0
- package/dist/plugin.cjs.js.map +1 -0
- package/dist/plugin.js +480 -0
- package/dist/plugin.js.map +1 -0
- package/electrobun/src/global.d.ts +1 -0
- package/electrobun/src/index.ts +786 -0
- package/electrobun/tsconfig.json +16 -0
- package/ios/Sources/SwabblePlugin/SwabblePlugin.swift +1156 -0
- package/package.json +84 -0
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import type { PluginListenerHandle } from "@capacitor/core";
|
|
2
|
+
/**
|
|
3
|
+
* Configuration for voice wake detection
|
|
4
|
+
*/
|
|
5
|
+
export interface SwabbleConfig {
|
|
6
|
+
/** Wake word triggers (e.g., ["eliza"]) */
|
|
7
|
+
triggers: string[];
|
|
8
|
+
/** Minimum gap after trigger before command starts (seconds) */
|
|
9
|
+
minPostTriggerGap?: number;
|
|
10
|
+
/** Minimum command length in characters */
|
|
11
|
+
minCommandLength?: number;
|
|
12
|
+
/** Locale identifier for speech recognition (e.g., "en-US") */
|
|
13
|
+
locale?: string;
|
|
14
|
+
/** Audio sample rate in Hz (default: 16000) */
|
|
15
|
+
sampleRate?: number;
|
|
16
|
+
/** Whisper.cpp model size for desktop (optional) */
|
|
17
|
+
modelSize?: "tiny" | "base" | "small" | "medium" | "large";
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Options for starting voice wake detection
|
|
21
|
+
*/
|
|
22
|
+
export interface SwabbleStartOptions {
|
|
23
|
+
/** Configuration for wake word detection */
|
|
24
|
+
config: SwabbleConfig;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Result of starting voice wake detection
|
|
28
|
+
*/
|
|
29
|
+
export interface SwabbleStartResult {
|
|
30
|
+
/** Whether voice wake started successfully */
|
|
31
|
+
started: boolean;
|
|
32
|
+
/** Error message if start failed */
|
|
33
|
+
error?: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Wake word detection event
|
|
37
|
+
*/
|
|
38
|
+
export interface SwabbleWakeWordEvent {
|
|
39
|
+
/** The detected wake word */
|
|
40
|
+
wakeWord: string;
|
|
41
|
+
/** The command text following the wake word */
|
|
42
|
+
command: string;
|
|
43
|
+
/** Full transcript text */
|
|
44
|
+
transcript: string;
|
|
45
|
+
/** Time gap between wake word and command start */
|
|
46
|
+
postGap: number;
|
|
47
|
+
/** Confidence score (0-1) if available */
|
|
48
|
+
confidence?: number;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Speech segment with timing information
|
|
52
|
+
*/
|
|
53
|
+
export interface SwabbleSpeechSegment {
|
|
54
|
+
/** Segment text */
|
|
55
|
+
text: string;
|
|
56
|
+
/** Start time in seconds from audio start */
|
|
57
|
+
start: number;
|
|
58
|
+
/** Duration in seconds */
|
|
59
|
+
duration: number;
|
|
60
|
+
/** Whether this is a final (non-partial) result */
|
|
61
|
+
isFinal: boolean;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Transcript event with full text and segments
|
|
65
|
+
*/
|
|
66
|
+
export interface SwabbleTranscriptEvent {
|
|
67
|
+
/** Full transcript text */
|
|
68
|
+
transcript: string;
|
|
69
|
+
/** Individual speech segments with timing */
|
|
70
|
+
segments: SwabbleSpeechSegment[];
|
|
71
|
+
/** Whether this is a final (non-partial) result */
|
|
72
|
+
isFinal: boolean;
|
|
73
|
+
/** Confidence score (0-1) if available */
|
|
74
|
+
confidence?: number;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Voice wake state change event
|
|
78
|
+
*/
|
|
79
|
+
export interface SwabbleStateEvent {
|
|
80
|
+
/** Current state */
|
|
81
|
+
state: "idle" | "listening" | "processing" | "error";
|
|
82
|
+
/** Reason for state change */
|
|
83
|
+
reason?: string;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Audio level event for visualization
|
|
87
|
+
*/
|
|
88
|
+
export interface SwabbleAudioLevelEvent {
|
|
89
|
+
/** Audio level (0-1) */
|
|
90
|
+
level: number;
|
|
91
|
+
/** Peak level since last event */
|
|
92
|
+
peak: number;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Error event
|
|
96
|
+
*/
|
|
97
|
+
export interface SwabbleErrorEvent {
|
|
98
|
+
/** Error code */
|
|
99
|
+
code: string;
|
|
100
|
+
/** Error message */
|
|
101
|
+
message: string;
|
|
102
|
+
/** Whether the system will attempt to recover */
|
|
103
|
+
recoverable: boolean;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Permission status
|
|
107
|
+
*/
|
|
108
|
+
export interface SwabblePermissionStatus {
|
|
109
|
+
/** Microphone permission status */
|
|
110
|
+
microphone: "granted" | "denied" | "prompt";
|
|
111
|
+
/** Speech recognition permission status */
|
|
112
|
+
speechRecognition: "granted" | "denied" | "prompt" | "not_supported";
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Swabble Plugin Interface
|
|
116
|
+
*
|
|
117
|
+
* Provides voice wake word detection and speech-to-text capabilities.
|
|
118
|
+
* Uses native Speech framework on iOS/macOS, SpeechRecognizer on Android,
|
|
119
|
+
* and Whisper.cpp on desktop (Linux/Windows via Electrobun).
|
|
120
|
+
*/
|
|
121
|
+
export interface SwabblePlugin {
|
|
122
|
+
/**
|
|
123
|
+
* Start voice wake detection
|
|
124
|
+
*
|
|
125
|
+
* @param options - Configuration options
|
|
126
|
+
* @returns Promise resolving to start result
|
|
127
|
+
*/
|
|
128
|
+
start(options: SwabbleStartOptions): Promise<SwabbleStartResult>;
|
|
129
|
+
/**
|
|
130
|
+
* Stop voice wake detection
|
|
131
|
+
*
|
|
132
|
+
* @returns Promise that resolves when stopped
|
|
133
|
+
*/
|
|
134
|
+
stop(): Promise<void>;
|
|
135
|
+
/**
|
|
136
|
+
* Check if voice wake is currently active
|
|
137
|
+
*
|
|
138
|
+
* @returns Promise resolving to active status
|
|
139
|
+
*/
|
|
140
|
+
isListening(): Promise<{
|
|
141
|
+
listening: boolean;
|
|
142
|
+
}>;
|
|
143
|
+
/**
|
|
144
|
+
* Get current configuration
|
|
145
|
+
*
|
|
146
|
+
* @returns Promise resolving to current config
|
|
147
|
+
*/
|
|
148
|
+
getConfig(): Promise<{
|
|
149
|
+
config: SwabbleConfig | null;
|
|
150
|
+
}>;
|
|
151
|
+
/**
|
|
152
|
+
* Update configuration while running
|
|
153
|
+
*
|
|
154
|
+
* @param options - New configuration
|
|
155
|
+
* @returns Promise that resolves when updated
|
|
156
|
+
*/
|
|
157
|
+
updateConfig(options: {
|
|
158
|
+
config: Partial<SwabbleConfig>;
|
|
159
|
+
}): Promise<void>;
|
|
160
|
+
/**
|
|
161
|
+
* Check permission status
|
|
162
|
+
*
|
|
163
|
+
* @returns Promise resolving to permission status
|
|
164
|
+
*/
|
|
165
|
+
checkPermissions(): Promise<SwabblePermissionStatus>;
|
|
166
|
+
/**
|
|
167
|
+
* Request required permissions
|
|
168
|
+
*
|
|
169
|
+
* @returns Promise resolving to permission status after request
|
|
170
|
+
*/
|
|
171
|
+
requestPermissions(): Promise<SwabblePermissionStatus>;
|
|
172
|
+
/**
|
|
173
|
+
* Get list of available audio input devices
|
|
174
|
+
*
|
|
175
|
+
* @returns Promise resolving to device list
|
|
176
|
+
*/
|
|
177
|
+
getAudioDevices(): Promise<{
|
|
178
|
+
devices: Array<{
|
|
179
|
+
id: string;
|
|
180
|
+
name: string;
|
|
181
|
+
isDefault: boolean;
|
|
182
|
+
}>;
|
|
183
|
+
}>;
|
|
184
|
+
/**
|
|
185
|
+
* Set the audio input device
|
|
186
|
+
*
|
|
187
|
+
* @param options - Device ID to use
|
|
188
|
+
* @returns Promise that resolves when set
|
|
189
|
+
*/
|
|
190
|
+
setAudioDevice(options: {
|
|
191
|
+
deviceId: string;
|
|
192
|
+
}): Promise<void>;
|
|
193
|
+
/**
|
|
194
|
+
* Add a listener for wake word detection
|
|
195
|
+
*/
|
|
196
|
+
addListener(eventName: "wakeWord", listenerFunc: (event: SwabbleWakeWordEvent) => void): Promise<PluginListenerHandle>;
|
|
197
|
+
/**
|
|
198
|
+
* Add a listener for transcript updates
|
|
199
|
+
*/
|
|
200
|
+
addListener(eventName: "transcript", listenerFunc: (event: SwabbleTranscriptEvent) => void): Promise<PluginListenerHandle>;
|
|
201
|
+
/**
|
|
202
|
+
* Add a listener for state changes
|
|
203
|
+
*/
|
|
204
|
+
addListener(eventName: "stateChange", listenerFunc: (event: SwabbleStateEvent) => void): Promise<PluginListenerHandle>;
|
|
205
|
+
/**
|
|
206
|
+
* Add a listener for audio level updates
|
|
207
|
+
*/
|
|
208
|
+
addListener(eventName: "audioLevel", listenerFunc: (event: SwabbleAudioLevelEvent) => void): Promise<PluginListenerHandle>;
|
|
209
|
+
/**
|
|
210
|
+
* Add a listener for errors
|
|
211
|
+
*/
|
|
212
|
+
addListener(eventName: "error", listenerFunc: (event: SwabbleErrorEvent) => void): Promise<PluginListenerHandle>;
|
|
213
|
+
/**
|
|
214
|
+
* Remove all listeners
|
|
215
|
+
*/
|
|
216
|
+
removeAllListeners(): Promise<void>;
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=definitions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"definitions.d.ts","sourceRoot":"","sources":["../../src/definitions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,cAAc,eAAe,CAAC;AAI9B,eAAO,MAAM,OAAO,eAElB,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { WebPlugin } from "@capacitor/core";
|
|
2
|
+
import type { SwabbleConfig, SwabblePermissionStatus, SwabbleStartOptions, SwabbleStartResult } from "./definitions";
|
|
3
|
+
export declare class SwabbleWeb extends WebPlugin {
|
|
4
|
+
private recognition;
|
|
5
|
+
private config;
|
|
6
|
+
private wakeGate;
|
|
7
|
+
private isActive;
|
|
8
|
+
private segments;
|
|
9
|
+
private audioContext;
|
|
10
|
+
private analyser;
|
|
11
|
+
private mediaStream;
|
|
12
|
+
private levelInterval;
|
|
13
|
+
private captureStream;
|
|
14
|
+
private captureContext;
|
|
15
|
+
private captureProcessor;
|
|
16
|
+
private bridgeSubscriptions;
|
|
17
|
+
private usingNativeIpc;
|
|
18
|
+
private getRendererRpc;
|
|
19
|
+
private subscribeDesktopEvent;
|
|
20
|
+
private invokeDesktopRequest;
|
|
21
|
+
private setupNativeListeners;
|
|
22
|
+
private removeNativeListeners;
|
|
23
|
+
private startNativeAudioCapture;
|
|
24
|
+
private computeRms;
|
|
25
|
+
private computePeak;
|
|
26
|
+
private stopNativeAudioCapture;
|
|
27
|
+
start(options: SwabbleStartOptions): Promise<SwabbleStartResult>;
|
|
28
|
+
private handleSpeechResult;
|
|
29
|
+
private startAudioLevelMonitoring;
|
|
30
|
+
private stopAudioLevelMonitoring;
|
|
31
|
+
stop(): Promise<void>;
|
|
32
|
+
isListening(): Promise<{
|
|
33
|
+
listening: boolean;
|
|
34
|
+
}>;
|
|
35
|
+
getConfig(): Promise<{
|
|
36
|
+
config: SwabbleConfig | null;
|
|
37
|
+
}>;
|
|
38
|
+
updateConfig(options: {
|
|
39
|
+
config: Partial<SwabbleConfig>;
|
|
40
|
+
}): Promise<void>;
|
|
41
|
+
checkPermissions(): Promise<SwabblePermissionStatus>;
|
|
42
|
+
requestPermissions(): Promise<SwabblePermissionStatus>;
|
|
43
|
+
getAudioDevices(): Promise<{
|
|
44
|
+
devices: Array<{
|
|
45
|
+
id: string;
|
|
46
|
+
name: string;
|
|
47
|
+
isDefault: boolean;
|
|
48
|
+
}>;
|
|
49
|
+
}>;
|
|
50
|
+
setAudioDevice(_options: {
|
|
51
|
+
deviceId: string;
|
|
52
|
+
}): Promise<void>;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=web.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web.d.ts","sourceRoot":"","sources":["../../src/web.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,KAAK,EACV,aAAa,EACb,uBAAuB,EAEvB,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,eAAe,CAAC;AA6JvB,qBAAa,UAAW,SAAQ,SAAS;IACvC,OAAO,CAAC,WAAW,CAA0C;IAC7D,OAAO,CAAC,MAAM,CAA8B;IAC5C,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,aAAa,CAA+C;IAGpE,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,cAAc,CAA6B;IACnD,OAAO,CAAC,gBAAgB,CAAoC;IAC5D,OAAO,CAAC,mBAAmB,CAAyB;IACpD,OAAO,CAAC,cAAc,CAAS;IAE/B,OAAO,CAAC,cAAc;IAItB,OAAO,CAAC,qBAAqB;YAQf,oBAAoB;IAQlC,OAAO,CAAC,oBAAoB;IAuC5B,OAAO,CAAC,qBAAqB;YAOf,uBAAuB;IA+CrC,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,sBAAsB;IAWxB,KAAK,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAmFtE,OAAO,CAAC,kBAAkB;YAqCZ,yBAAyB;IAyBvC,OAAO,CAAC,wBAAwB;IAY1B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAwBrB,WAAW,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC;IAI9C,SAAS,IAAI,OAAO,CAAC;QAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CAAA;KAAE,CAAC;IAItD,YAAY,CAAC,OAAO,EAAE;QAC1B,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;KAChC,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBX,gBAAgB,IAAI,OAAO,CAAC,uBAAuB,CAAC;IA4BpD,kBAAkB,IAAI,OAAO,CAAC,uBAAuB,CAAC;IAetD,eAAe,IAAI,OAAO,CAAC;QAC/B,OAAO,EAAE,KAAK,CAAC;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,OAAO,CAAA;SAAE,CAAC,CAAC;KAClE,CAAC;IAgBI,cAAc,CAAC,QAAQ,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAOpE"}
|