@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.
@@ -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,4 @@
1
+ import type { SwabblePlugin } from "./definitions";
2
+ export * from "./definitions";
3
+ export declare const Swabble: SwabblePlugin;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -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,6 @@
1
+ import { registerPlugin } from "@capacitor/core";
2
+ export * from "./definitions";
3
+ const loadWeb = () => import("./web").then((m) => new m.SwabbleWeb());
4
+ export const Swabble = registerPlugin("Swabble", {
5
+ web: loadWeb,
6
+ });
@@ -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"}