even-toolkit 1.1.1 → 1.3.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/README.md +74 -0
- package/dist/glasses/bridge.d.ts +5 -2
- package/dist/glasses/bridge.d.ts.map +1 -1
- package/dist/glasses/bridge.js +25 -2
- package/dist/glasses/bridge.js.map +1 -1
- package/dist/glasses/composer.js +2 -2
- package/dist/glasses/layout.d.ts +2 -0
- package/dist/glasses/layout.d.ts.map +1 -1
- package/dist/glasses/layout.js +4 -0
- package/dist/glasses/layout.js.map +1 -1
- package/dist/glasses/types.d.ts +23 -0
- package/dist/glasses/types.d.ts.map +1 -1
- package/dist/glasses/types.js +15 -0
- package/dist/glasses/types.js.map +1 -1
- package/dist/glasses/useGlasses.d.ts.map +1 -1
- package/dist/glasses/useGlasses.js +17 -4
- package/dist/glasses/useGlasses.js.map +1 -1
- package/dist/stt/debug.d.ts +8 -0
- package/dist/stt/debug.d.ts.map +1 -0
- package/dist/stt/debug.js +34 -0
- package/dist/stt/debug.js.map +1 -0
- package/dist/stt/engine.d.ts +9 -6
- package/dist/stt/engine.d.ts.map +1 -1
- package/dist/stt/engine.js +141 -75
- package/dist/stt/engine.js.map +1 -1
- package/dist/stt/index.d.ts +1 -0
- package/dist/stt/index.d.ts.map +1 -1
- package/dist/stt/index.js +1 -0
- package/dist/stt/index.js.map +1 -1
- package/dist/stt/providers/deepgram.d.ts +1 -1
- package/dist/stt/providers/deepgram.d.ts.map +1 -1
- package/dist/stt/providers/deepgram.js +24 -9
- package/dist/stt/providers/deepgram.js.map +1 -1
- package/dist/stt/providers/whisper-api.d.ts.map +1 -1
- package/dist/stt/providers/whisper-api.js +75 -4
- package/dist/stt/providers/whisper-api.js.map +1 -1
- package/dist/stt/react/useSTT.d.ts.map +1 -1
- package/dist/stt/react/useSTT.js +44 -11
- package/dist/stt/react/useSTT.js.map +1 -1
- package/dist/stt/registry.d.ts.map +1 -1
- package/dist/stt/registry.js +0 -8
- package/dist/stt/registry.js.map +1 -1
- package/dist/stt/sources/glass-bridge.d.ts +8 -15
- package/dist/stt/sources/glass-bridge.d.ts.map +1 -1
- package/dist/stt/sources/glass-bridge.js +66 -9
- package/dist/stt/sources/glass-bridge.js.map +1 -1
- package/dist/stt/sources/microphone.d.ts.map +1 -1
- package/dist/stt/sources/microphone.js +4 -0
- package/dist/stt/sources/microphone.js.map +1 -1
- package/dist/stt/types.d.ts +7 -3
- package/dist/stt/types.d.ts.map +1 -1
- package/glasses/bridge.ts +24 -3
- package/glasses/composer.ts +2 -2
- package/glasses/layout.ts +6 -0
- package/glasses/types.ts +28 -0
- package/glasses/useGlasses.ts +18 -5
- package/package.json +7 -19
- package/stt/debug.ts +38 -0
- package/stt/engine.ts +158 -83
- package/stt/index.ts +1 -0
- package/stt/providers/deepgram.ts +26 -9
- package/stt/providers/whisper-api.ts +78 -4
- package/stt/react/useSTT.ts +45 -11
- package/stt/registry.ts +0 -8
- package/stt/sources/glass-bridge.ts +69 -25
- package/stt/sources/microphone.ts +7 -0
- package/stt/types.ts +4 -3
- package/dist/stt/providers/web-speech.d.ts +0 -25
- package/dist/stt/providers/web-speech.d.ts.map +0 -1
- package/dist/stt/providers/web-speech.js +0 -153
- package/dist/stt/providers/web-speech.js.map +0 -1
- package/dist/stt/providers/whisper-local/provider.d.ts +0 -31
- package/dist/stt/providers/whisper-local/provider.d.ts.map +0 -1
- package/dist/stt/providers/whisper-local/provider.js +0 -174
- package/dist/stt/providers/whisper-local/provider.js.map +0 -1
- package/dist/stt/providers/whisper-local/worker.d.ts +0 -2
- package/dist/stt/providers/whisper-local/worker.d.ts.map +0 -1
- package/dist/stt/providers/whisper-local/worker.js +0 -35
- package/dist/stt/providers/whisper-local/worker.js.map +0 -1
- package/stt/providers/web-speech.ts +0 -221
- package/stt/providers/whisper-local/provider.ts +0 -226
- package/stt/providers/whisper-local/worker.ts +0 -40
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"whisper-api.js","sourceRoot":"","sources":["../../../stt/providers/whisper-api.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"whisper-api.js","sourceRoot":"","sources":["../../../stt/providers/whisper-api.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSTT.d.ts","sourceRoot":"","sources":["../../../stt/react/useSTT.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAsB,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"useSTT.d.ts","sourceRoot":"","sources":["../../../stt/react/useSTT.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAsB,MAAM,UAAU,CAAC;AAI/E,wBAAgB,MAAM,CAAC,MAAM,GAAE,YAAiB,GAAG,YAAY,CA6I9D"}
|
package/dist/stt/react/useSTT.js
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import { useState, useRef, useEffect, useCallback } from 'react';
|
|
2
2
|
import { STTEngine } from '../engine';
|
|
3
|
+
import { sttLog } from '../debug';
|
|
3
4
|
export function useSTT(config = {}) {
|
|
4
5
|
const [transcript, setTranscript] = useState('');
|
|
5
6
|
const [interimTranscript, setInterimTranscript] = useState('');
|
|
6
7
|
const [isListening, setIsListening] = useState(false);
|
|
7
8
|
const [isLoading, setIsLoading] = useState(false);
|
|
8
|
-
const [loadProgress] = useState(0);
|
|
9
9
|
const [error, setError] = useState(null);
|
|
10
10
|
const [state, setState] = useState('idle');
|
|
11
11
|
const engineRef = useRef(null);
|
|
12
|
+
const busyRef = useRef(false); // prevent start/stop race
|
|
12
13
|
const configRef = useRef(config);
|
|
13
14
|
configRef.current = config;
|
|
14
15
|
// Cleanup on unmount
|
|
@@ -19,29 +20,45 @@ export function useSTT(config = {}) {
|
|
|
19
20
|
};
|
|
20
21
|
}, []);
|
|
21
22
|
const start = useCallback(async () => {
|
|
22
|
-
|
|
23
|
+
if (busyRef.current) {
|
|
24
|
+
sttLog('useSTT: start() blocked — busy');
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
busyRef.current = true;
|
|
23
28
|
engineRef.current?.dispose();
|
|
24
29
|
const cfg = configRef.current;
|
|
30
|
+
sttLog('useSTT: start()', cfg.provider, 'apiKey?', !!cfg.apiKey);
|
|
25
31
|
const engine = new STTEngine({
|
|
26
|
-
provider: cfg.provider ?? '
|
|
32
|
+
provider: cfg.provider ?? 'whisper-api',
|
|
27
33
|
source: cfg.source,
|
|
28
34
|
language: cfg.language,
|
|
29
35
|
mode: cfg.mode,
|
|
30
36
|
apiKey: cfg.apiKey,
|
|
31
37
|
modelId: cfg.modelId,
|
|
32
38
|
continuous: cfg.continuous,
|
|
33
|
-
vad: cfg.vad,
|
|
39
|
+
vad: cfg.vad ?? true,
|
|
40
|
+
chunkIntervalMs: cfg.chunkIntervalMs,
|
|
34
41
|
fallback: cfg.fallback,
|
|
35
42
|
});
|
|
36
43
|
engineRef.current = engine;
|
|
37
|
-
//
|
|
44
|
+
// Accumulate final results for streaming providers
|
|
45
|
+
let accumulated = '';
|
|
38
46
|
engine.onTranscript((t) => {
|
|
39
47
|
if (t.isFinal) {
|
|
40
|
-
|
|
48
|
+
// Append final to accumulated text
|
|
49
|
+
const clean = t.text.replace(/\.+$/, '').trim();
|
|
50
|
+
if (clean) {
|
|
51
|
+
accumulated = accumulated ? accumulated + ' ' + clean : clean;
|
|
52
|
+
}
|
|
53
|
+
setTranscript(accumulated);
|
|
41
54
|
setInterimTranscript('');
|
|
42
55
|
}
|
|
43
56
|
else {
|
|
44
|
-
|
|
57
|
+
// Interim: show accumulated + current interim
|
|
58
|
+
const clean = t.text.replace(/\.+$/, '').trim();
|
|
59
|
+
const full = accumulated ? accumulated + ' ' + clean : clean;
|
|
60
|
+
setInterimTranscript(full);
|
|
61
|
+
setTranscript(full);
|
|
45
62
|
}
|
|
46
63
|
cfg.onTranscript?.(t.text, t.isFinal);
|
|
47
64
|
});
|
|
@@ -49,24 +66,41 @@ export function useSTT(config = {}) {
|
|
|
49
66
|
setState(s);
|
|
50
67
|
setIsListening(s === 'listening');
|
|
51
68
|
setIsLoading(s === 'loading');
|
|
52
|
-
if (s === 'idle') {
|
|
69
|
+
if (s === 'idle' || s === 'error') {
|
|
53
70
|
setInterimTranscript('');
|
|
71
|
+
busyRef.current = false;
|
|
54
72
|
}
|
|
55
73
|
});
|
|
56
74
|
engine.onError((e) => {
|
|
57
75
|
setError(e);
|
|
76
|
+
busyRef.current = false;
|
|
58
77
|
});
|
|
59
78
|
setError(null);
|
|
60
|
-
|
|
79
|
+
try {
|
|
80
|
+
await engine.start();
|
|
81
|
+
busyRef.current = false;
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
busyRef.current = false;
|
|
85
|
+
}
|
|
61
86
|
}, []);
|
|
62
87
|
const stop = useCallback(() => {
|
|
63
|
-
|
|
88
|
+
sttLog('useSTT: stop()');
|
|
89
|
+
if (!engineRef.current)
|
|
90
|
+
return;
|
|
91
|
+
// Stop mic immediately, then engine handles final transcription
|
|
92
|
+
engineRef.current.stop();
|
|
64
93
|
}, []);
|
|
65
94
|
const abort = useCallback(() => {
|
|
95
|
+
sttLog('useSTT: abort()');
|
|
66
96
|
engineRef.current?.abort();
|
|
97
|
+
busyRef.current = false;
|
|
67
98
|
}, []);
|
|
68
99
|
const reset = useCallback(() => {
|
|
100
|
+
sttLog('useSTT: reset()');
|
|
69
101
|
engineRef.current?.abort();
|
|
102
|
+
engineRef.current = null;
|
|
103
|
+
busyRef.current = false;
|
|
70
104
|
setTranscript('');
|
|
71
105
|
setInterimTranscript('');
|
|
72
106
|
setError(null);
|
|
@@ -87,7 +121,6 @@ export function useSTT(config = {}) {
|
|
|
87
121
|
interimTranscript,
|
|
88
122
|
isListening,
|
|
89
123
|
isLoading,
|
|
90
|
-
loadProgress,
|
|
91
124
|
error,
|
|
92
125
|
state,
|
|
93
126
|
start,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSTT.js","sourceRoot":"","sources":["../../../stt/react/useSTT.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAEjE,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"useSTT.js","sourceRoot":"","sources":["../../../stt/react/useSTT.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../stt/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../stt/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3C,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAavE"}
|
package/dist/stt/registry.js
CHANGED
|
@@ -1,13 +1,5 @@
|
|
|
1
1
|
export async function createProvider(type) {
|
|
2
2
|
switch (type) {
|
|
3
|
-
case 'web-speech': {
|
|
4
|
-
const { WebSpeechProvider } = await import('./providers/web-speech');
|
|
5
|
-
return new WebSpeechProvider();
|
|
6
|
-
}
|
|
7
|
-
case 'whisper-local': {
|
|
8
|
-
const { WhisperLocalProvider } = await import('./providers/whisper-local/provider');
|
|
9
|
-
return new WhisperLocalProvider();
|
|
10
|
-
}
|
|
11
3
|
case 'whisper-api': {
|
|
12
4
|
const { WhisperApiProvider } = await import('./providers/whisper-api');
|
|
13
5
|
return new WhisperApiProvider();
|
package/dist/stt/registry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../stt/registry.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY;IAC/C,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../stt/registry.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY;IAC/C,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,aAAa,CAAC,CAAC,CAAC;YACnB,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAC;YACvE,OAAO,IAAI,kBAAkB,EAAE,CAAC;QAClC,CAAC;QACD,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;YAClE,OAAO,IAAI,gBAAgB,EAAE,CAAC;QAChC,CAAC;QACD;YACE,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC;AACH,CAAC"}
|
|
@@ -1,25 +1,18 @@
|
|
|
1
1
|
import type { AudioSource } from '../types';
|
|
2
|
-
export interface GlassBridgeSourceConfig {
|
|
3
|
-
/** The EvenHub bridge instance that fires audio events */
|
|
4
|
-
bridge: {
|
|
5
|
-
onEvent(handler: (event: GlassAudioEvent) => void): void;
|
|
6
|
-
};
|
|
7
|
-
}
|
|
8
|
-
export interface GlassAudioEvent {
|
|
9
|
-
audioEvent?: {
|
|
10
|
-
audioPcm?: Uint8Array;
|
|
11
|
-
};
|
|
12
|
-
}
|
|
13
2
|
/**
|
|
14
3
|
* AudioSource for G2 smart glasses.
|
|
15
|
-
*
|
|
16
|
-
*
|
|
4
|
+
*
|
|
5
|
+
* Automatically opens/closes the glasses microphone via the EvenHub SDK bridge
|
|
6
|
+
* and listens for PCM audio chunks from `audioEvent.audioPcm`.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* const source = new GlassBridgeSource();
|
|
10
|
+
* // It auto-detects the bridge from window.__evenBridge
|
|
17
11
|
*/
|
|
18
12
|
export declare class GlassBridgeSource implements AudioSource {
|
|
19
|
-
private config;
|
|
20
13
|
private listeners;
|
|
21
14
|
private listening;
|
|
22
|
-
|
|
15
|
+
private bridge;
|
|
23
16
|
start(): Promise<void>;
|
|
24
17
|
stop(): void;
|
|
25
18
|
onAudioData(cb: (pcm: Float32Array, sampleRate: number) => void): () => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"glass-bridge.d.ts","sourceRoot":"","sources":["../../../stt/sources/glass-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAK5C
|
|
1
|
+
{"version":3,"file":"glass-bridge.d.ts","sourceRoot":"","sources":["../../../stt/sources/glass-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAK5C;;;;;;;;;GASG;AACH,qBAAa,iBAAkB,YAAW,WAAW;IACnD,OAAO,CAAC,SAAS,CAA8D;IAC/E,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,MAAM,CAAa;IAErB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAiD5B,IAAI,IAAI,IAAI;IAkBZ,WAAW,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI;IAQ5E,OAAO,IAAI,IAAI;CAIhB"}
|
|
@@ -1,35 +1,82 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { sttLog } from '../debug';
|
|
2
2
|
const GLASS_SAMPLE_RATE = 16000;
|
|
3
3
|
/**
|
|
4
4
|
* AudioSource for G2 smart glasses.
|
|
5
|
-
*
|
|
6
|
-
*
|
|
5
|
+
*
|
|
6
|
+
* Automatically opens/closes the glasses microphone via the EvenHub SDK bridge
|
|
7
|
+
* and listens for PCM audio chunks from `audioEvent.audioPcm`.
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* const source = new GlassBridgeSource();
|
|
11
|
+
* // It auto-detects the bridge from window.__evenBridge
|
|
7
12
|
*/
|
|
8
13
|
export class GlassBridgeSource {
|
|
9
|
-
constructor(
|
|
14
|
+
constructor() {
|
|
10
15
|
this.listeners = [];
|
|
11
16
|
this.listening = false;
|
|
12
|
-
this.
|
|
17
|
+
this.bridge = null;
|
|
13
18
|
}
|
|
14
19
|
async start() {
|
|
15
20
|
if (this.listening)
|
|
16
21
|
return;
|
|
22
|
+
// Get bridge from global (set by useGlasses)
|
|
23
|
+
this.bridge = window.__evenBridge ?? null;
|
|
24
|
+
sttLog('GlassBridgeSource.start()', 'bridge found:', !!this.bridge);
|
|
25
|
+
if (!this.bridge) {
|
|
26
|
+
throw new Error('Glasses bridge not available. Make sure useGlasses is mounted and __evenBridge is set.');
|
|
27
|
+
}
|
|
17
28
|
this.listening = true;
|
|
18
|
-
|
|
29
|
+
// Open the glasses microphone
|
|
30
|
+
try {
|
|
31
|
+
if (this.bridge.rawBridge?.audioControl) {
|
|
32
|
+
sttLog('GlassBridgeSource', 'calling audioControl(true)');
|
|
33
|
+
await this.bridge.rawBridge.audioControl(true);
|
|
34
|
+
sttLog('GlassBridgeSource', 'audioControl(true) succeeded');
|
|
35
|
+
}
|
|
36
|
+
else if (this.bridge.rawBridge?.callEvenApp) {
|
|
37
|
+
sttLog('GlassBridgeSource', 'calling callEvenApp("audioControl", {isOpen: true})');
|
|
38
|
+
await this.bridge.rawBridge.callEvenApp('audioControl', { isOpen: true });
|
|
39
|
+
sttLog('GlassBridgeSource', 'callEvenApp audioControl succeeded');
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
sttLog('GlassBridgeSource', 'WARNING: no audioControl method found on bridge');
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
sttLog('GlassBridgeSource', 'audioControl(true) error:', err);
|
|
47
|
+
}
|
|
48
|
+
// Listen for audio PCM events
|
|
49
|
+
this.bridge.onEvent((event) => {
|
|
19
50
|
if (!this.listening)
|
|
20
51
|
return;
|
|
21
|
-
const audioPcm = event
|
|
52
|
+
const audioPcm = event?.audioEvent?.audioPcm;
|
|
22
53
|
if (!audioPcm || audioPcm.length === 0)
|
|
23
54
|
return;
|
|
24
|
-
|
|
25
|
-
|
|
55
|
+
sttLog('GlassBridgeSource', 'got audioPcm chunk, bytes:', audioPcm.length);
|
|
56
|
+
// Convert Uint8Array (16-bit PCM little-endian) to Float32Array
|
|
57
|
+
const float32 = pcm16ToFloat32(audioPcm);
|
|
26
58
|
for (const cb of this.listeners) {
|
|
27
59
|
cb(float32, GLASS_SAMPLE_RATE);
|
|
28
60
|
}
|
|
29
61
|
});
|
|
30
62
|
}
|
|
31
63
|
stop() {
|
|
64
|
+
sttLog('GlassBridgeSource.stop()');
|
|
32
65
|
this.listening = false;
|
|
66
|
+
// Close the glasses microphone
|
|
67
|
+
if (this.bridge) {
|
|
68
|
+
try {
|
|
69
|
+
if (this.bridge.rawBridge?.audioControl) {
|
|
70
|
+
this.bridge.rawBridge.audioControl(false);
|
|
71
|
+
}
|
|
72
|
+
else if (this.bridge.rawBridge?.callEvenApp) {
|
|
73
|
+
this.bridge.rawBridge.callEvenApp('audioControl', { isOpen: false });
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
sttLog('GlassBridgeSource', 'audioControl(false) error:', err);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
33
80
|
}
|
|
34
81
|
onAudioData(cb) {
|
|
35
82
|
this.listeners.push(cb);
|
|
@@ -44,4 +91,14 @@ export class GlassBridgeSource {
|
|
|
44
91
|
this.listeners.length = 0;
|
|
45
92
|
}
|
|
46
93
|
}
|
|
94
|
+
/** Convert raw bytes (16-bit PCM little-endian) to Float32Array */
|
|
95
|
+
function pcm16ToFloat32(bytes) {
|
|
96
|
+
const samples = bytes.length / 2;
|
|
97
|
+
const float32 = new Float32Array(samples);
|
|
98
|
+
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
99
|
+
for (let i = 0; i < samples; i++) {
|
|
100
|
+
float32[i] = view.getInt16(i * 2, true) / 32768;
|
|
101
|
+
}
|
|
102
|
+
return float32;
|
|
103
|
+
}
|
|
47
104
|
//# sourceMappingURL=glass-bridge.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"glass-bridge.js","sourceRoot":"","sources":["../../../stt/sources/glass-bridge.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"glass-bridge.js","sourceRoot":"","sources":["../../../stt/sources/glass-bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"microphone.d.ts","sourceRoot":"","sources":["../../../stt/sources/microphone.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAK5C;;;GAGG;AACH,qBAAa,gBAAiB,YAAW,WAAW;IAClD,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,UAAU,CAAoC;IACtD,OAAO,CAAC,UAAU,CAA2C;IAC7D,OAAO,CAAC,SAAS,CAA8D;IAEzE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"microphone.d.ts","sourceRoot":"","sources":["../../../stt/sources/microphone.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAK5C;;;GAGG;AACH,qBAAa,gBAAiB,YAAW,WAAW;IAClD,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,UAAU,CAAoC;IACtD,OAAO,CAAC,UAAU,CAA2C;IAC7D,OAAO,CAAC,SAAS,CAA8D;IAEzE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA+B5B,IAAI,IAAI,IAAI;IAsBZ,WAAW,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI;IAQ5E,OAAO,IAAI,IAAI;CAIhB"}
|
|
@@ -13,6 +13,10 @@ export class MicrophoneSource {
|
|
|
13
13
|
this.listeners = [];
|
|
14
14
|
}
|
|
15
15
|
async start() {
|
|
16
|
+
if (!navigator.mediaDevices?.getUserMedia) {
|
|
17
|
+
throw new Error('getUserMedia not available — likely running in a WebView. ' +
|
|
18
|
+
'Use glass-bridge source or pass a custom AudioSource instead.');
|
|
19
|
+
}
|
|
16
20
|
this.stream = await navigator.mediaDevices.getUserMedia({
|
|
17
21
|
audio: { sampleRate: DEFAULT_SAMPLE_RATE, channelCount: 1 },
|
|
18
22
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"microphone.js","sourceRoot":"","sources":["../../../stt/sources/microphone.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,GAAG,IAAI,CAAC;AACxB,MAAM,mBAAmB,GAAG,KAAK,CAAC;AAElC;;;GAGG;AACH,MAAM,OAAO,gBAAgB;IAA7B;QACU,WAAM,GAAuB,IAAI,CAAC;QAClC,iBAAY,GAAwB,IAAI,CAAC;QACzC,eAAU,GAA+B,IAAI,CAAC;QAC9C,eAAU,GAAsC,IAAI,CAAC;QACrD,cAAS,GAA2D,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"microphone.js","sourceRoot":"","sources":["../../../stt/sources/microphone.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,GAAG,IAAI,CAAC;AACxB,MAAM,mBAAmB,GAAG,KAAK,CAAC;AAElC;;;GAGG;AACH,MAAM,OAAO,gBAAgB;IAA7B;QACU,WAAM,GAAuB,IAAI,CAAC;QAClC,iBAAY,GAAwB,IAAI,CAAC;QACzC,eAAU,GAA+B,IAAI,CAAC;QAC9C,eAAU,GAAsC,IAAI,CAAC;QACrD,cAAS,GAA2D,EAAE,CAAC;IAmEjF,CAAC;IAjEC,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,YAAY,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CACb,4DAA4D;gBAC5D,+DAA+D,CAChE,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC;YACtD,KAAK,EAAE,EAAE,UAAU,EAAE,mBAAmB,EAAE,YAAY,EAAE,CAAC,EAAE;SAC5D,CAAC,CAAC;QAEH,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,CAAC,EAAE,UAAU,EAAE,mBAAmB,EAAE,CAAC,CAAC;QAC1E,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,uBAAuB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACzE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,qBAAqB,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAE5E,IAAI,CAAC,UAAU,CAAC,cAAc,GAAG,CAAC,KAAK,EAAE,EAAE;YACzC,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;YAClD,+CAA+C;YAC/C,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC7C,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACjB,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE,UAAU,IAAI,mBAAmB,CAAC;YAClE,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBAChC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAClB,CAAC;QACH,CAAC,CAAC;QAEF,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACzC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;IACzD,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,IAAI,CAAC,UAAU,CAAC,cAAc,GAAG,IAAI,CAAC;YACtC,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;YAC7B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC;YAC7B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC;gBAC5C,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,CAAC;YACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACrB,CAAC;QACD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAC1C,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,WAAW,CAAC,EAAmD;QAC7D,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxB,OAAO,GAAG,EAAE;YACV,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACvC,IAAI,GAAG,IAAI,CAAC;gBAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC9C,CAAC,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IAC5B,CAAC;CACF"}
|
package/dist/stt/types.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type STTProviderType = '
|
|
1
|
+
export type STTProviderType = 'whisper-api' | 'deepgram' | string;
|
|
2
2
|
export type STTMode = 'streaming' | 'batch';
|
|
3
3
|
export type STTState = 'idle' | 'loading' | 'listening' | 'processing' | 'error';
|
|
4
4
|
export interface STTTranscript {
|
|
@@ -58,6 +58,7 @@ export interface STTEngineConfig {
|
|
|
58
58
|
thresholdDb?: number;
|
|
59
59
|
};
|
|
60
60
|
sampleRate?: number;
|
|
61
|
+
chunkIntervalMs?: number;
|
|
61
62
|
fallback?: STTProviderType;
|
|
62
63
|
}
|
|
63
64
|
export interface UseSTTConfig {
|
|
@@ -68,7 +69,11 @@ export interface UseSTTConfig {
|
|
|
68
69
|
apiKey?: string;
|
|
69
70
|
modelId?: string;
|
|
70
71
|
continuous?: boolean;
|
|
71
|
-
vad?: boolean
|
|
72
|
+
vad?: boolean | {
|
|
73
|
+
silenceMs?: number;
|
|
74
|
+
thresholdDb?: number;
|
|
75
|
+
};
|
|
76
|
+
chunkIntervalMs?: number;
|
|
72
77
|
autoStart?: boolean;
|
|
73
78
|
fallback?: STTProviderType;
|
|
74
79
|
onTranscript?: (text: string, isFinal: boolean) => void;
|
|
@@ -78,7 +83,6 @@ export interface UseSTTReturn {
|
|
|
78
83
|
interimTranscript: string;
|
|
79
84
|
isListening: boolean;
|
|
80
85
|
isLoading: boolean;
|
|
81
|
-
loadProgress: number;
|
|
82
86
|
error: STTError | null;
|
|
83
87
|
state: STTState;
|
|
84
88
|
start: () => Promise<void>;
|
package/dist/stt/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../stt/types.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,eAAe,GAAG,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../stt/types.ts"],"names":[],"mappings":"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"}
|
package/glasses/bridge.ts
CHANGED
|
@@ -24,7 +24,8 @@ export interface ColumnConfig {
|
|
|
24
24
|
|
|
25
25
|
export class EvenHubBridge {
|
|
26
26
|
private sdk: EvenBetterSdk;
|
|
27
|
-
|
|
27
|
+
/** Raw EvenHub SDK bridge — exposed for STT audio control */
|
|
28
|
+
rawBridge: EvenAppBridge | null = null;
|
|
28
29
|
private _currentMode: PageMode | null = null;
|
|
29
30
|
private _pageReady = false;
|
|
30
31
|
|
|
@@ -95,8 +96,12 @@ export class EvenHubBridge {
|
|
|
95
96
|
}
|
|
96
97
|
|
|
97
98
|
async init(): Promise<void> {
|
|
98
|
-
|
|
99
|
-
|
|
99
|
+
try {
|
|
100
|
+
this.rawBridge = await EvenBetterSdk.getRawBridge() as unknown as EvenAppBridge;
|
|
101
|
+
this._pageReady = true;
|
|
102
|
+
} catch (err) {
|
|
103
|
+
throw err;
|
|
104
|
+
}
|
|
100
105
|
}
|
|
101
106
|
|
|
102
107
|
// ── Setup (required before chart/home layout switch) ──
|
|
@@ -294,6 +299,22 @@ export class EvenHubBridge {
|
|
|
294
299
|
);
|
|
295
300
|
}
|
|
296
301
|
|
|
302
|
+
// ── IMU ──
|
|
303
|
+
|
|
304
|
+
async imuEnable(): Promise<void> {
|
|
305
|
+
if (!this.rawBridge) return;
|
|
306
|
+
try {
|
|
307
|
+
await (this.rawBridge as any).callEvenApp('imuControl', { isOpen: true });
|
|
308
|
+
} catch { /* IMU might not be supported */ }
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
async imuDisable(): Promise<void> {
|
|
312
|
+
if (!this.rawBridge) return;
|
|
313
|
+
try {
|
|
314
|
+
await (this.rawBridge as any).callEvenApp('imuControl', { isOpen: false });
|
|
315
|
+
} catch { /* IMU might not be supported */ }
|
|
316
|
+
}
|
|
317
|
+
|
|
297
318
|
// ── Events ──
|
|
298
319
|
|
|
299
320
|
onEvent(handler: (event: EvenHubEvent) => void): void {
|
package/glasses/composer.ts
CHANGED
|
@@ -27,7 +27,7 @@ function eventCaptureContainer(): TextContainerProperty {
|
|
|
27
27
|
height: MAIN_SLOT.h,
|
|
28
28
|
borderWidth: 0,
|
|
29
29
|
borderColor: 0,
|
|
30
|
-
|
|
30
|
+
borderRadius: 0,
|
|
31
31
|
paddingLength: 0,
|
|
32
32
|
content: '',
|
|
33
33
|
isEventCapture: 1,
|
|
@@ -45,7 +45,7 @@ function dummy(): TextContainerProperty {
|
|
|
45
45
|
height: s.h,
|
|
46
46
|
borderWidth: 0,
|
|
47
47
|
borderColor: 0,
|
|
48
|
-
|
|
48
|
+
borderRadius: 0,
|
|
49
49
|
paddingLength: 0,
|
|
50
50
|
content: '',
|
|
51
51
|
isEventCapture: 0,
|
package/glasses/layout.ts
CHANGED
|
@@ -2,9 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
export const DISPLAY_W = 576;
|
|
4
4
|
export const DISPLAY_H = 288;
|
|
5
|
+
|
|
6
|
+
// Default tile size (used by all existing apps)
|
|
5
7
|
export const G2_IMAGE_MAX_W = 200;
|
|
6
8
|
export const G2_IMAGE_MAX_H = 100;
|
|
7
9
|
|
|
10
|
+
// SDK 0.0.9 max image bounds (for apps that want larger tiles)
|
|
11
|
+
export const G2_IMAGE_LIMIT_W = 288;
|
|
12
|
+
export const G2_IMAGE_LIMIT_H = 144;
|
|
13
|
+
|
|
8
14
|
// ── Image tile slots (for chart layout: 3 tiles across the top) ──
|
|
9
15
|
|
|
10
16
|
export interface TileSlot {
|
package/glasses/types.ts
CHANGED
|
@@ -20,6 +20,22 @@ export function separator(): DisplayLine {
|
|
|
20
20
|
return { text: '', inverted: false, style: 'separator' };
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
+
/**
|
|
24
|
+
* Build a glasses header block: title + optional action bar + separator line.
|
|
25
|
+
* Returns 2 DisplayLines: [header, separator]
|
|
26
|
+
*
|
|
27
|
+
* Usage:
|
|
28
|
+
* lines.push(...glassHeader('INBOX (3)'));
|
|
29
|
+
* lines.push(...glassHeader('Step 1/4', '▶Timer◀ Scroll'));
|
|
30
|
+
*/
|
|
31
|
+
export function glassHeader(title: string, actionBar?: string): DisplayLine[] {
|
|
32
|
+
const text = actionBar ? `${title} ${actionBar}` : title;
|
|
33
|
+
return [
|
|
34
|
+
{ text, inverted: false, style: 'normal' as LineStyle },
|
|
35
|
+
{ text: '', inverted: false, style: 'separator' as LineStyle },
|
|
36
|
+
];
|
|
37
|
+
}
|
|
38
|
+
|
|
23
39
|
// ── Column layout types (for multi-text-container pages) ──
|
|
24
40
|
|
|
25
41
|
export interface ColumnData {
|
|
@@ -44,6 +60,18 @@ export type PageMode =
|
|
|
44
60
|
| 'home' // image tile + text + empty overlay (home screens)
|
|
45
61
|
| 'chart'; // 3 image tiles + text (chart detail)
|
|
46
62
|
|
|
63
|
+
// ── Launch source ──
|
|
64
|
+
|
|
65
|
+
export type LaunchSource = 'appMenu' | 'glassesMenu';
|
|
66
|
+
|
|
67
|
+
// ── IMU data ──
|
|
68
|
+
|
|
69
|
+
export interface IMUData {
|
|
70
|
+
accelerometer: { x: number; y: number; z: number };
|
|
71
|
+
gyroscope: { x: number; y: number; z: number };
|
|
72
|
+
timestamp: number;
|
|
73
|
+
}
|
|
74
|
+
|
|
47
75
|
// ── Glass action types ──
|
|
48
76
|
|
|
49
77
|
export type GlassActionType = 'HIGHLIGHT_MOVE' | 'SELECT_HIGHLIGHTED' | 'GO_BACK';
|