@prabhjeet.me/wakeywakey 2.0.0 → 2.2.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.
|
Binary file
|
|
@@ -4,7 +4,7 @@ import { Subject, filter, withLatestFrom, concatMap, map, tap, distinctUntilChan
|
|
|
4
4
|
import { SubSink } from 'subsink';
|
|
5
5
|
import { Tensor, env, InferenceSession } from 'onnxruntime-web';
|
|
6
6
|
import { loadRnnoise, RnnoiseWorkletNode } from '@sapphi-red/web-noise-suppressor';
|
|
7
|
-
import { isPlatformBrowser, isPlatformServer } from '@angular/common';
|
|
7
|
+
import { isPlatformBrowser, isPlatformServer, NgClass } from '@angular/common';
|
|
8
8
|
import * as THREE from 'three';
|
|
9
9
|
|
|
10
10
|
/**
|
|
@@ -559,7 +559,7 @@ class MicrophoneService {
|
|
|
559
559
|
return this._data;
|
|
560
560
|
}
|
|
561
561
|
/**
|
|
562
|
-
*
|
|
562
|
+
* Microphones
|
|
563
563
|
*/
|
|
564
564
|
async _microphoneList() {
|
|
565
565
|
const devices = await navigator.mediaDevices.enumerateDevices();
|
|
@@ -653,6 +653,7 @@ class SpeechRecognitionService {
|
|
|
653
653
|
*/
|
|
654
654
|
this._event = inject(EventService);
|
|
655
655
|
this._platform = inject(PlatformService);
|
|
656
|
+
this._mic = inject(MicrophoneService);
|
|
656
657
|
/**
|
|
657
658
|
* Transcript
|
|
658
659
|
*/
|
|
@@ -693,6 +694,9 @@ class SpeechRecognitionService {
|
|
|
693
694
|
// 3. Handle Results
|
|
694
695
|
this._recognition.onresult = (event) => {
|
|
695
696
|
this._transcript = '';
|
|
697
|
+
// Don't capture if muted
|
|
698
|
+
if (this._mic.isMuted)
|
|
699
|
+
return;
|
|
696
700
|
for (let i = event.resultIndex; i < event.results.length; i++)
|
|
697
701
|
this._transcript += event.results[i][0].transcript;
|
|
698
702
|
};
|
|
@@ -940,7 +944,7 @@ class AudioService {
|
|
|
940
944
|
const wakewordTrigger$ = this._event.wakeword.pipe(filter(() => !this._isRecording), // Ignore wakeword if already recording
|
|
941
945
|
map(() => []));
|
|
942
946
|
// trigger 2: Continuous VAD > THRESHOLD
|
|
943
|
-
const continuousVadTrigger$ = this._event.speech.pipe(
|
|
947
|
+
const continuousVadTrigger$ = this._event.speech.pipe(filter(() => !this._mic.isMuted),
|
|
944
948
|
// intercept the raw stream to constantly update the threshold window
|
|
945
949
|
tap((s) => {
|
|
946
950
|
// Only buffer if we aren't already formally recording
|
|
@@ -960,7 +964,7 @@ class AudioService {
|
|
|
960
964
|
// clone so future sliding window updates don't mutate the captured audio.
|
|
961
965
|
const bufferedChunks = [...speechSlidingWindow];
|
|
962
966
|
// continue accumulating new chunks silently while we wait for the timer
|
|
963
|
-
const buffer$ = this._event.speech.pipe(tap((s) => bufferedChunks.push(s.sample)), ignoreElements());
|
|
967
|
+
const buffer$ = this._event.speech.pipe(filter(() => !this._mic.isMuted), tap((s) => bufferedChunks.push(s.sample)), ignoreElements());
|
|
964
968
|
// timer that emits the fully accumulated chunks (pre-roll)
|
|
965
969
|
const timer$ = timer(PRE_ROLL_MS).pipe(map(() => bufferedChunks));
|
|
966
970
|
return merge(buffer$, timer$).pipe(take(1));
|
|
@@ -969,7 +973,7 @@ class AudioService {
|
|
|
969
973
|
const startRecordingTrigger$ = merge(wakewordTrigger$.pipe(tap(() => {
|
|
970
974
|
if (!this._isInitialized)
|
|
971
975
|
this._isInitialized = true; // initialized
|
|
972
|
-
})), continuousVadTrigger$).pipe(throttleTime(this._config.throttleTime));
|
|
976
|
+
})), continuousVadTrigger$).pipe(filter(() => !this._mic.isMuted), throttleTime(this._config.throttleTime));
|
|
973
977
|
// recording pipeline
|
|
974
978
|
this._subs.sink = startRecordingTrigger$
|
|
975
979
|
.pipe(tap(() => {
|
|
@@ -978,7 +982,7 @@ class AudioService {
|
|
|
978
982
|
}), switchMap((bufferedChunks) => {
|
|
979
983
|
// Initialize our command chunks with anything captured during the 1s VAD wait
|
|
980
984
|
const commandChunks = [...bufferedChunks];
|
|
981
|
-
const speech$ = this._event.speech.pipe(tap((speech) => {
|
|
985
|
+
const speech$ = this._event.speech.pipe(filter(() => !this._mic.isMuted), tap((speech) => {
|
|
982
986
|
commandChunks.push(speech.sample);
|
|
983
987
|
if (this._isRecording)
|
|
984
988
|
// emit recording events
|
|
@@ -1038,7 +1042,7 @@ class AudioService {
|
|
|
1038
1042
|
* @returns
|
|
1039
1043
|
*/
|
|
1040
1044
|
_getWakeWordStream() {
|
|
1041
|
-
return this._event.speech.pipe(scan((state, speech) => {
|
|
1045
|
+
return this._event.speech.pipe(filter(() => !this._mic.isMuted), scan((state, speech) => {
|
|
1042
1046
|
const { hasVoiceActivity, sample } = speech;
|
|
1043
1047
|
let { isActive, hangoverCounter, buffer } = state;
|
|
1044
1048
|
if (hasVoiceActivity) {
|
|
@@ -1088,16 +1092,47 @@ class SpeakerService {
|
|
|
1088
1092
|
this._subs = new SubSink();
|
|
1089
1093
|
this._nextPlayTime = 0;
|
|
1090
1094
|
this._sources = [];
|
|
1095
|
+
/**
|
|
1096
|
+
* List of available microphones
|
|
1097
|
+
*/
|
|
1098
|
+
this._speakers = [];
|
|
1091
1099
|
if (this._config.audio.sound?.enable === false)
|
|
1092
1100
|
return;
|
|
1093
1101
|
// Audio is only available in browser context
|
|
1094
1102
|
if (this._platform.isBrowser) {
|
|
1103
|
+
// up
|
|
1095
1104
|
this._upSound = new Audio(this._config.audio.sound?.up ?? `${this._config.basePath}/sounds/up.mp3`);
|
|
1105
|
+
this._upSound.volume =
|
|
1106
|
+
this._config.audio.sound?.upVolume ?? this._config.audio.sound?.masterVolume ?? 0.5;
|
|
1107
|
+
// down
|
|
1096
1108
|
this._downSound = new Audio(this._config.audio.sound?.down ?? `${this._config.basePath}/sounds/down.mp3`);
|
|
1097
|
-
this.
|
|
1109
|
+
this._downSound.volume =
|
|
1110
|
+
this._config.audio.sound?.downVolume ?? this._config.audio.sound?.masterVolume ?? 0.5;
|
|
1111
|
+
// ping
|
|
1112
|
+
this._pingSound = new Audio(this._config.audio.sound?.ping ?? `${this._config.basePath}/sounds/ping.mp3`);
|
|
1113
|
+
this._pingSound.volume =
|
|
1114
|
+
this._config.audio.sound?.pingVolume ?? this._config.audio.sound?.masterVolume ?? 0.1;
|
|
1115
|
+
// Preload
|
|
1116
|
+
this._upSound.preload = this._downSound.preload = this._pingSound.preload = 'auto';
|
|
1098
1117
|
this._loadSubscriptions();
|
|
1118
|
+
// Get speaker list
|
|
1119
|
+
this._speakerList().then((e) => {
|
|
1120
|
+
this._speakers = e;
|
|
1121
|
+
});
|
|
1099
1122
|
}
|
|
1100
1123
|
}
|
|
1124
|
+
/**
|
|
1125
|
+
* List of speakers
|
|
1126
|
+
*/
|
|
1127
|
+
get speakers() {
|
|
1128
|
+
return this._speakers;
|
|
1129
|
+
}
|
|
1130
|
+
/**
|
|
1131
|
+
* Set output source
|
|
1132
|
+
*/
|
|
1133
|
+
set source(deviceId) {
|
|
1134
|
+
this._setSource(deviceId);
|
|
1135
|
+
}
|
|
1101
1136
|
ngOnDestroy() {
|
|
1102
1137
|
this._subs.unsubscribe();
|
|
1103
1138
|
}
|
|
@@ -1141,6 +1176,12 @@ class SpeakerService {
|
|
|
1141
1176
|
source.start(this._nextPlayTime);
|
|
1142
1177
|
this._sources.push(source); // keep instance of source to stop later
|
|
1143
1178
|
this._nextPlayTime += audioBuffer.duration;
|
|
1179
|
+
source.onended = () => {
|
|
1180
|
+
this._sources.shift();
|
|
1181
|
+
if (!this._sources.length)
|
|
1182
|
+
if (!this._config.orb?.mode || this._config.orb?.mode === 'auto')
|
|
1183
|
+
this._orb.setState('initialized'); // reset
|
|
1184
|
+
};
|
|
1144
1185
|
if (!this._config.orb?.mode || this._config.orb?.mode === 'auto')
|
|
1145
1186
|
this._orb.setState('speaking'); // speaking
|
|
1146
1187
|
}
|
|
@@ -1160,6 +1201,26 @@ class SpeakerService {
|
|
|
1160
1201
|
return;
|
|
1161
1202
|
this._downSound.play();
|
|
1162
1203
|
}
|
|
1204
|
+
/**
|
|
1205
|
+
* Play ping
|
|
1206
|
+
*/
|
|
1207
|
+
playPing() {
|
|
1208
|
+
if (this._config.audio.sound?.enable === false)
|
|
1209
|
+
return;
|
|
1210
|
+
this._pingSound.play();
|
|
1211
|
+
}
|
|
1212
|
+
/**
|
|
1213
|
+
* Set source
|
|
1214
|
+
*
|
|
1215
|
+
* @param deviceId
|
|
1216
|
+
*/
|
|
1217
|
+
async _setSource(deviceId) {
|
|
1218
|
+
if (typeof this._mic.audioContext.setSinkId === 'function') {
|
|
1219
|
+
await this._mic.audioContext.setSinkId(deviceId);
|
|
1220
|
+
}
|
|
1221
|
+
else
|
|
1222
|
+
this._event.exception.next(new Error('AudioContext.setSinkId is not supported. Playing on default'));
|
|
1223
|
+
}
|
|
1163
1224
|
/**
|
|
1164
1225
|
* Clear playback queue
|
|
1165
1226
|
*/
|
|
@@ -1181,12 +1242,21 @@ class SpeakerService {
|
|
|
1181
1242
|
this._subs.sink = this._event.silence.subscribe((ev) => {
|
|
1182
1243
|
if (!ev.interimResponse)
|
|
1183
1244
|
this.playDown();
|
|
1245
|
+
else
|
|
1246
|
+
this.playPing();
|
|
1184
1247
|
});
|
|
1185
1248
|
// If recording event
|
|
1186
1249
|
this._subs.sink = this._event.recording.subscribe(() => {
|
|
1187
1250
|
this._clearQueue();
|
|
1188
1251
|
});
|
|
1189
1252
|
}
|
|
1253
|
+
/**
|
|
1254
|
+
* Speakers
|
|
1255
|
+
*/
|
|
1256
|
+
async _speakerList() {
|
|
1257
|
+
const devices = await navigator.mediaDevices.enumerateDevices();
|
|
1258
|
+
return devices.filter((device) => device.kind === 'audiooutput');
|
|
1259
|
+
}
|
|
1190
1260
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: SpeakerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
1191
1261
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: SpeakerService }); }
|
|
1192
1262
|
}
|
|
@@ -1215,9 +1285,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
|
|
|
1215
1285
|
type: Injectable
|
|
1216
1286
|
}] });
|
|
1217
1287
|
|
|
1218
|
-
/* eslint-disable @typescript-eslint/member-ordering */
|
|
1219
|
-
/* eslint-disable @typescript-eslint/prefer-for-of */
|
|
1220
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
1221
1288
|
class OrbComponent {
|
|
1222
1289
|
constructor() {
|
|
1223
1290
|
this._config = inject(ConfigService);
|
|
@@ -1228,12 +1295,21 @@ class OrbComponent {
|
|
|
1228
1295
|
this._ngZone = inject(NgZone);
|
|
1229
1296
|
this._service = inject(OrbComponentService);
|
|
1230
1297
|
this._subs = new SubSink();
|
|
1231
|
-
this.
|
|
1298
|
+
this._timer = new THREE.Timer();
|
|
1232
1299
|
this.micVolume = 0;
|
|
1233
1300
|
// State Management
|
|
1234
1301
|
this.currentState = 'idle';
|
|
1235
1302
|
this.agentProfiles = {
|
|
1236
1303
|
idle: {
|
|
1304
|
+
spike: 0.05,
|
|
1305
|
+
noiseScale: 1.0,
|
|
1306
|
+
speed: 0.2,
|
|
1307
|
+
twist: 0.0,
|
|
1308
|
+
pulse: 0.0,
|
|
1309
|
+
base: '#001133',
|
|
1310
|
+
peak: '#ff4000',
|
|
1311
|
+
},
|
|
1312
|
+
initialized: {
|
|
1237
1313
|
spike: 0.05,
|
|
1238
1314
|
noiseScale: 1.0,
|
|
1239
1315
|
speed: 0.2,
|
|
@@ -1278,7 +1354,8 @@ class OrbComponent {
|
|
|
1278
1354
|
*/
|
|
1279
1355
|
this._animate = () => {
|
|
1280
1356
|
this._animationFrameId = requestAnimationFrame(this._animate);
|
|
1281
|
-
|
|
1357
|
+
this._timer.update();
|
|
1358
|
+
const elapsedTime = this._timer.getElapsed();
|
|
1282
1359
|
this._material.uniforms['uTime'].value = elapsedTime;
|
|
1283
1360
|
let dynamicSpike = this.targets.spike;
|
|
1284
1361
|
let dynamicPulse = this.targets.pulse;
|
|
@@ -1310,6 +1387,9 @@ class OrbComponent {
|
|
|
1310
1387
|
get orbSize() {
|
|
1311
1388
|
return this._config.orb?.size ?? 400;
|
|
1312
1389
|
}
|
|
1390
|
+
get isMuted() {
|
|
1391
|
+
return this._mic.isMuted;
|
|
1392
|
+
}
|
|
1313
1393
|
ngAfterViewInit() {
|
|
1314
1394
|
if (this._platform.isServer)
|
|
1315
1395
|
return;
|
|
@@ -1318,6 +1398,7 @@ class OrbComponent {
|
|
|
1318
1398
|
// MUST run outside Angular to prevent CD loops
|
|
1319
1399
|
this._ngZone.runOutsideAngular(() => {
|
|
1320
1400
|
this._initThreeJs();
|
|
1401
|
+
this._timer.connect(document);
|
|
1321
1402
|
this._animate();
|
|
1322
1403
|
});
|
|
1323
1404
|
}
|
|
@@ -1339,10 +1420,6 @@ class OrbComponent {
|
|
|
1339
1420
|
this._geometry.dispose();
|
|
1340
1421
|
if (this._material)
|
|
1341
1422
|
this._material.dispose();
|
|
1342
|
-
// Allow garbage collection
|
|
1343
|
-
this._scene = null;
|
|
1344
|
-
this._camera = null;
|
|
1345
|
-
this._renderer = null;
|
|
1346
1423
|
}
|
|
1347
1424
|
/**
|
|
1348
1425
|
* Space bar press
|
|
@@ -1357,6 +1434,8 @@ class OrbComponent {
|
|
|
1357
1434
|
* Toggle recording
|
|
1358
1435
|
*/
|
|
1359
1436
|
toggleRecording() {
|
|
1437
|
+
if (this.isMuted)
|
|
1438
|
+
return;
|
|
1360
1439
|
this._audio.toggleRecording();
|
|
1361
1440
|
}
|
|
1362
1441
|
/**
|
|
@@ -1376,7 +1455,7 @@ class OrbComponent {
|
|
|
1376
1455
|
*/
|
|
1377
1456
|
_loadSubscribers() {
|
|
1378
1457
|
this._subs.sink = this._event.speech.subscribe((data) => {
|
|
1379
|
-
this.micVolume = this.
|
|
1458
|
+
this.micVolume = this.isMuted ? 0 : data.dbNormalized;
|
|
1380
1459
|
});
|
|
1381
1460
|
// only update orb state if mode is auto
|
|
1382
1461
|
if (!this._config.orb?.mode || this._config.orb?.mode === 'auto') {
|
|
@@ -1406,10 +1485,7 @@ class OrbComponent {
|
|
|
1406
1485
|
*/
|
|
1407
1486
|
_getTTSVolume() {
|
|
1408
1487
|
this._mic.analyzer.getByteFrequencyData(this.dataArray);
|
|
1409
|
-
|
|
1410
|
-
for (let i = 0; i < this.dataArray.length; i++) {
|
|
1411
|
-
sum += this.dataArray[i];
|
|
1412
|
-
}
|
|
1488
|
+
const sum = this.dataArray.reduce((a, b) => a + b, 0);
|
|
1413
1489
|
return sum / this.dataArray.length / 255.0;
|
|
1414
1490
|
}
|
|
1415
1491
|
/**
|
|
@@ -1576,12 +1652,13 @@ class OrbComponent {
|
|
|
1576
1652
|
[style.height.px]="orbSize"
|
|
1577
1653
|
(click)="toggleRecording()"
|
|
1578
1654
|
(keypress)="toggleRecording()"
|
|
1655
|
+
[ngClass]="{ muted: isMuted }"
|
|
1579
1656
|
></div>
|
|
1580
|
-
`, isInline: true, styles: [".orb-container{display:flex;justify-content:center;align-items:center;overflow:hidden;cursor:pointer}canvas{display:block;outline:none}\n"] }); }
|
|
1657
|
+
`, isInline: true, styles: [".orb-container{display:flex;justify-content:center;align-items:center;overflow:hidden;cursor:pointer}.muted{cursor:not-allowed}canvas{display:block;outline:none}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); }
|
|
1581
1658
|
}
|
|
1582
1659
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: OrbComponent, decorators: [{
|
|
1583
1660
|
type: Component,
|
|
1584
|
-
args: [{ selector: 'app-orb-component', template: `
|
|
1661
|
+
args: [{ selector: 'app-orb-component', imports: [NgClass], template: `
|
|
1585
1662
|
<div
|
|
1586
1663
|
#rendererContainer
|
|
1587
1664
|
role="button"
|
|
@@ -1591,8 +1668,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
|
|
|
1591
1668
|
[style.height.px]="orbSize"
|
|
1592
1669
|
(click)="toggleRecording()"
|
|
1593
1670
|
(keypress)="toggleRecording()"
|
|
1671
|
+
[ngClass]="{ muted: isMuted }"
|
|
1594
1672
|
></div>
|
|
1595
|
-
`, styles: [".orb-container{display:flex;justify-content:center;align-items:center;overflow:hidden;cursor:pointer}canvas{display:block;outline:none}\n"] }]
|
|
1673
|
+
`, styles: [".orb-container{display:flex;justify-content:center;align-items:center;overflow:hidden;cursor:pointer}.muted{cursor:not-allowed}canvas{display:block;outline:none}\n"] }]
|
|
1596
1674
|
}], propDecorators: { _rendererContainer: [{
|
|
1597
1675
|
type: ViewChild,
|
|
1598
1676
|
args: ['rendererContainer', { static: true }]
|
|
@@ -1777,6 +1855,8 @@ function provideWakeyWakey(config) {
|
|
|
1777
1855
|
...Object.values(modelPath).map((path) => InferenceSession.create(path, { executionProviders: ['wasm'] })),
|
|
1778
1856
|
_mic.init(),
|
|
1779
1857
|
]);
|
|
1858
|
+
if (!sessions[4])
|
|
1859
|
+
throw new Error('Failed to initialize mic!');
|
|
1780
1860
|
// set sessions
|
|
1781
1861
|
_model.session = {
|
|
1782
1862
|
melspectrogram: sessions[0],
|
|
@@ -1788,6 +1868,7 @@ function provideWakeyWakey(config) {
|
|
|
1788
1868
|
];
|
|
1789
1869
|
}
|
|
1790
1870
|
|
|
1871
|
+
/// <reference path="./index.d.ts" />
|
|
1791
1872
|
/*
|
|
1792
1873
|
* Public API Surface of wakeywakey
|
|
1793
1874
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prabhjeet.me-wakeywakey.mjs","sources":["../../../projects/wakeywakey/src/lib/services/audio/microphone-service/microphone-service.constant.ts","../../../projects/wakeywakey/src/lib/services/audio/audio-service.util.ts","../../../projects/wakeywakey/src/lib/components/orb-component/orb-component-service.ts","../../../projects/wakeywakey/src/lib/wakeywakey-component.const.ts","../../../projects/wakeywakey/src/lib/services/config/config-service.type.ts","../../../projects/wakeywakey/src/lib/services/config/config-service.ts","../../../projects/wakeywakey/src/lib/services/event/event-service.ts","../../../projects/wakeywakey/src/lib/services/model/model-service.const.ts","../../../projects/wakeywakey/src/lib/services/model/model-service.type.ts","../../../projects/wakeywakey/src/lib/services/model/model-service.ts","../../../projects/wakeywakey/src/lib/services/pipeline/pipeline-service.ts","../../../projects/wakeywakey/src/lib/services/audio/audio-service.const.ts","../../../projects/wakeywakey/src/lib/services/audio/microphone-service/microphone-service.ts","../../../projects/wakeywakey/src/lib/services/platform/platform-service.ts","../../../projects/wakeywakey/src/lib/services/audio/speech-recognition/speech-recognition-service.ts","../../../projects/wakeywakey/src/lib/services/audio/vad-service/vad-service.ts","../../../projects/wakeywakey/src/lib/services/audio/vad-service/vad-service.const.ts","../../../projects/wakeywakey/src/lib/services/audio/audio-service.ts","../../../projects/wakeywakey/src/lib/services/audio/speaker-service/speaker-service.ts","../../../projects/wakeywakey/src/lib/services/bridge/bridge-service.ts","../../../projects/wakeywakey/src/lib/components/orb-component/orb-component.ts","../../../projects/wakeywakey/src/lib/wakeywakey-component.ts","../../../projects/wakeywakey/src/provider.ts","../../../projects/wakeywakey/src/public-api.ts","../../../projects/wakeywakey/src/prabhjeet.me-wakeywakey.ts"],"sourcesContent":["/**\n * Audio sample rate\n */\nexport const SAMPLE_RATE = 16000;\n\n/**\n * Audio worklet name\n */\nexport const MICROPHONE_PROCESSOR_NAME = 'microphone-buffer-processor';\n\n/**\n * Audio worklet processor\n */\nexport const MICROPHONE_PROCESSOR = `\n class MicrophoneBufferProcessor extends AudioWorkletProcessor {\n // collect 1280 samples before sending them to the main thread\n // Web Audio processes 128 frames per call\n // batching 10 small chunks into 1 bigger chunk\n frameBlockSize = 128 * 10; // total samples per emitted chunk\n\n // for storing small chunks\n accumulatedSamples = new Float32Array(this.frameBlockSize);\n\n // cursor\n writeIndex = 0;\n\n constructor() {\n super();\n }\n\n dbNormalized(db) {\n const minDb = -60;\n const maxDb = 0;\n\n const clamped = Math.max(minDb, Math.min(db, maxDb));\n return (clamped - minDb) / (maxDb - minDb);\n }\n\n // runs every 128 frames. ~ every 2.67 ms (at 48kHz), ~ 8ms (at 16KHz)\n process(inputList) {\n const firstInput = inputList[0];\n\n // no input connected\n if (!firstInput || firstInput.length === 0) {\n return true;\n }\n\n // raw waveform values\n const firstChannelSamples = firstInput[0]; // Float32Array(128)\n\n let sum = 0;\n\n // 0 -> 128\n for (let i = 0; i < firstChannelSamples.length; i++) {\n // dump each sample in accumulated sample array\n this.accumulatedSamples[this.writeIndex++] = firstChannelSamples[i];\n sum += firstChannelSamples[i] * firstChannelSamples[i];\n }\n\n // once buffer is full, break\n if (this.writeIndex === this.frameBlockSize) {\n const rms = Math.sqrt(sum / firstChannelSamples.length);\n const db = 20 * Math.log10(rms ?? 0.00001);\n this.writeIndex = 0;\n\n // send to main thread\n this.port.postMessage({\n sample: this.accumulatedSamples.slice(),\n rms,\n db,\n dbNormalized: this.dbNormalized(db),\n });\n }\n\n return true;\n }\n}\n\nregisterProcessor(\"${MICROPHONE_PROCESSOR_NAME}\", MicrophoneBufferProcessor);\n `;\n","import { SAMPLE_RATE } from './microphone-service/microphone-service.constant';\n\n/**\n * Audio utility\n */\nexport class AudioUtil {\n /**\n * Create wav blob url from audio chunk\n *\n * @param chunks Audio chunk\n * @param sampleRate Sample rate\n * @returns\n */\n static createWavBlob(chunks: Float32Array[], sampleRate = SAMPLE_RATE) {\n const totalLength = chunks.reduce((len, chunk) => len + chunk.length, 0);\n if (!totalLength) return null;\n\n // Merge chunks\n const combined = new Float32Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n combined.set(chunk, offset);\n offset += chunk.length;\n }\n\n // Convert to 16-bit PCM\n const pcmData = new Int16Array(totalLength);\n for (let i = 0; i < totalLength; i++) {\n const s = Math.max(-1, Math.min(1, combined[i]));\n pcmData[i] = s < 0 ? s * 0x8000 : s * 0x7fff;\n }\n\n const wavHeader = new ArrayBuffer(44);\n const view = new DataView(wavHeader);\n\n const channels = 1;\n const bitsPerSample = 16;\n const byteRate = sampleRate * channels * (bitsPerSample / 8);\n const blockAlign = channels * (bitsPerSample / 8);\n\n const writeString = (offset: number, str: string) => {\n for (let i = 0; i < str.length; i++) {\n view.setUint8(offset + i, str.charCodeAt(i));\n }\n };\n\n writeString(0, 'RIFF');\n view.setUint32(4, 36 + pcmData.byteLength, true);\n writeString(8, 'WAVE');\n writeString(12, 'fmt ');\n view.setUint32(16, 16, true);\n view.setUint16(20, 1, true); // PCM\n view.setUint16(22, channels, true);\n view.setUint32(24, sampleRate, true);\n view.setUint32(28, byteRate, true);\n view.setUint16(32, blockAlign, true);\n view.setUint16(34, bitsPerSample, true);\n writeString(36, 'data');\n view.setUint32(40, pcmData.byteLength, true);\n\n const wavBlob = new Blob([wavHeader, pcmData], { type: 'audio/wav' });\n return URL.createObjectURL(wavBlob);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { AgentState } from './orb-component.type';\n\n@Injectable()\nexport class OrbComponentService {\n readonly state = new Subject<AgentState>();\n\n /**\n * Set state of orb\n */\n setState(state: AgentState) {\n this.state.next(state);\n }\n}\n","export const DEFAULT_THROTTLE_TIME = 1000;\n","import { InjectionToken } from '@angular/core';\nimport { OrbConfig } from '../../components/orb-component/orb-component.type';\nimport { AudioConfig } from '../audio/audio-service.type';\nimport { OnnxConfig } from '../model/model-service.type';\n\n/**\n * Wakey wakey configuration\n */\nexport interface Config {\n /**\n * Audio config\n */\n audio: AudioConfig;\n\n /**\n * Onnx config\n */\n onnx: OnnxConfig;\n\n /**\n * Orb config\n */\n orb?: OrbConfig;\n\n /**\n * In sliding window, there is a possibility of detecting wakeword mode than once.\n * This allows a cool down time before processing subsequent detections\n *\n * Default: 1000 (1 seconds)\n */\n throttleTime?: number;\n\n /**\n * DEFAULT | PTT: [WAKEWORD] -> Start Recording -> Silence (Spoken chunk & transcript) -> Done -> [WAKEWORD] .....\n * CHAT: [WAKEWORD] -> Start Recording -> Silence -> [Speaking] -> Start Recording -> Silence .....\n */\n mode?: 'DEFAULT' | 'VOICE_CHAT' | 'PTT';\n\n /**\n * Base asset path. This path will be used to access required resources\n *\n * Default: /wakeywakey\n */\n basePath?: string;\n\n /**\n * Key to use to activate listening (instead of wakeword)\n *\n * 'code' property of KeyboardEvent\n */\n hotkey?: string;\n}\n\n/**\n * Wakey wakey config token\n */\nexport const CONFIG = new InjectionToken<Config>('WAKEYWAKEY_CONFIG');\n","import { inject, Injectable } from '@angular/core';\nimport { DEFAULT_THROTTLE_TIME } from '../../wakeywakey-component.const';\nimport { Config, CONFIG } from './config-service.type';\n\n@Injectable()\nexport class ConfigService {\n private readonly _config = inject<Config>(CONFIG);\n\n /**\n * Audio config\n */\n get audio() {\n return this._config.audio;\n }\n\n /**\n * Onnx config\n */\n get onnx() {\n return this._config.onnx;\n }\n\n /**\n * Orb config\n */\n get orb() {\n return this._config.orb;\n }\n\n /**\n * Throttle time\n */\n get throttleTime() {\n return this._config.throttleTime ?? DEFAULT_THROTTLE_TIME;\n }\n\n /**\n * Mode\n */\n get mode() {\n return this._config.mode;\n }\n\n /**\n * Base path of assets\n */\n get basePath() {\n return this._config.basePath ?? '/wakeywakey';\n }\n\n /**\n * Hotkey\n */\n get hotkey() {\n return this._config.hotkey ?? 'Space';\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { RecordingEvent, SilenceEvent, SpeechEvent, WakeWordEvent } from './event-service.type';\n\n@Injectable()\nexport class EventService {\n /**\n * Fires when library loaded\n */\n readonly ready = new Subject<void>();\n\n /**\n * Fires when there is a message to log\n */\n readonly log = new Subject<string>();\n\n /**\n * Fires when there is an error\n */\n readonly exception = new Subject<Error>();\n\n /**\n * Fires when speech is detected\n */\n readonly speech = new Subject<SpeechEvent>();\n\n /**\n * Fires when wake word is detected\n */\n readonly wakeword = new Subject<WakeWordEvent>();\n\n /**\n * Fires when recording starts (after wake word detection)\n */\n readonly recording = new Subject<RecordingEvent>();\n\n /**\n * Fires silence is detected\n */\n readonly silence = new Subject<SilenceEvent>();\n}\n","export const DEFAULT_INFERENCE_SCORE = 0.5;\n","export const VAD_HANGOVER_FRAMES = 12;\n\nexport interface OnnxConfig {\n model: {\n /**\n * Mel Spectrogram model (.onnx)\n *\n * Default: [basePath]/models/melspectrogram.onnx\n */\n melspectrogram?: string;\n\n /**\n * Embedding model (.onnx)\n *\n * Default: [basePath]/models/embedding_model.onnx\n */\n embedding_model?: string;\n\n /**\n * Silero VAD (.onnx)\n *\n * Default: [basePath]/models/silero_vad_v4.onnx\n */\n silero_vad?: string;\n\n /**\n * Wake word model (.onnx)\n */\n wakeword: string;\n };\n\n /**\n * String representation of wakeword\n *\n * Ex 1: ['hey', 'jarvis']\n * Ex 2: ['alexa']\n */\n wakeword?: string[];\n\n /**\n * Path that contains onnx wasm runtime files\n *\n * Default: [basePath]/wasm\n */\n runtimePath?: string;\n\n /**\n * Wake word inference threshold\n *\n * Default: 0.5\n */\n wakewordInferenceThreshold?: number;\n}\n\nexport type InferenceModels = keyof OnnxConfig['model'];\n\nexport interface VadState {\n buffer: Float32Array[];\n hangoverCounter: number;\n isActive: boolean;\n emitFinal?: Float32Array[]; // Used to pass the completed chunk forward\n}\n","import { Injectable } from '@angular/core';\nimport { InferenceSession } from 'onnxruntime-web';\nimport { InferenceModels } from './model-service.type';\n\n@Injectable()\nexport class ModelService {\n /**\n * Inference session\n */\n private _inferenceSession: Record<InferenceModels, InferenceSession | undefined> = {\n melspectrogram: undefined,\n embedding_model: undefined,\n silero_vad: undefined,\n wakeword: undefined,\n };\n\n /**\n * Get melspectrogram inference session\n */\n get melSpectrogram() {\n return this._inferenceSession['melspectrogram']!;\n }\n\n /**\n * Get embedding inference session\n */\n get embedding() {\n return this._inferenceSession['embedding_model']!;\n }\n\n /**\n * Get Silero VAD inference session\n */\n get sileroVAD() {\n return this._inferenceSession['silero_vad']!;\n }\n\n /**\n * Get wakeword inference session\n */\n get wakeword() {\n return this._inferenceSession['wakeword']!;\n }\n\n /**\n * Set session instance\n */\n set session(sessions: Record<InferenceModels, InferenceSession | undefined>) {\n this._inferenceSession = sessions;\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { Tensor } from 'onnxruntime-web';\nimport { SpeechEvent } from '../event/event-service.type';\nimport { ModelService } from '../model/model-service';\n\n@Injectable()\nexport class PipelineService {\n /**\n * Dependencies\n */\n private readonly _model = inject(ModelService);\n\n // Configuration Constants\n private readonly MEL_WINDOW_SIZE = 76; // Number of mel frames needed for one embedding\n private readonly MEL_HOP_SIZE = 8; // How many frames to skip (the slide) after inference\n private readonly EMBEDDING_COUNT = 16; // Number of embeddings kept in memory (temporal context)\n private readonly FEATURE_DIM = 96; // Size of each embedding vector\n private readonly MEL_BINS = 32; // Number of frequency bins per mel frame\n\n /**\n * Historical buffer of embeddings representing the last ~1-2 seconds of audio context.\n * Initialized with empty (zero) vectors.\n */\n private readonly _embeddingQueue = Array.from({ length: this.EMBEDDING_COUNT }, () =>\n new Float32Array(this.FEATURE_DIM).fill(0),\n );\n\n /**\n * Buffer of calculated Mel Spectrogram frames waiting to be processed.\n */\n private readonly _melFrameQueue: Float32Array[] = [];\n\n /**\n * Main entry point: Processes a new chunk of audio and returns a detection score.\n */\n async run(speech: SpeechEvent): Promise<number> {\n // 1. Convert raw PCM audio into Mel Spectrogram frames and add to queue\n await this._generateMelSpectrogram(speech.sample);\n\n let latestScore = 0;\n\n // 2. Process the queue using a sliding window approach\n // While we have enough frames to form a full input window (76 frames)...\n while (this._melFrameQueue.length >= this.MEL_WINDOW_SIZE) {\n // Extract a single feature vector (embedding) from the current window\n const combinedEmbeddings = await this._processWindowToEmbeddings();\n\n // Classify the sequence of embeddings to see if the wake-word is present\n latestScore = await this._getWakeWordScore(combinedEmbeddings);\n\n // Slide the window: Remove the oldest 8 frames to make room for new audio\n this._melFrameQueue.splice(0, this.MEL_HOP_SIZE);\n }\n\n return latestScore;\n }\n\n /**\n * STAGE 1: Converts raw audio samples into Mel Frequency bins.\n */\n private async _generateMelSpectrogram(samples: Float32Array) {\n const session = this._model.melSpectrogram;\n\n // Wrap raw audio in an ONNX Tensor [Batch: 1, Samples: N]\n const inputTensor = new Tensor('float32', samples, [1, samples.length]);\n\n // Run the Mel-Spectrogram model\n const output = await session.run({ [session.inputNames[0]]: inputTensor });\n const rawMelData = output[session.outputNames[0]].data as Float32Array;\n\n /**\n * Post-processing & Normalization:\n * The model output is scaled to fit the expected input range of the embedding model.\n * Logic: (value / 10) + 2.0\n */\n const normalizedMel = rawMelData.map((val) => val / 10.0 + 2.0);\n\n // Slice the flat output array into individual frames of 32 bins and queue them\n // Each inference usually produces 5 frames for the given 1280 audio samples\n for (let i = 0; i < 5; i++) {\n const start = i * this.MEL_BINS;\n const end = start + this.MEL_BINS;\n this._melFrameQueue.push(normalizedMel.subarray(start, end));\n }\n }\n\n /**\n * STAGE 2: Extracts features (embeddings) from a window of Mel frames.\n */\n private async _processWindowToEmbeddings(): Promise<Float32Array> {\n const session = this._model.embedding!;\n\n // Take the first 76 frames from our queue\n const windowFrames = this._melFrameQueue.slice(0, this.MEL_WINDOW_SIZE);\n\n // Flatten the frames into a single continuous array for the Tensor\n const flattenedInput = new Float32Array(this.MEL_WINDOW_SIZE * this.MEL_BINS);\n windowFrames.forEach((frame, i) => {\n flattenedInput.set(frame, i * this.MEL_BINS);\n });\n\n // Run the Embedding model [1, 76, 32, 1]\n const inputTensor = new Tensor('float32', flattenedInput, [1, 76, 32, 1]);\n const output = await session.run({ [session.inputNames[0]]: inputTensor });\n const newEmbedding = output[session.outputNames[0]].data as Float32Array;\n\n // Update the rolling embedding queue (First-In, First-Out)\n this._embeddingQueue.shift();\n this._embeddingQueue.push(new Float32Array(newEmbedding));\n\n // Flatten the last 16 embeddings into one large vector for the final classifier\n const combinedBuffer = new Float32Array(this.EMBEDDING_COUNT * this.FEATURE_DIM);\n this._embeddingQueue.forEach((emb, i) => {\n combinedBuffer.set(emb, i * this.FEATURE_DIM);\n });\n\n return combinedBuffer;\n }\n\n /**\n * STAGE 3: Final classification score based on temporal embedding sequence.\n */\n private async _getWakeWordScore(embeddings: Float32Array): Promise<number> {\n const session = this._model.wakeword;\n\n // Shape: [Batch: 1, Sequence: 16, Features: 96]\n const inputTensor = new Tensor('float32', embeddings, [\n 1,\n this.EMBEDDING_COUNT,\n this.FEATURE_DIM,\n ]);\n\n const results = await session.run({ [session.inputNames[0]]: inputTensor });\n\n // Extract the scalar probability score from the output tensor\n return results[session.outputNames[0]].data[0] as number;\n }\n}\n","export const DEFAULT_SILENCE_DURATION = 1000;\nexport const DEFAULT_SPEECH_THRESHOLD_TIME = 300;\n","import { inject, Injectable, OnDestroy } from '@angular/core';\nimport { loadRnnoise, RnnoiseWorkletNode } from '@sapphi-red/web-noise-suppressor';\nimport { Subject } from 'rxjs';\nimport { ConfigService } from '../../config/config-service';\nimport { EventService } from '../../event/event-service';\nimport {\n MICROPHONE_PROCESSOR,\n MICROPHONE_PROCESSOR_NAME,\n SAMPLE_RATE,\n} from './microphone-service.constant';\nimport { MicrophoneProcessorData } from './microphone-service.type';\n\n@Injectable()\nexport class MicrophoneService implements OnDestroy {\n /**\n * Dependencies\n */\n private readonly _event = inject(EventService);\n private readonly _config = inject(ConfigService);\n\n /**\n * Audio data subject\n */\n private readonly _data = new Subject<MicrophoneProcessorData>();\n\n /**\n * List of available microphones\n */\n private _microphones: MediaDeviceInfo[] = [];\n\n /**\n * Media steam\n */\n private _stream!: MediaStream;\n\n /**\n * Media steam source\n */\n private _source?: MediaStreamAudioSourceNode;\n\n /**\n * Audio context\n */\n private _audioContext?: AudioContext;\n\n /**\n * Is muted\n */\n private _isMuted = false;\n\n /**\n * Gain node\n */\n private _gainNode?: GainNode | undefined;\n\n private _analyser?: AnalyserNode;\n\n /**\n * List of available microphones\n */\n get microphones() {\n return this._microphones;\n }\n\n /**\n * Microphone data\n */\n get data() {\n return this._data;\n }\n\n /**\n * Audio context\n */\n get audioContext() {\n return this._audioContext;\n }\n\n /**\n * Analyzer node\n */\n get analyzer() {\n return this._analyser;\n }\n\n /**\n * Media steam source node\n */\n get sourceNode() {\n return this._source;\n }\n\n /**\n * Muted state\n */\n get isMuted() {\n return this._isMuted;\n }\n\n /**\n * Set gain\n */\n set gain(value: number) {\n if (this._gainNode) this._gainNode.gain.value = value;\n }\n\n /**\n * Set muted state\n */\n set isMuted(set: boolean) {\n this._isMuted = set;\n }\n\n /**\n * Set input source\n */\n set source(deviceId: string) {\n this.init(deviceId);\n }\n\n ngOnDestroy(): void {\n // close audio context\n this._audioContext?.close();\n this._source?.disconnect();\n this._analyser?.disconnect();\n this._stream?.getTracks().forEach((track) => {\n track.stop();\n });\n }\n\n /**\n * Initialize\n *\n * @param deviceId Input device id (from microphone list)\n */\n async init(deviceId = 'default') {\n try {\n // cleanup\n this.ngOnDestroy();\n\n // request permission\n this._stream = await navigator.mediaDevices.getUserMedia({\n audio: {\n deviceId: { exact: deviceId },\n noiseSuppression: this._config.audio.noiseSuppression?.nativeNoiseSuppression || false,\n echoCancellation: this._config.audio.noiseSuppression?.nativeEchoCancellation || false,\n autoGainControl: this._config.audio.noiseSuppression?.autoGainControl || false,\n },\n });\n\n this._event.log.next(\n `${MicrophoneService.name}: Microphone permission granted (deviceid: '${deviceId ?? 'default'}')!`,\n );\n\n // save list of microphones\n this._microphones = await this._microphoneList();\n\n // monitor audio\n await this._monitor();\n\n return true;\n } catch (error) {\n this._event.exception.next(error as Error);\n }\n\n return false;\n }\n\n /**\n * Monitor audio\n *\n * @returns chunk subject\n */\n private async _monitor() {\n const worklet = await this._workletNode();\n\n // on message\n worklet.port.onmessage = async (event) => {\n const data = (event.data as MicrophoneProcessorData) ?? null;\n if (!data) return;\n\n // emit chunk\n this._data.next(data);\n };\n\n return this._data;\n }\n\n /**\n * Save microphones\n */\n private async _microphoneList() {\n const devices = await navigator.mediaDevices.enumerateDevices();\n return devices.filter((device) => device.kind === 'audioinput');\n }\n\n /**\n * Prepare worklet node\n */\n private async _workletNode() {\n // Create audio context\n this._audioContext = new AudioContext({ sampleRate: SAMPLE_RATE });\n\n this._analyser = this._audioContext.createAnalyser();\n this._analyser.fftSize = 256;\n\n if (this._config.audio.noiseSuppression) {\n await this._audioContext.audioWorklet.addModule(\n this._config.audio.noiseSuppression.worklet ??\n `${this._config.basePath}/worklets/workletProcessor.js`,\n );\n }\n\n // Load custom worklet\n const blob = new Blob([MICROPHONE_PROCESSOR], { type: 'application/javascript' });\n const workletURL = URL.createObjectURL(blob);\n await this._audioContext.audioWorklet.addModule(workletURL);\n URL.revokeObjectURL(workletURL);\n\n // Create Nodes\n this._source = this._audioContext.createMediaStreamSource(this._stream);\n\n // Gain Node\n const gainNode = this._audioContext.createGain();\n gainNode.gain.value = this._config.audio.gain;\n\n if (this._config.audio.noiseSuppression) {\n // Load RNNoise dependencies\n const rnnoiseWasmBinary = await loadRnnoise({\n url:\n this._config.audio.noiseSuppression.rnnoise ??\n `${this._config.basePath}/wasm/rnnoise.wasm`,\n simdUrl:\n this._config.audio.noiseSuppression.rnnoise_simd ??\n `${this._config.basePath}/wasm/rnnoise_simd.wasm`,\n });\n\n // RNNoise Node\n const rnnoiseNode = new RnnoiseWorkletNode(this._audioContext, {\n wasmBinary: rnnoiseWasmBinary,\n maxChannels: 1, // Standard for mono microphone input\n });\n\n this._source.connect(rnnoiseNode);\n rnnoiseNode.connect(gainNode);\n } else {\n this._source.connect(gainNode);\n }\n\n this._source.connect(this._analyser);\n\n // loop back mic sound\n if (this._config.audio.loopBackToSpeakers)\n this._analyser.connect(this.audioContext!.destination);\n\n // Custom Worklet Node\n const workletNode = new AudioWorkletNode(this._audioContext, MICROPHONE_PROCESSOR_NAME);\n\n // Connect the Graph: Source -> RNNoise (if noise suppression) -> Gain -> Custom Worklet\n gainNode.connect(workletNode);\n\n return workletNode;\n }\n}\n","import { isPlatformBrowser, isPlatformServer } from '@angular/common';\nimport { Injectable, PLATFORM_ID, inject } from '@angular/core';\n\n@Injectable()\nexport class PlatformService {\n private readonly _platform = inject(PLATFORM_ID);\n\n /**\n * Is browser\n */\n get isBrowser(): boolean {\n return isPlatformBrowser(this._platform);\n }\n\n /**\n * Is server\n */\n get isServer(): boolean {\n return isPlatformServer(this._platform);\n }\n}\n","import { inject, Injectable, OnDestroy } from '@angular/core';\nimport { EventService } from '../../event/event-service';\nimport { PlatformService } from '../../platform/platform-service';\n\n@Injectable()\nexport class SpeechRecognitionService implements OnDestroy {\n /**\n * Dependencies\n */\n private readonly _event = inject(EventService);\n private readonly _platform = inject(PlatformService);\n\n private _recognitionClass!: {\n new (): SpeechRecognition;\n prototype: SpeechRecognition;\n };\n\n /**\n * Instance\n */\n private _recognition!: SpeechRecognition;\n\n /**\n * Transcript\n */\n private _transcript = '';\n\n /**\n * Get transcript\n */\n get transcript() {\n return this._transcript;\n }\n\n ngOnDestroy(): void {\n this.reset(); // clear transcript\n\n if (this._platform.isBrowser) this._recognition.stop();\n }\n\n /**\n * Clear transcript\n */\n reset() {\n this._transcript = '';\n }\n\n init() {\n this._recognitionClass = window.SpeechRecognition || window.webkitSpeechRecognition;\n\n if (!SpeechRecognition) {\n this._event.exception.next(new Error('Speech recognition is not supported'));\n return;\n }\n\n this._recognition = new this._recognitionClass(); // initialize\n\n // 2. Configuration\n this._recognition.lang = 'en-US'; // Set language\n this._recognition.continuous = true; // Keep listening even if the user pauses\n this._recognition.interimResults = true; // Show results while the user is still speaking\n\n this._recognition.onend = () => {\n this.reset();\n this.init(); // start\n };\n\n // 3. Handle Results\n this._recognition.onresult = (event) => {\n this._transcript = '';\n\n for (let i = event.resultIndex; i < event.results.length; i++)\n this._transcript += event.results[i][0].transcript;\n };\n\n this._recognition.start(); // start\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { Tensor, TypedTensor } from 'onnxruntime-web';\nimport { EventService } from '../../event/event-service';\nimport { ModelService } from '../../model/model-service';\nimport { SAMPLE_RATE } from '../microphone-service/microphone-service.constant';\nimport { InputMetadata, VADState } from './vad-service.type';\n\n@Injectable()\nexport class VadService {\n /**\n * Dependencies\n */\n private readonly _event = inject(EventService);\n private readonly _model = inject(ModelService);\n\n /**\n * VAD Shape\n */\n private _shape: number[] = [];\n\n /**\n * VAD LSTM hidden & cell state\n */\n private _state: VADState | null = null;\n\n /**\n * Get session\n */\n private get _session() {\n return this._model.sileroVAD;\n }\n\n /**\n * Initialize\n */\n init() {\n this._shape = this._getShape();\n\n this._state = {\n hidden: new Tensor('float32', new Float32Array(128).fill(0), this._shape),\n cell: new Tensor('float32', new Float32Array(128).fill(0), this._shape),\n };\n }\n\n /**\n * Get VAD score\n *\n * @param chunk\n * @returns\n */\n async score(sample: Float32Array): Promise<number> {\n if (!this._state) throw new Error(`${VadService.name}: Undefined LSTM state.`);\n\n try {\n const tensor = new Tensor('float32', sample, [1, sample.length]);\n const sampleRate = new Tensor('int64', [BigInt(SAMPLE_RATE)], []);\n\n // run inference\n const response = await this._session.run({\n input: tensor,\n sr: sampleRate,\n h: this._state.hidden,\n c: this._state.cell,\n });\n\n // Update memory\n this._state.hidden = response['hn'] as TypedTensor<'float32'>;\n this._state.cell = response['cn'] as TypedTensor<'float32'>;\n\n return response['output'].data[0] as number;\n } catch (error) {\n this._event.exception.next(error as Error);\n return 0;\n }\n }\n\n /**\n * Get shape of vad session\n *\n * Ex: [2, 1, 64]\n */\n private _getShape() {\n const { shape } = (this._session.inputMetadata.find((e) => e.name === 'h') ??\n {}) as InputMetadata;\n\n const vadState = [];\n\n if (shape) {\n for (const sh of shape) {\n if (typeof sh === 'string') vadState.push(1);\n else vadState.push(sh);\n }\n\n return vadState;\n }\n\n throw new Error(`${VadService.name}: Unable to identify shape of the session.`);\n }\n}\n","/**\n * DefaulT VAD threshold\n */\nexport const DEFAULT_VAD_THRESHOLD = 0.5;\n","import { inject, Injectable, OnDestroy } from '@angular/core';\nimport {\n concatMap,\n distinctUntilChanged,\n EMPTY,\n filter,\n ignoreElements,\n map,\n merge,\n scan,\n share,\n switchMap,\n take,\n takeUntil,\n tap,\n throttleTime,\n timer,\n withLatestFrom,\n} from 'rxjs';\nimport { SubSink } from 'subsink';\nimport { ConfigService } from '../config/config-service';\nimport { EventService } from '../event/event-service';\nimport { SpeechEvent } from '../event/event-service.type';\nimport { DEFAULT_INFERENCE_SCORE } from '../model/model-service.const';\nimport { VAD_HANGOVER_FRAMES, VadState } from '../model/model-service.type';\nimport { PipelineService } from '../pipeline/pipeline-service';\nimport { DEFAULT_SILENCE_DURATION, DEFAULT_SPEECH_THRESHOLD_TIME } from './audio-service.const';\nimport { MicrophoneService } from './microphone-service/microphone-service';\nimport { SpeechRecognitionService } from './speech-recognition/speech-recognition-service';\nimport { VadService } from './vad-service/vad-service';\nimport { DEFAULT_VAD_THRESHOLD } from './vad-service/vad-service.const';\n\n@Injectable()\nexport class AudioService implements OnDestroy {\n /**\n * Dependencies\n */\n private readonly _config = inject(ConfigService);\n private readonly _event = inject(EventService);\n private readonly _mic = inject(MicrophoneService);\n private readonly _vad = inject(VadService);\n private readonly _pipeline = inject(PipelineService);\n private readonly _speechRecognition = inject(SpeechRecognitionService);\n\n private readonly _subs = new SubSink();\n\n private _endCurrentRecording = false;\n\n /**\n * Recording state\n */\n private _isRecording = false;\n\n /**\n * Is process is initialized (detected wakeword)\n */\n private _isInitialized = false;\n\n get isRecording() {\n return this._isRecording;\n }\n\n ngOnDestroy(): void {\n this._subs.unsubscribe();\n }\n\n /**\n * Initialize audio\n */\n async init() {\n if (!this._mic.microphones.length) {\n this._event.exception.next(new Error('Microphone permission required!'));\n return;\n }\n\n const data = await this._mic.data;\n\n // Init VAD\n this._vad.init();\n\n this._speechRecognition.init();\n\n // Fire ready event\n this._event.ready.next();\n\n data.subscribe(async (data) => {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const that = this;\n\n // Fire a speech event\n this._event.speech.next({\n ...data,\n sample: this._mic.isMuted ? new Float32Array(1280).fill(0) : data.sample, // no speech data if muted\n vadScore: await this._vad.score(data.sample), // emit vad score even if muted\n get hasVoiceActivity() {\n return this.vadScore > (that._config.audio.vadThreshold ?? DEFAULT_VAD_THRESHOLD);\n },\n });\n });\n\n this._listenForWakeword();\n this._captureCommandAfterWakeword();\n }\n\n /**\n * Force start recording (without wakeword)\n */\n forceStartRecording() {\n this._isInitialized = true;\n this._endCurrentRecording = false;\n\n // this._speechRecognition.reset(); // reset transcript\n this._event.wakeword.next({\n inferenceScore: 0,\n chunk: [],\n vadScore: 0,\n hasVoiceActivity: false,\n sample: new Float32Array(),\n rms: 0,\n db: 0,\n dbNormalized: 0,\n });\n }\n\n /**\n * Force end recording\n */\n forceEndRecording() {\n this._endCurrentRecording = true;\n this._isInitialized = false;\n\n this._event.silence.next({\n chunk: new Float32Array(),\n transcript: '',\n interimResponse: false, // final response\n });\n }\n\n /**\n * Toggle recording\n */\n toggleRecording() {\n if (this._isInitialized) {\n this._isInitialized = false;\n this.forceEndRecording();\n } else this.forceStartRecording();\n }\n\n /**\n * Identifies the wakeword and emits the event\n */\n private _listenForWakeword() {\n const vad$ = this._getWakeWordStream();\n\n this._subs.sink = this._event.speech\n .pipe(\n filter(() => !this._isInitialized && !this._mic.isMuted),\n withLatestFrom(vad$),\n concatMap(async ([speech, vadState]) => {\n const score = await this._pipeline.run(speech);\n return { speech, score, chunk: vadState.buffer };\n }),\n filter(({ score }) => {\n if (this._config.onnx.wakeword) {\n const transcriptArray = this._speechRecognition.transcript\n .toLowerCase()\n .trim()\n .split(' ');\n\n // use speech recognition for wake word identification\n if (transcriptArray.length === this._config.onnx.wakeword.length)\n for (const idx in this._config.onnx.wakeword)\n if (\n +idx < transcriptArray.length &&\n transcriptArray[idx].includes(this._config.onnx.wakeword[idx].toLowerCase())\n )\n return true;\n }\n\n return score > (this._config.onnx.wakewordInferenceThreshold ?? DEFAULT_INFERENCE_SCORE);\n }),\n )\n .subscribe(({ speech, score, chunk }) => {\n this._event.wakeword.next({ ...speech, inferenceScore: score, chunk });\n });\n }\n\n /**\n * New logic: Captures the full command audio after a wakeword\n */\n private _captureCommandAfterWakeword() {\n const SILENCE_DURATION = this._config.audio.silenceDuration ?? DEFAULT_SILENCE_DURATION;\n const VAD_THRESHOLD = this._config.audio.vadThreshold ?? DEFAULT_VAD_THRESHOLD;\n const PRE_ROLL_MS = this._config.audio.speechThresholdTime ?? DEFAULT_SPEECH_THRESHOLD_TIME;\n const CHUNK_DURATION_MS = 80; // Each speech event is fired (by audio processor) at 80 ms\n const MAX_SLIDING_WINDOW_CHUNKS = Math.ceil(PRE_ROLL_MS / CHUNK_DURATION_MS);\n\n // speech sliding window state\n const speechSlidingWindow: Float32Array[] = [];\n\n // trigger 1: wakeword\n const wakewordTrigger$ = this._event.wakeword.pipe(\n filter(() => !this._isRecording), // Ignore wakeword if already recording\n map(() => [] as Float32Array[]),\n );\n\n // trigger 2: Continuous VAD > THRESHOLD\n const continuousVadTrigger$ = this._event.speech.pipe(\n // intercept the raw stream to constantly update the threshold window\n tap((s) => {\n // Only buffer if we aren't already formally recording\n if (!this._isRecording && this._isInitialized) {\n speechSlidingWindow.push(s.sample);\n // Keep the array length strictly to our configured window size\n if (speechSlidingWindow.length > MAX_SLIDING_WINDOW_CHUNKS) speechSlidingWindow.shift();\n }\n }),\n\n // check VAD score\n map((s) => s.vadScore > VAD_THRESHOLD),\n filter(() => !this._isRecording && this._isInitialized),\n distinctUntilChanged(),\n\n switchMap((isVoiceActive) => {\n if (!isVoiceActive) return EMPTY; // Cancel if voice stops before threshold\n\n this._speechRecognition.reset();\n\n // PRE-FILL the actual recording buffer with our duration (ex: 300ms) look back window!\n // clone so future sliding window updates don't mutate the captured audio.\n const bufferedChunks: Float32Array[] = [...speechSlidingWindow];\n\n // continue accumulating new chunks silently while we wait for the timer\n const buffer$ = this._event.speech.pipe(\n tap((s) => bufferedChunks.push(s.sample)),\n ignoreElements(),\n );\n\n // timer that emits the fully accumulated chunks (pre-roll)\n const timer$ = timer(PRE_ROLL_MS).pipe(map(() => bufferedChunks));\n\n return merge(buffer$, timer$).pipe(take(1));\n }),\n );\n\n // combine triggers\n const startRecordingTrigger$ = merge(\n wakewordTrigger$.pipe(\n tap(() => {\n if (!this._isInitialized) this._isInitialized = true; // initialized\n }),\n ),\n continuousVadTrigger$,\n ).pipe(\n throttleTime(this._config.throttleTime), // Prevent double-firing if wakeword and voice overlap\n );\n\n // recording pipeline\n this._subs.sink = startRecordingTrigger$\n .pipe(\n tap(() => {\n this._isRecording = true;\n this._speechRecognition.reset();\n }),\n\n switchMap((bufferedChunks) => {\n // Initialize our command chunks with anything captured during the 1s VAD wait\n const commandChunks: Float32Array[] = [...bufferedChunks];\n\n const speech$ = this._event.speech.pipe(\n tap((speech) => {\n commandChunks.push(speech.sample);\n\n if (this._isRecording)\n // emit recording events\n this._event.recording.next({\n chunk: this._flatten(commandChunks),\n transcript: this._speechRecognition.transcript,\n });\n }),\n share(),\n );\n\n const silence$ = speech$.pipe(\n map((s) => s.vadScore < VAD_THRESHOLD),\n distinctUntilChanged(), // only emit when silence state changes\n );\n\n // silence timeout logic\n const normalSilenceTimeout$ = silence$.pipe(\n switchMap((isSilent) => {\n if (!isSilent) {\n return EMPTY; // if voice cancel the timer\n }\n\n // silence started, start timer\n return timer(SILENCE_DURATION).pipe(\n takeUntil(\n silence$.pipe(filter((silent) => !silent)), // cancel if voice resumes\n ),\n );\n }),\n );\n\n // force end recording\n const forceComplete$ = speech$.pipe(filter(() => this._endCurrentRecording));\n\n return merge(normalSilenceTimeout$, forceComplete$).pipe(\n take(1),\n map(() => this._flatten(commandChunks)),\n );\n }),\n )\n .subscribe({\n next: (chunk) => {\n const interimResponse =\n this._config.mode === 'DEFAULT' || this._config.mode === 'PTT' ? false : true;\n\n this._event.silence.next({\n chunk,\n transcript: this._speechRecognition.transcript,\n interimResponse,\n }); // emit silence event\n\n // Default case\n if (this._config.mode === 'DEFAULT' || this._config.mode === 'PTT') {\n this._isInitialized = false;\n }\n\n this._endCurrentRecording = false; // reset flag after recording ends\n\n this._isRecording = false;\n },\n error: (err) => {\n this._event.exception.next(err);\n },\n });\n }\n\n /**\n * Helper to flatten array of buffers into a single Float32Array\n */\n private _flatten(chunks: Float32Array[]): Float32Array {\n const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n const result = new Float32Array(totalLength);\n let offset = 0;\n\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n return result;\n }\n\n /**\n * Wakeword stream\n * @returns\n */\n private _getWakeWordStream() {\n return this._event.speech.pipe(\n scan(\n (state: VadState, speech: SpeechEvent): VadState => {\n const { hasVoiceActivity, sample } = speech;\n let { isActive, hangoverCounter, buffer } = state;\n\n if (hasVoiceActivity) {\n // If we were idle, start a fresh buffer\n if (!isActive) {\n buffer = [];\n isActive = true;\n }\n // Reset silence tracker to 0 because we hear a voice\n hangoverCounter = 0;\n } else if (isActive) {\n // Increment silence tracker\n hangoverCounter++;\n\n // If we've reached the limit of allowed silent frames\n if (hangoverCounter >= VAD_HANGOVER_FRAMES) {\n isActive = false;\n }\n }\n\n // Add sample if we are in an active speech window\n if (isActive) {\n buffer = [...buffer, sample];\n }\n\n return { buffer, hangoverCounter, isActive };\n },\n { buffer: [], hangoverCounter: -1, isActive: false },\n ),\n\n // Only share the state when it is actively collecting\n share(),\n );\n }\n}\n","import { inject, Injectable, OnDestroy } from '@angular/core';\nimport { throttleTime } from 'rxjs';\nimport { SubSink } from 'subsink';\nimport { OrbComponentService } from '../../../components/orb-component/orb-component-service';\nimport { ConfigService } from '../../config/config-service';\nimport { EventService } from '../../event/event-service';\nimport { PlatformService } from '../../platform/platform-service';\nimport { AudioService } from '../audio-service';\nimport { MicrophoneService } from '../microphone-service/microphone-service';\n\n@Injectable()\nexport class SpeakerService implements OnDestroy {\n /**\n * Dependencies\n */\n private readonly _config = inject(ConfigService);\n private readonly _platform = inject(PlatformService);\n private readonly _event = inject(EventService);\n private readonly _mic = inject(MicrophoneService);\n private readonly _orb = inject(OrbComponentService);\n private readonly _audio = inject(AudioService);\n\n private readonly _subs = new SubSink();\n\n private _upSound!: HTMLAudioElement;\n private _downSound!: HTMLAudioElement;\n\n private _nextPlayTime = 0;\n private _sources: AudioBufferSourceNode[] = [];\n\n constructor() {\n if (this._config.audio.sound?.enable === false) return;\n\n // Audio is only available in browser context\n if (this._platform.isBrowser) {\n this._upSound = new Audio(\n this._config.audio.sound?.up ?? `${this._config.basePath}/sounds/up.mp3`,\n );\n this._downSound = new Audio(\n this._config.audio.sound?.down ?? `${this._config.basePath}/sounds/down.mp3`,\n );\n\n this._upSound.preload = this._downSound.preload = 'auto';\n\n this._loadSubscriptions();\n }\n }\n\n ngOnDestroy(): void {\n this._subs.unsubscribe();\n }\n\n /**\n * Play audio chunk\n *\n * @param buffer audio buffer\n * @param sampleRate sample rate to play in\n */\n playChunk(buffer: ArrayBuffer, sampleRate: number) {\n // Calculate how many full 32-bit floats fit in this buffer\n const float32Count = Math.floor(buffer.byteLength / 4);\n\n // Convert raw bytes back to 32-bit floats\n const float32Array = new Float32Array(buffer, 0, float32Count);\n\n // Create an empty audio buffer mapping\n const audioBuffer = this._mic.audioContext!.createBuffer(1, float32Array.length, sampleRate);\n audioBuffer.copyToChannel(float32Array, 0);\n\n this.playAudioBuffer(audioBuffer);\n }\n\n /**\n * Play audio buffer\n *\n * @param audioBuffer\n */\n playAudioBuffer(audioBuffer: AudioBuffer) {\n // if recording, clear the queue\n if (this._audio.isRecording) {\n this._clearQueue();\n return;\n }\n\n // Create a source node to play the buffer\n const source = this._mic.audioContext!.createBufferSource();\n source.buffer = audioBuffer;\n\n source.connect(this._mic.analyzer!);\n source.connect(this._mic.audioContext!.destination);\n\n // Schedule the chunk to play exactly when the previous chunk finishes\n const currentTime = this._mic.audioContext!.currentTime;\n if (this._nextPlayTime < currentTime) {\n this._nextPlayTime = currentTime; // Reset if the queue has emptied\n }\n\n source.start(this._nextPlayTime);\n\n this._sources.push(source); // keep instance of source to stop later\n\n this._nextPlayTime += audioBuffer.duration;\n\n if (!this._config.orb?.mode || this._config.orb?.mode === 'auto')\n this._orb.setState('speaking'); // speaking\n }\n\n /**\n * Play on sound\n */\n playUp() {\n if (this._config.audio.sound?.enable === false) return;\n\n this._upSound.play();\n }\n\n /**\n * Play off sound\n */\n playDown() {\n if (this._config.audio.sound?.enable === false) return;\n\n this._downSound.play();\n }\n\n /**\n * Clear playback queue\n */\n private _clearQueue() {\n this._sources.forEach((s) => s.stop());\n this._sources = [];\n this._nextPlayTime = 0;\n }\n\n /**\n * Load subscriptions\n */\n private _loadSubscriptions() {\n this._subs.sink = this._event.wakeword\n .pipe(throttleTime(this._config.throttleTime))\n .subscribe(() => {\n this.playUp();\n });\n\n // If default, on silence, play down\n this._subs.sink = this._event.silence.subscribe((ev) => {\n if (!ev.interimResponse) this.playDown();\n });\n\n // If recording event\n this._subs.sink = this._event.recording.subscribe(() => {\n this._clearQueue();\n });\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { OrbComponentService } from '../../components/orb-component/orb-component-service';\nimport { AudioService } from '../audio/audio-service';\nimport { MicrophoneService } from '../audio/microphone-service/microphone-service';\nimport { SpeakerService } from '../audio/speaker-service/speaker-service';\nimport { SpeechRecognitionService } from '../audio/speech-recognition/speech-recognition-service';\nimport { VadService } from '../audio/vad-service/vad-service';\nimport { ConfigService } from '../config/config-service';\nimport { EventService } from '../event/event-service';\nimport { ModelService } from '../model/model-service';\nimport { PipelineService } from '../pipeline/pipeline-service';\nimport { PlatformService } from '../platform/platform-service';\n\n@Injectable()\nexport class BridgeService {\n readonly mic = inject(MicrophoneService);\n readonly speaker = inject(SpeakerService);\n readonly speechRecognition = inject(SpeechRecognitionService);\n readonly vad = inject(VadService);\n readonly audio = inject(AudioService);\n readonly config = inject(ConfigService);\n readonly event = inject(EventService);\n readonly model = inject(ModelService);\n readonly pipeline = inject(PipelineService);\n readonly platform = inject(PlatformService);\n readonly orbComponentService = inject(OrbComponentService);\n}\n","/* eslint-disable @typescript-eslint/member-ordering */\n/* eslint-disable @typescript-eslint/prefer-for-of */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n AfterViewInit,\n Component,\n ElementRef,\n HostListener,\n inject,\n NgZone,\n OnDestroy,\n ViewChild,\n} from '@angular/core';\nimport { SubSink } from 'subsink';\nimport * as THREE from 'three';\nimport { AudioService } from '../../services/audio/audio-service';\nimport { MicrophoneService } from '../../services/audio/microphone-service/microphone-service';\nimport { ConfigService } from '../../services/config/config-service';\nimport { EventService } from '../../services/event/event-service';\nimport { PlatformService } from '../../services/platform/platform-service';\nimport { OrbComponentService } from './orb-component-service';\n\nexport type AgentState = 'idle' | 'listening' | 'thinking' | 'speaking';\n\n@Component({\n selector: 'app-orb-component',\n template: `\n <div\n #rendererContainer\n role=\"button\"\n tabindex=\"0\"\n class=\"orb-container\"\n [style.width.px]=\"orbSize\"\n [style.height.px]=\"orbSize\"\n (click)=\"toggleRecording()\"\n (keypress)=\"toggleRecording()\"\n ></div>\n `,\n styles: [\n `\n .orb-container {\n display: flex;\n justify-content: center;\n align-items: center;\n overflow: hidden;\n cursor: pointer;\n }\n canvas {\n display: block;\n outline: none;\n }\n `,\n ],\n})\nexport class OrbComponent implements AfterViewInit, OnDestroy {\n @ViewChild('rendererContainer', { static: true })\n private _rendererContainer!: ElementRef<HTMLDivElement>;\n\n private readonly _config = inject(ConfigService);\n private readonly _platform = inject(PlatformService);\n private readonly _audio = inject(AudioService);\n private readonly _mic = inject(MicrophoneService);\n private readonly _event = inject(EventService);\n private readonly _ngZone = inject(NgZone);\n private readonly _service = inject(OrbComponentService);\n private readonly _subs = new SubSink();\n\n // Three.js Core\n private _scene!: THREE.Scene;\n private _camera!: THREE.PerspectiveCamera;\n private _renderer!: THREE.WebGLRenderer;\n private _sphere!: THREE.Points;\n private _material!: THREE.ShaderMaterial;\n private _animationFrameId!: number;\n private _clock = new THREE.Clock();\n private _geometry!: THREE.BufferGeometry;\n\n // Audio Processing\n private dataArray!: Uint8Array<ArrayBuffer>;\n private micVolume = 0;\n\n // State Management\n private currentState: AgentState = 'idle';\n private agentProfiles = {\n idle: {\n spike: 0.05,\n noiseScale: 1.0,\n speed: 0.2,\n twist: 0.0,\n pulse: 0.0,\n base: '#001133',\n peak: '#00aaff',\n },\n listening: {\n spike: 0.2,\n noiseScale: 2.5,\n speed: 1.0,\n twist: 0.0,\n pulse: 0.0,\n base: '#002211',\n peak: '#00ff88',\n },\n thinking: {\n spike: 0.2,\n noiseScale: 1.5,\n speed: 1.5,\n twist: 1.5,\n pulse: 0.0,\n base: '#220033',\n peak: '#ff00ff',\n },\n speaking: {\n spike: 0.1,\n noiseScale: 1.0,\n speed: 0.5,\n twist: 0.0,\n pulse: 0.1,\n base: '#331100',\n peak: '#ff8800',\n },\n };\n\n private targets = { ...this.agentProfiles.idle };\n private targetColorBase = new THREE.Color(this.targets.base);\n private targetColorPeak = new THREE.Color(this.targets.peak);\n\n get orbSize(): number {\n return this._config.orb?.size ?? 400;\n }\n\n ngAfterViewInit(): void {\n if (this._platform.isServer) return;\n\n this.dataArray = new Uint8Array(this._mic.analyzer!.frequencyBinCount);\n this._loadSubscribers();\n\n // MUST run outside Angular to prevent CD loops\n this._ngZone.runOutsideAngular(() => {\n this._initThreeJs();\n this._animate();\n });\n }\n\n ngOnDestroy(): void {\n if (this._platform.isServer) return;\n\n cancelAnimationFrame(this._animationFrameId);\n\n this._subs.unsubscribe();\n\n if (this._renderer) {\n this._renderer.dispose();\n this._renderer.forceContextLoss();\n // Remove canvas from DOM to ensure cleanup\n const domElement = this._renderer.domElement;\n if (domElement && domElement.parentNode) {\n domElement.parentNode.removeChild(domElement);\n }\n }\n\n if (this._geometry) this._geometry.dispose();\n if (this._material) this._material.dispose();\n\n // Allow garbage collection\n (this._scene as any) = null;\n (this._camera as any) = null;\n (this._renderer as any) = null;\n }\n\n /**\n * Space bar press\n */\n @HostListener('window:keydown', ['$event'])\n handleSpacebarPress(event: KeyboardEvent): void {\n if (event.code !== this._config.hotkey) return;\n\n event.preventDefault();\n this.toggleRecording();\n }\n\n /**\n * Toggle recording\n */\n toggleRecording() {\n this._audio.toggleRecording();\n }\n\n /**\n * Set state of orb\n *\n * @param state orb state\n */\n setState(state: AgentState): void {\n const profile = this.agentProfiles[state];\n\n this.currentState = state;\n this.targets = { ...profile };\n this.targetColorBase.set(profile.base);\n this.targetColorPeak.set(profile.peak);\n }\n\n /**\n * Subscriptions\n */\n private _loadSubscribers(): void {\n this._subs.sink = this._event.speech.subscribe((data) => {\n this.micVolume = this._mic.isMuted ? 0 : data.dbNormalized;\n });\n\n // only update orb state if mode is auto\n if (!this._config.orb?.mode || this._config.orb?.mode === 'auto') {\n // after wakeword, set to listening\n this._subs.sink = this._event.wakeword.subscribe(() => {\n this.setState('listening');\n });\n\n // after silence, set thinking or idle\n this._subs.sink = this._event.silence.subscribe((ev) => {\n if (ev.interimResponse) this.setState('thinking');\n else this.setState('idle');\n });\n\n // if recording started\n this._subs.sink = this._event.recording.subscribe(() => {\n this.setState('listening');\n });\n\n // state change using service\n this._subs.sink = this._service.state.subscribe((state) => {\n this.setState(state);\n });\n }\n }\n\n /**\n * Speech volume for animation\n */\n private _getTTSVolume(): number {\n this._mic.analyzer!.getByteFrequencyData(this.dataArray as any);\n let sum = 0;\n for (let i = 0; i < this.dataArray.length; i++) {\n sum += this.dataArray[i];\n }\n return sum / this.dataArray.length / 255.0;\n }\n\n /**\n * Init\n */\n private _initThreeJs(): void {\n const size = this.orbSize;\n\n this._scene = new THREE.Scene();\n this._camera = new THREE.PerspectiveCamera(50, 1, 0.1, 1000);\n this._camera.position.z = 6;\n\n this._renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });\n this._renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));\n this._renderer.setSize(size, size);\n\n this._rendererContainer.nativeElement.appendChild(this._renderer.domElement);\n\n const particlesCount = this._config.orb?.particlesCount ?? 30000;\n this._geometry = new THREE.BufferGeometry();\n const posArray = new Float32Array(particlesCount * 3);\n const randomArray = new Float32Array(particlesCount);\n const radius = this._config.orb?.radius ?? 1.8;\n\n for (let i = 0; i < particlesCount; i++) {\n const phi = Math.acos(-1 + (2 * i) / particlesCount);\n const theta = Math.sqrt(particlesCount * Math.PI) * phi;\n\n posArray[i * 3] = radius * Math.cos(theta) * Math.sin(phi);\n posArray[i * 3 + 1] = radius * Math.sin(theta) * Math.sin(phi);\n posArray[i * 3 + 2] = radius * Math.cos(phi);\n randomArray[i] = Math.random();\n }\n\n this._geometry.setAttribute('position', new THREE.BufferAttribute(posArray, 3));\n this._geometry.setAttribute('aRandom', new THREE.BufferAttribute(randomArray, 1));\n\n this._material = new THREE.ShaderMaterial({\n uniforms: {\n uTime: { value: 0 },\n uSpike: { value: 0.05 },\n uNoiseScale: { value: 1.0 },\n uSpeed: { value: 0.2 },\n uTwist: { value: 0.0 },\n uPulse: { value: 0.0 },\n uColorBase: { value: new THREE.Color('#002244') },\n uColorPeak: { value: new THREE.Color('#00ffff') },\n },\n vertexShader: this._getVertexShader(),\n fragmentShader: this._getFragmentShader(),\n transparent: true,\n blending: THREE.AdditiveBlending,\n depthWrite: false,\n });\n\n this._sphere = new THREE.Points(this._geometry, this._material);\n this._scene.add(this._sphere);\n }\n\n /**\n * Animator\n */\n private _animate = (): void => {\n this._animationFrameId = requestAnimationFrame(this._animate);\n const elapsedTime = this._clock.getElapsedTime();\n\n this._material.uniforms['uTime'].value = elapsedTime;\n\n let dynamicSpike = this.targets.spike;\n let dynamicPulse = this.targets.pulse;\n\n if (this.currentState === 'listening') {\n dynamicSpike += this.micVolume * 1.0;\n } else if (this.currentState === 'speaking') {\n const ttsVolume = this._getTTSVolume();\n dynamicPulse += ttsVolume * 0.5;\n }\n\n const lerpFactor = 0.08;\n this._material.uniforms['uSpike'].value +=\n (dynamicSpike - this._material.uniforms['uSpike'].value) * lerpFactor;\n this._material.uniforms['uPulse'].value +=\n (dynamicPulse - this._material.uniforms['uPulse'].value) * lerpFactor;\n\n this._material.uniforms['uNoiseScale'].value +=\n (this.targets.noiseScale - this._material.uniforms['uNoiseScale'].value) * lerpFactor;\n this._material.uniforms['uSpeed'].value +=\n (this.targets.speed - this._material.uniforms['uSpeed'].value) * lerpFactor;\n this._material.uniforms['uTwist'].value +=\n (this.targets.twist - this._material.uniforms['uTwist'].value) * lerpFactor;\n\n this._material.uniforms['uColorBase'].value.lerp(this.targetColorBase, lerpFactor);\n this._material.uniforms['uColorPeak'].value.lerp(this.targetColorPeak, lerpFactor);\n\n this._sphere.rotation.y = elapsedTime * 0.1;\n this._sphere.rotation.z = elapsedTime * 0.01;\n\n this._renderer.render(this._scene, this._camera);\n };\n\n /**\n * Vertex shader\n */\n private _getVertexShader(): string {\n return `\n uniform float uTime;\n uniform float uSpike; \n uniform float uNoiseScale; \n uniform float uSpeed; \n uniform float uTwist; \n uniform float uPulse; \n \n varying vec3 vColor;\n varying float vDisplacement;\n\n attribute float aRandom;\n\n // Simplex 3D Noise\n vec4 permute(vec4 x){return mod(((x*34.0)+1.0)*x, 289.0);}\n vec4 taylorInvSqrt(vec4 r){return 1.79284291400159 - 0.85373472095314 * r;}\n float snoise(vec3 v){ \n const vec2 C = vec2(1.0/6.0, 1.0/3.0);\n const vec4 D = vec4(0.0, 0.5, 1.0, 2.0);\n vec3 i = floor(v + dot(v, C.yyy) );\n vec3 x0 = v - i + dot(i, C.xxx) ;\n vec3 g = step(x0.yzx, x0.xyz);\n vec3 l = 1.0 - g;\n vec3 i1 = min( g.xyz, l.zxy );\n vec3 i2 = max( g.xyz, l.zxy );\n vec3 x1 = x0 - i1 + 1.0 * C.xxx;\n vec3 x2 = x0 - i2 + 2.0 * C.xxx;\n vec3 x3 = x0 - 1.0 + 3.0 * C.xxx;\n i = mod(i, 289.0 ); \n vec4 p = permute( permute( permute( i.z + vec4(0.0, i1.z, i2.z, 1.0 )) + i.y + vec4(0.0, i1.y, i2.y, 1.0 )) + i.x + vec4(0.0, i1.x, i2.x, 1.0 ));\n float n_ = 1.0/7.0;\n vec3 ns = n_ * D.wyz - D.xzx;\n vec4 j = p - 49.0 * floor(p * ns.z *ns.z);\n vec4 x_ = floor(j * ns.z);\n vec4 y_ = floor(j - 7.0 * x_ );\n vec4 x = x_ *ns.x + ns.yyyy;\n vec4 y = y_ *ns.x + ns.yyyy;\n vec4 h = 1.0 - abs(x) - abs(y);\n vec4 b0 = vec4( x.xy, y.xy );\n vec4 b1 = vec4( x.zw, y.zw );\n vec4 s0 = floor(b0)*2.0 + 1.0;\n vec4 s1 = floor(b1)*2.0 + 1.0;\n vec4 sh = -step(h, vec4(0.0));\n vec4 a0 = b0.xzyw + s0.xzyw*sh.xxyy ;\n vec4 a1 = b1.xzyw + s1.xzyw*sh.zzww ;\n vec3 p0 = vec3(a0.xy,h.x);\n vec3 p1 = vec3(a0.zw,h.y);\n vec3 p2 = vec3(a1.xy,h.z);\n vec3 p3 = vec3(a1.zw,h.w);\n vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3)));\n p0 *= norm.x; p1 *= norm.y; p2 *= norm.z; p3 *= norm.w;\n vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0);\n m = m * m;\n return 42.0 * dot( m*m, vec4( dot(p0,x0), dot(p1,x1), dot(p2,x2), dot(p3,x3) ) );\n }\n\n void main() {\n vec3 pos = position;\n float time = uTime * uSpeed;\n \n float angle = pos.y * uTwist;\n mat2 rot = mat2(cos(angle), -sin(angle), sin(angle), cos(angle));\n pos.xz *= rot;\n\n vec3 normal = normalize(pos);\n float noise = snoise(pos * uNoiseScale + time);\n \n float totalDisplacement = (noise * uSpike) + uPulse;\n pos += normal * totalDisplacement;\n \n vDisplacement = totalDisplacement;\n\n vec4 mvPosition = modelViewMatrix * vec4(pos, 1.0);\n \n gl_PointSize = (15.0 + totalDisplacement * 20.0) * (1.0 / -mvPosition.z);\n gl_PointSize *= (1.0 + sin(uTime * 5.0 + aRandom * 50.0) * 0.2);\n\n gl_Position = projectionMatrix * mvPosition;\n }\n `;\n }\n\n /**\n * Fragment shader\n */\n private _getFragmentShader(): string {\n return `\n varying float vDisplacement;\n uniform vec3 uColorBase; \n uniform vec3 uColorPeak;\n\n void main() {\n float dist = distance(gl_PointCoord, vec2(0.5));\n if (dist > 0.5) discard;\n float alpha = 1.0 - pow(dist * 2.0, 2.0);\n \n float mixValue = smoothstep(-0.2, 0.5, vDisplacement);\n vec3 finalColor = mix(uColorBase, uColorPeak, mixValue);\n\n gl_FragColor = vec4(finalColor, alpha * 0.9);\n }\n `;\n }\n}\n","import { Component, EventEmitter, inject, OnDestroy, OnInit, Output } from '@angular/core';\nimport { throttleTime } from 'rxjs';\nimport { SubSink } from 'subsink';\nimport { OrbComponent } from './components/orb-component/orb-component';\nimport { AudioService } from './services/audio/audio-service';\nimport { BridgeService } from './services/bridge/bridge-service';\nimport { ConfigService } from './services/config/config-service';\nimport { EventService } from './services/event/event-service';\nimport {\n RecordingEvent,\n SilenceEvent,\n SpeechEvent,\n WakeWordEvent,\n} from './services/event/event-service.type';\nimport { PlatformService } from './services/platform/platform-service';\n\n@Component({\n selector: 'wakeywakey',\n imports: [OrbComponent],\n template: '<app-orb-component (orbClick)=\"fireWakeWord()\" />',\n providers: [],\n})\nexport class WakeyWakeyComponent implements OnInit, OnDestroy {\n /**\n * Fires when library loaded. Emits bridge service event\n */\n @Output() ready = new EventEmitter<BridgeService>();\n\n /**\n * Fires when there is an error\n */\n @Output() exception = new EventEmitter<Error>();\n\n /**\n * Fires when speech is detected\n */\n @Output() speech = new EventEmitter<SpeechEvent>();\n\n /**\n * Fires when wake word is detected\n */\n @Output() wakeword = new EventEmitter<WakeWordEvent>();\n\n /**\n * Fires when recording starts (after wake word detection)\n */\n @Output() recording = new EventEmitter<RecordingEvent>();\n\n /**\n * Fires silence is detected\n */\n @Output() silence = new EventEmitter<SilenceEvent>();\n\n /**\n * Dependencies\n */\n private readonly _config = inject(ConfigService);\n\n /**\n * Dependencies\n */\n private readonly _platform = inject(PlatformService);\n private readonly _event = inject(EventService);\n private readonly _audio = inject(AudioService);\n private readonly _bridge = inject(BridgeService);\n\n /**\n * Subscriptions\n */\n private readonly _subs = new SubSink();\n\n ngOnInit(): void {\n // Execute pipeline\n this._execute();\n }\n\n /**\n * Fire face wakeword event\n */\n fireWakeWord() {\n this._event.wakeword.next({\n inferenceScore: 1,\n chunk: [],\n vadScore: 1,\n hasVoiceActivity: false,\n sample: new Float32Array(),\n rms: 0,\n db: 0,\n dbNormalized: 0,\n });\n }\n\n ngOnDestroy(): void {\n this._subs.unsubscribe();\n }\n\n /**\n * Execute\n */\n private async _execute() {\n // Check if browser\n if (this._platform.isServer) return;\n\n // Listen events\n this._listenEvents();\n\n // Init audio\n await this._audio.init();\n }\n\n /**\n * Listen events\n */\n private _listenEvents() {\n // Ready event\n this._subs.sink = this._event.ready.subscribe(() => {\n this.ready.emit(this._bridge);\n });\n\n // Exception event\n this._subs.sink = this._event.exception.subscribe((e) => {\n this.exception.emit(e);\n });\n\n // Speech event\n this._subs.sink = this._event.speech.subscribe((e) => {\n this.speech.emit(e);\n });\n\n // Wake word event\n this._subs.sink = this._event.wakeword\n .pipe(throttleTime(this._config.throttleTime))\n .subscribe((e) => {\n this.wakeword.emit(e);\n });\n\n // Recording event\n this._subs.sink = this._event.recording.subscribe((e) => {\n this.recording.emit(e);\n });\n\n // Silence event\n this._subs.sink = this._event.silence.subscribe((e) => {\n this.silence.emit(e);\n });\n }\n}\n","import { inject, provideAppInitializer } from '@angular/core';\nimport { env, InferenceSession } from 'onnxruntime-web';\nimport { OrbComponentService } from './lib/components/orb-component/orb-component-service';\nimport { AudioService } from './lib/services/audio/audio-service';\nimport { MicrophoneService } from './lib/services/audio/microphone-service/microphone-service';\nimport { SpeakerService } from './lib/services/audio/speaker-service/speaker-service';\nimport { SpeechRecognitionService } from './lib/services/audio/speech-recognition/speech-recognition-service';\nimport { VadService } from './lib/services/audio/vad-service/vad-service';\nimport { BridgeService } from './lib/services/bridge/bridge-service';\nimport { ConfigService } from './lib/services/config/config-service';\nimport { CONFIG, Config } from './lib/services/config/config-service.type';\nimport { EventService } from './lib/services/event/event-service';\nimport { ModelService } from './lib/services/model/model-service';\nimport { PipelineService } from './lib/services/pipeline/pipeline-service';\nimport { PlatformService } from './lib/services/platform/platform-service';\n\n/**\n * Provide wakey wakey configuration\n *\n * @param config Wakey Wakey configuration\n * @returns\n */\nexport function provideWakeyWakey(config: Config) {\n return [\n {\n provide: CONFIG,\n useValue: config,\n },\n ConfigService,\n MicrophoneService,\n SpeakerService,\n VadService,\n AudioService,\n PlatformService,\n EventService,\n PipelineService,\n SpeechRecognitionService,\n ModelService,\n BridgeService,\n OrbComponentService,\n provideAppInitializer(async () => {\n const _config = inject(ConfigService);\n const _model = inject(ModelService);\n const _platform = inject(PlatformService);\n const _mic = inject(MicrophoneService);\n\n if (_platform.isServer) return;\n\n // Set wasm path\n env.wasm.wasmPaths = _config.onnx.runtimePath ?? `${_config.basePath}/wasm/`;\n\n const modelPath: string[] = [\n _config.onnx.model.melspectrogram ?? `${_config.basePath}/models/melspectrogram.onnx`,\n _config.onnx.model.embedding_model ?? `${_config.basePath}/models/embedding_model.onnx`,\n _config.onnx.model.silero_vad ?? `${_config.basePath}/models/silero_vad_v4.onnx`,\n _config.onnx.model.wakeword,\n ];\n\n // Create sessions\n const sessions = await Promise.all([\n ...Object.values(modelPath).map((path) =>\n InferenceSession.create(path, { executionProviders: ['wasm'] }),\n ),\n _mic.init(),\n ]);\n\n // set sessions\n _model.session = {\n melspectrogram: sessions[0] as InferenceSession,\n embedding_model: sessions[1] as InferenceSession,\n silero_vad: sessions[2] as InferenceSession,\n wakeword: sessions[3] as InferenceSession,\n };\n }),\n ];\n}\n","/*\n * Public API Surface of wakeywakey\n */\nexport * from './lib/services';\nexport * from './lib/wakeywakey-component';\nexport * from './provider';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"prabhjeet.me-wakeywakey.mjs","sources":["../../../projects/wakeywakey/src/lib/services/audio/microphone-service/microphone-service.constant.ts","../../../projects/wakeywakey/src/lib/services/audio/audio-service.util.ts","../../../projects/wakeywakey/src/lib/components/orb-component/orb-component-service.ts","../../../projects/wakeywakey/src/lib/wakeywakey-component.const.ts","../../../projects/wakeywakey/src/lib/services/config/config-service.type.ts","../../../projects/wakeywakey/src/lib/services/config/config-service.ts","../../../projects/wakeywakey/src/lib/services/event/event-service.ts","../../../projects/wakeywakey/src/lib/services/model/model-service.const.ts","../../../projects/wakeywakey/src/lib/services/model/model-service.type.ts","../../../projects/wakeywakey/src/lib/services/model/model-service.ts","../../../projects/wakeywakey/src/lib/services/pipeline/pipeline-service.ts","../../../projects/wakeywakey/src/lib/services/audio/audio-service.const.ts","../../../projects/wakeywakey/src/lib/services/audio/microphone-service/microphone-service.ts","../../../projects/wakeywakey/src/lib/services/platform/platform-service.ts","../../../projects/wakeywakey/src/lib/services/audio/speech-recognition/speech-recognition-service.ts","../../../projects/wakeywakey/src/lib/services/audio/vad-service/vad-service.ts","../../../projects/wakeywakey/src/lib/services/audio/vad-service/vad-service.const.ts","../../../projects/wakeywakey/src/lib/services/audio/audio-service.ts","../../../projects/wakeywakey/src/lib/services/audio/speaker-service/speaker-service.ts","../../../projects/wakeywakey/src/lib/services/bridge/bridge-service.ts","../../../projects/wakeywakey/src/lib/components/orb-component/orb-component.ts","../../../projects/wakeywakey/src/lib/wakeywakey-component.ts","../../../projects/wakeywakey/src/provider.ts","../../../projects/wakeywakey/src/public-api.ts","../../../projects/wakeywakey/src/prabhjeet.me-wakeywakey.ts"],"sourcesContent":["/**\n * Audio sample rate\n */\nexport const SAMPLE_RATE = 16000;\n\n/**\n * Audio worklet name\n */\nexport const MICROPHONE_PROCESSOR_NAME = 'microphone-buffer-processor';\n\n/**\n * Audio worklet processor\n */\nexport const MICROPHONE_PROCESSOR = `\n class MicrophoneBufferProcessor extends AudioWorkletProcessor {\n // collect 1280 samples before sending them to the main thread\n // Web Audio processes 128 frames per call\n // batching 10 small chunks into 1 bigger chunk\n frameBlockSize = 128 * 10; // total samples per emitted chunk\n\n // for storing small chunks\n accumulatedSamples = new Float32Array(this.frameBlockSize);\n\n // cursor\n writeIndex = 0;\n\n constructor() {\n super();\n }\n\n dbNormalized(db) {\n const minDb = -60;\n const maxDb = 0;\n\n const clamped = Math.max(minDb, Math.min(db, maxDb));\n return (clamped - minDb) / (maxDb - minDb);\n }\n\n // runs every 128 frames. ~ every 2.67 ms (at 48kHz), ~ 8ms (at 16KHz)\n process(inputList) {\n const firstInput = inputList[0];\n\n // no input connected\n if (!firstInput || firstInput.length === 0) {\n return true;\n }\n\n // raw waveform values\n const firstChannelSamples = firstInput[0]; // Float32Array(128)\n\n let sum = 0;\n\n // 0 -> 128\n for (let i = 0; i < firstChannelSamples.length; i++) {\n // dump each sample in accumulated sample array\n this.accumulatedSamples[this.writeIndex++] = firstChannelSamples[i];\n sum += firstChannelSamples[i] * firstChannelSamples[i];\n }\n\n // once buffer is full, break\n if (this.writeIndex === this.frameBlockSize) {\n const rms = Math.sqrt(sum / firstChannelSamples.length);\n const db = 20 * Math.log10(rms ?? 0.00001);\n this.writeIndex = 0;\n\n // send to main thread\n this.port.postMessage({\n sample: this.accumulatedSamples.slice(),\n rms,\n db,\n dbNormalized: this.dbNormalized(db),\n });\n }\n\n return true;\n }\n}\n\nregisterProcessor(\"${MICROPHONE_PROCESSOR_NAME}\", MicrophoneBufferProcessor);\n `;\n","import { SAMPLE_RATE } from './microphone-service/microphone-service.constant';\n\n/**\n * Audio utility\n */\nexport class AudioUtil {\n /**\n * Create wav blob url from audio chunk\n *\n * @param chunks Audio chunk\n * @param sampleRate Sample rate\n * @returns\n */\n static createWavBlob(chunks: Float32Array[], sampleRate = SAMPLE_RATE) {\n const totalLength = chunks.reduce((len, chunk) => len + chunk.length, 0);\n if (!totalLength) return null;\n\n // Merge chunks\n const combined = new Float32Array(totalLength);\n let offset = 0;\n for (const chunk of chunks) {\n combined.set(chunk, offset);\n offset += chunk.length;\n }\n\n // Convert to 16-bit PCM\n const pcmData = new Int16Array(totalLength);\n for (let i = 0; i < totalLength; i++) {\n const s = Math.max(-1, Math.min(1, combined[i]));\n pcmData[i] = s < 0 ? s * 0x8000 : s * 0x7fff;\n }\n\n const wavHeader = new ArrayBuffer(44);\n const view = new DataView(wavHeader);\n\n const channels = 1;\n const bitsPerSample = 16;\n const byteRate = sampleRate * channels * (bitsPerSample / 8);\n const blockAlign = channels * (bitsPerSample / 8);\n\n const writeString = (offset: number, str: string) => {\n for (let i = 0; i < str.length; i++) {\n view.setUint8(offset + i, str.charCodeAt(i));\n }\n };\n\n writeString(0, 'RIFF');\n view.setUint32(4, 36 + pcmData.byteLength, true);\n writeString(8, 'WAVE');\n writeString(12, 'fmt ');\n view.setUint32(16, 16, true);\n view.setUint16(20, 1, true); // PCM\n view.setUint16(22, channels, true);\n view.setUint32(24, sampleRate, true);\n view.setUint32(28, byteRate, true);\n view.setUint16(32, blockAlign, true);\n view.setUint16(34, bitsPerSample, true);\n writeString(36, 'data');\n view.setUint32(40, pcmData.byteLength, true);\n\n const wavBlob = new Blob([wavHeader, pcmData], { type: 'audio/wav' });\n return URL.createObjectURL(wavBlob);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { AgentState } from './orb-component.type';\n\n@Injectable()\nexport class OrbComponentService {\n readonly state = new Subject<AgentState>();\n\n /**\n * Set state of orb\n */\n setState(state: AgentState) {\n this.state.next(state);\n }\n}\n","export const DEFAULT_THROTTLE_TIME = 1000;\n","import { InjectionToken } from '@angular/core';\nimport { OrbConfig } from '../../components/orb-component/orb-component.type';\nimport { AudioConfig } from '../audio/audio-service.type';\nimport { OnnxConfig } from '../model/model-service.type';\n\n/**\n * Wakey wakey configuration\n */\nexport interface Config {\n /**\n * Audio config\n */\n audio: AudioConfig;\n\n /**\n * Onnx config\n */\n onnx: OnnxConfig;\n\n /**\n * Orb config\n */\n orb?: OrbConfig;\n\n /**\n * In sliding window, there is a possibility of detecting wakeword mode than once.\n * This allows a cool down time before processing subsequent detections\n *\n * Default: 1000 (1 seconds)\n */\n throttleTime?: number;\n\n /**\n * DEFAULT | PTT: [WAKEWORD] -> Start Recording -> Silence (Spoken chunk & transcript) -> Done -> [WAKEWORD] .....\n * CHAT: [WAKEWORD] -> Start Recording -> Silence -> [Speaking] -> Start Recording -> Silence .....\n */\n mode?: 'DEFAULT' | 'VOICE_CHAT' | 'PTT';\n\n /**\n * Base asset path. This path will be used to access required resources\n *\n * Default: /wakeywakey\n */\n basePath?: string;\n\n /**\n * Key to use to activate listening (instead of wakeword)\n *\n * 'code' property of KeyboardEvent\n */\n hotkey?: string;\n}\n\n/**\n * Wakey wakey config token\n */\nexport const CONFIG = new InjectionToken<Config>('WAKEYWAKEY_CONFIG');\n","import { inject, Injectable } from '@angular/core';\nimport { DEFAULT_THROTTLE_TIME } from '../../wakeywakey-component.const';\nimport { Config, CONFIG } from './config-service.type';\n\n@Injectable()\nexport class ConfigService {\n private readonly _config = inject<Config>(CONFIG);\n\n /**\n * Audio config\n */\n get audio() {\n return this._config.audio;\n }\n\n /**\n * Onnx config\n */\n get onnx() {\n return this._config.onnx;\n }\n\n /**\n * Orb config\n */\n get orb() {\n return this._config.orb;\n }\n\n /**\n * Throttle time\n */\n get throttleTime() {\n return this._config.throttleTime ?? DEFAULT_THROTTLE_TIME;\n }\n\n /**\n * Mode\n */\n get mode() {\n return this._config.mode;\n }\n\n /**\n * Base path of assets\n */\n get basePath() {\n return this._config.basePath ?? '/wakeywakey';\n }\n\n /**\n * Hotkey\n */\n get hotkey() {\n return this._config.hotkey ?? 'Space';\n }\n}\n","import { Injectable } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { RecordingEvent, SilenceEvent, SpeechEvent, WakeWordEvent } from './event-service.type';\n\n@Injectable()\nexport class EventService {\n /**\n * Fires when library loaded\n */\n readonly ready = new Subject<void>();\n\n /**\n * Fires when there is a message to log\n */\n readonly log = new Subject<string>();\n\n /**\n * Fires when there is an error\n */\n readonly exception = new Subject<Error>();\n\n /**\n * Fires when speech is detected\n */\n readonly speech = new Subject<SpeechEvent>();\n\n /**\n * Fires when wake word is detected\n */\n readonly wakeword = new Subject<WakeWordEvent>();\n\n /**\n * Fires when recording starts (after wake word detection)\n */\n readonly recording = new Subject<RecordingEvent>();\n\n /**\n * Fires silence is detected\n */\n readonly silence = new Subject<SilenceEvent>();\n}\n","export const DEFAULT_INFERENCE_SCORE = 0.5;\n","export const VAD_HANGOVER_FRAMES = 12;\n\nexport interface OnnxConfig {\n model: {\n /**\n * Mel Spectrogram model (.onnx)\n *\n * Default: [basePath]/models/melspectrogram.onnx\n */\n melspectrogram?: string;\n\n /**\n * Embedding model (.onnx)\n *\n * Default: [basePath]/models/embedding_model.onnx\n */\n embedding_model?: string;\n\n /**\n * Silero VAD (.onnx)\n *\n * Default: [basePath]/models/silero_vad_v4.onnx\n */\n silero_vad?: string;\n\n /**\n * Wake word model (.onnx)\n */\n wakeword: string;\n };\n\n /**\n * String representation of wakeword\n *\n * Ex 1: ['hey', 'jarvis']\n * Ex 2: ['alexa']\n */\n wakeword?: string[];\n\n /**\n * Path that contains onnx wasm runtime files\n *\n * Default: [basePath]/wasm\n */\n runtimePath?: string;\n\n /**\n * Wake word inference threshold\n *\n * Default: 0.5\n */\n wakewordInferenceThreshold?: number;\n}\n\nexport type InferenceModels = keyof OnnxConfig['model'];\n\nexport interface VadState {\n buffer: Float32Array[];\n hangoverCounter: number;\n isActive: boolean;\n emitFinal?: Float32Array[]; // Used to pass the completed chunk forward\n}\n","import { Injectable } from '@angular/core';\nimport { InferenceSession } from 'onnxruntime-web';\nimport { InferenceModels } from './model-service.type';\n\n@Injectable()\nexport class ModelService {\n /**\n * Inference session\n */\n private _inferenceSession: Record<InferenceModels, InferenceSession | undefined> = {\n melspectrogram: undefined,\n embedding_model: undefined,\n silero_vad: undefined,\n wakeword: undefined,\n };\n\n /**\n * Get melspectrogram inference session\n */\n get melSpectrogram() {\n return this._inferenceSession['melspectrogram']!;\n }\n\n /**\n * Get embedding inference session\n */\n get embedding() {\n return this._inferenceSession['embedding_model']!;\n }\n\n /**\n * Get Silero VAD inference session\n */\n get sileroVAD() {\n return this._inferenceSession['silero_vad']!;\n }\n\n /**\n * Get wakeword inference session\n */\n get wakeword() {\n return this._inferenceSession['wakeword']!;\n }\n\n /**\n * Set session instance\n */\n set session(sessions: Record<InferenceModels, InferenceSession | undefined>) {\n this._inferenceSession = sessions;\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { Tensor } from 'onnxruntime-web';\nimport { SpeechEvent } from '../event/event-service.type';\nimport { ModelService } from '../model/model-service';\n\n@Injectable()\nexport class PipelineService {\n /**\n * Dependencies\n */\n private readonly _model = inject(ModelService);\n\n // Configuration Constants\n private readonly MEL_WINDOW_SIZE = 76; // Number of mel frames needed for one embedding\n private readonly MEL_HOP_SIZE = 8; // How many frames to skip (the slide) after inference\n private readonly EMBEDDING_COUNT = 16; // Number of embeddings kept in memory (temporal context)\n private readonly FEATURE_DIM = 96; // Size of each embedding vector\n private readonly MEL_BINS = 32; // Number of frequency bins per mel frame\n\n /**\n * Historical buffer of embeddings representing the last ~1-2 seconds of audio context.\n * Initialized with empty (zero) vectors.\n */\n private readonly _embeddingQueue = Array.from({ length: this.EMBEDDING_COUNT }, () =>\n new Float32Array(this.FEATURE_DIM).fill(0),\n );\n\n /**\n * Buffer of calculated Mel Spectrogram frames waiting to be processed.\n */\n private readonly _melFrameQueue: Float32Array[] = [];\n\n /**\n * Main entry point: Processes a new chunk of audio and returns a detection score.\n */\n async run(speech: SpeechEvent): Promise<number> {\n // 1. Convert raw PCM audio into Mel Spectrogram frames and add to queue\n await this._generateMelSpectrogram(speech.sample);\n\n let latestScore = 0;\n\n // 2. Process the queue using a sliding window approach\n // While we have enough frames to form a full input window (76 frames)...\n while (this._melFrameQueue.length >= this.MEL_WINDOW_SIZE) {\n // Extract a single feature vector (embedding) from the current window\n const combinedEmbeddings = await this._processWindowToEmbeddings();\n\n // Classify the sequence of embeddings to see if the wake-word is present\n latestScore = await this._getWakeWordScore(combinedEmbeddings);\n\n // Slide the window: Remove the oldest 8 frames to make room for new audio\n this._melFrameQueue.splice(0, this.MEL_HOP_SIZE);\n }\n\n return latestScore;\n }\n\n /**\n * STAGE 1: Converts raw audio samples into Mel Frequency bins.\n */\n private async _generateMelSpectrogram(samples: Float32Array) {\n const session = this._model.melSpectrogram;\n\n // Wrap raw audio in an ONNX Tensor [Batch: 1, Samples: N]\n const inputTensor = new Tensor('float32', samples, [1, samples.length]);\n\n // Run the Mel-Spectrogram model\n const output = await session.run({ [session.inputNames[0]]: inputTensor });\n const rawMelData = output[session.outputNames[0]].data as Float32Array;\n\n /**\n * Post-processing & Normalization:\n * The model output is scaled to fit the expected input range of the embedding model.\n * Logic: (value / 10) + 2.0\n */\n const normalizedMel = rawMelData.map((val) => val / 10.0 + 2.0);\n\n // Slice the flat output array into individual frames of 32 bins and queue them\n // Each inference usually produces 5 frames for the given 1280 audio samples\n for (let i = 0; i < 5; i++) {\n const start = i * this.MEL_BINS;\n const end = start + this.MEL_BINS;\n this._melFrameQueue.push(normalizedMel.subarray(start, end));\n }\n }\n\n /**\n * STAGE 2: Extracts features (embeddings) from a window of Mel frames.\n */\n private async _processWindowToEmbeddings(): Promise<Float32Array> {\n const session = this._model.embedding!;\n\n // Take the first 76 frames from our queue\n const windowFrames = this._melFrameQueue.slice(0, this.MEL_WINDOW_SIZE);\n\n // Flatten the frames into a single continuous array for the Tensor\n const flattenedInput = new Float32Array(this.MEL_WINDOW_SIZE * this.MEL_BINS);\n windowFrames.forEach((frame, i) => {\n flattenedInput.set(frame, i * this.MEL_BINS);\n });\n\n // Run the Embedding model [1, 76, 32, 1]\n const inputTensor = new Tensor('float32', flattenedInput, [1, 76, 32, 1]);\n const output = await session.run({ [session.inputNames[0]]: inputTensor });\n const newEmbedding = output[session.outputNames[0]].data as Float32Array;\n\n // Update the rolling embedding queue (First-In, First-Out)\n this._embeddingQueue.shift();\n this._embeddingQueue.push(new Float32Array(newEmbedding));\n\n // Flatten the last 16 embeddings into one large vector for the final classifier\n const combinedBuffer = new Float32Array(this.EMBEDDING_COUNT * this.FEATURE_DIM);\n this._embeddingQueue.forEach((emb, i) => {\n combinedBuffer.set(emb, i * this.FEATURE_DIM);\n });\n\n return combinedBuffer;\n }\n\n /**\n * STAGE 3: Final classification score based on temporal embedding sequence.\n */\n private async _getWakeWordScore(embeddings: Float32Array): Promise<number> {\n const session = this._model.wakeword;\n\n // Shape: [Batch: 1, Sequence: 16, Features: 96]\n const inputTensor = new Tensor('float32', embeddings, [\n 1,\n this.EMBEDDING_COUNT,\n this.FEATURE_DIM,\n ]);\n\n const results = await session.run({ [session.inputNames[0]]: inputTensor });\n\n // Extract the scalar probability score from the output tensor\n return results[session.outputNames[0]].data[0] as number;\n }\n}\n","export const DEFAULT_SILENCE_DURATION = 1000;\nexport const DEFAULT_SPEECH_THRESHOLD_TIME = 300;\n","import { inject, Injectable, OnDestroy } from '@angular/core';\nimport { loadRnnoise, RnnoiseWorkletNode } from '@sapphi-red/web-noise-suppressor';\nimport { Subject } from 'rxjs';\nimport { ConfigService } from '../../config/config-service';\nimport { EventService } from '../../event/event-service';\nimport {\n MICROPHONE_PROCESSOR,\n MICROPHONE_PROCESSOR_NAME,\n SAMPLE_RATE,\n} from './microphone-service.constant';\nimport { MicrophoneProcessorData } from './microphone-service.type';\n\n@Injectable()\nexport class MicrophoneService implements OnDestroy {\n /**\n * Dependencies\n */\n private readonly _event = inject(EventService);\n private readonly _config = inject(ConfigService);\n\n /**\n * Audio data subject\n */\n private readonly _data = new Subject<MicrophoneProcessorData>();\n\n /**\n * List of available microphones\n */\n private _microphones: MediaDeviceInfo[] = [];\n\n /**\n * Media steam\n */\n private _stream!: MediaStream;\n\n /**\n * Media steam source\n */\n private _source?: MediaStreamAudioSourceNode;\n\n /**\n * Audio context\n */\n private _audioContext?: AudioContext;\n\n /**\n * Is muted\n */\n private _isMuted = false;\n\n /**\n * Gain node\n */\n private _gainNode?: GainNode | undefined;\n\n private _analyser?: AnalyserNode;\n\n /**\n * List of available microphones\n */\n get microphones() {\n return this._microphones;\n }\n\n /**\n * Microphone data\n */\n get data() {\n return this._data;\n }\n\n /**\n * Audio context\n */\n get audioContext() {\n return this._audioContext;\n }\n\n /**\n * Analyzer node\n */\n get analyzer() {\n return this._analyser;\n }\n\n /**\n * Media steam source node\n */\n get sourceNode() {\n return this._source;\n }\n\n /**\n * Muted state\n */\n get isMuted() {\n return this._isMuted;\n }\n\n /**\n * Set gain\n */\n set gain(value: number) {\n if (this._gainNode) this._gainNode.gain.value = value;\n }\n\n /**\n * Set muted state\n */\n set isMuted(set: boolean) {\n this._isMuted = set;\n }\n\n /**\n * Set input source\n */\n set source(deviceId: string) {\n this.init(deviceId);\n }\n\n ngOnDestroy(): void {\n // close audio context\n this._audioContext?.close();\n this._source?.disconnect();\n this._analyser?.disconnect();\n this._stream?.getTracks().forEach((track) => {\n track.stop();\n });\n }\n\n /**\n * Initialize\n *\n * @param deviceId Input device id (from microphone list)\n */\n async init(deviceId = 'default') {\n try {\n // cleanup\n this.ngOnDestroy();\n\n // request permission\n this._stream = await navigator.mediaDevices.getUserMedia({\n audio: {\n deviceId: { exact: deviceId },\n noiseSuppression: this._config.audio.noiseSuppression?.nativeNoiseSuppression || false,\n echoCancellation: this._config.audio.noiseSuppression?.nativeEchoCancellation || false,\n autoGainControl: this._config.audio.noiseSuppression?.autoGainControl || false,\n },\n });\n\n this._event.log.next(\n `${MicrophoneService.name}: Microphone permission granted (deviceid: '${deviceId ?? 'default'}')!`,\n );\n\n // save list of microphones\n this._microphones = await this._microphoneList();\n\n // monitor audio\n await this._monitor();\n\n return true;\n } catch (error) {\n this._event.exception.next(error as Error);\n }\n\n return false;\n }\n\n /**\n * Monitor audio\n *\n * @returns chunk subject\n */\n private async _monitor() {\n const worklet = await this._workletNode();\n\n // on message\n worklet.port.onmessage = async (event) => {\n const data = (event.data as MicrophoneProcessorData) ?? null;\n if (!data) return;\n\n // emit chunk\n this._data.next(data);\n };\n\n return this._data;\n }\n\n /**\n * Microphones\n */\n private async _microphoneList() {\n const devices = await navigator.mediaDevices.enumerateDevices();\n return devices.filter((device) => device.kind === 'audioinput');\n }\n\n /**\n * Prepare worklet node\n */\n private async _workletNode() {\n // Create audio context\n this._audioContext = new AudioContext({ sampleRate: SAMPLE_RATE });\n\n this._analyser = this._audioContext.createAnalyser();\n this._analyser.fftSize = 256;\n\n if (this._config.audio.noiseSuppression) {\n await this._audioContext.audioWorklet.addModule(\n this._config.audio.noiseSuppression.worklet ??\n `${this._config.basePath}/worklets/workletProcessor.js`,\n );\n }\n\n // Load custom worklet\n const blob = new Blob([MICROPHONE_PROCESSOR], { type: 'application/javascript' });\n const workletURL = URL.createObjectURL(blob);\n await this._audioContext.audioWorklet.addModule(workletURL);\n URL.revokeObjectURL(workletURL);\n\n // Create Nodes\n this._source = this._audioContext.createMediaStreamSource(this._stream);\n\n // Gain Node\n const gainNode = this._audioContext.createGain();\n gainNode.gain.value = this._config.audio.gain;\n\n if (this._config.audio.noiseSuppression) {\n // Load RNNoise dependencies\n const rnnoiseWasmBinary = await loadRnnoise({\n url:\n this._config.audio.noiseSuppression.rnnoise ??\n `${this._config.basePath}/wasm/rnnoise.wasm`,\n simdUrl:\n this._config.audio.noiseSuppression.rnnoise_simd ??\n `${this._config.basePath}/wasm/rnnoise_simd.wasm`,\n });\n\n // RNNoise Node\n const rnnoiseNode = new RnnoiseWorkletNode(this._audioContext, {\n wasmBinary: rnnoiseWasmBinary,\n maxChannels: 1, // Standard for mono microphone input\n });\n\n this._source.connect(rnnoiseNode);\n rnnoiseNode.connect(gainNode);\n } else {\n this._source.connect(gainNode);\n }\n\n this._source.connect(this._analyser);\n\n // loop back mic sound\n if (this._config.audio.loopBackToSpeakers)\n this._analyser.connect(this.audioContext!.destination);\n\n // Custom Worklet Node\n const workletNode = new AudioWorkletNode(this._audioContext, MICROPHONE_PROCESSOR_NAME);\n\n // Connect the Graph: Source -> RNNoise (if noise suppression) -> Gain -> Custom Worklet\n gainNode.connect(workletNode);\n\n return workletNode;\n }\n}\n","import { isPlatformBrowser, isPlatformServer } from '@angular/common';\nimport { Injectable, PLATFORM_ID, inject } from '@angular/core';\n\n@Injectable()\nexport class PlatformService {\n private readonly _platform = inject(PLATFORM_ID);\n\n /**\n * Is browser\n */\n get isBrowser(): boolean {\n return isPlatformBrowser(this._platform);\n }\n\n /**\n * Is server\n */\n get isServer(): boolean {\n return isPlatformServer(this._platform);\n }\n}\n","import { inject, Injectable, OnDestroy } from '@angular/core';\nimport { EventService } from '../../event/event-service';\nimport { PlatformService } from '../../platform/platform-service';\nimport { MicrophoneService } from '../microphone-service/microphone-service';\n\n@Injectable()\nexport class SpeechRecognitionService implements OnDestroy {\n /**\n * Dependencies\n */\n private readonly _event = inject(EventService);\n private readonly _platform = inject(PlatformService);\n private readonly _mic = inject(MicrophoneService);\n\n private _recognitionClass!: {\n new (): SpeechRecognition;\n prototype: SpeechRecognition;\n };\n\n /**\n * Instance\n */\n private _recognition!: SpeechRecognition;\n\n /**\n * Transcript\n */\n private _transcript = '';\n\n /**\n * Get transcript\n */\n get transcript() {\n return this._transcript;\n }\n\n ngOnDestroy(): void {\n this.reset(); // clear transcript\n\n if (this._platform.isBrowser) this._recognition.stop();\n }\n\n /**\n * Clear transcript\n */\n reset() {\n this._transcript = '';\n }\n\n init() {\n this._recognitionClass = window.SpeechRecognition || window.webkitSpeechRecognition;\n\n if (!SpeechRecognition) {\n this._event.exception.next(new Error('Speech recognition is not supported'));\n return;\n }\n\n this._recognition = new this._recognitionClass(); // initialize\n\n // 2. Configuration\n this._recognition.lang = 'en-US'; // Set language\n this._recognition.continuous = true; // Keep listening even if the user pauses\n this._recognition.interimResults = true; // Show results while the user is still speaking\n\n this._recognition.onend = () => {\n this.reset();\n this.init(); // start\n };\n\n // 3. Handle Results\n this._recognition.onresult = (event) => {\n this._transcript = '';\n\n // Don't capture if muted\n if (this._mic.isMuted) return;\n\n for (let i = event.resultIndex; i < event.results.length; i++)\n this._transcript += event.results[i][0].transcript;\n };\n\n this._recognition.start(); // start\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { Tensor, TypedTensor } from 'onnxruntime-web';\nimport { EventService } from '../../event/event-service';\nimport { ModelService } from '../../model/model-service';\nimport { SAMPLE_RATE } from '../microphone-service/microphone-service.constant';\nimport { InputMetadata, VADState } from './vad-service.type';\n\n@Injectable()\nexport class VadService {\n /**\n * Dependencies\n */\n private readonly _event = inject(EventService);\n private readonly _model = inject(ModelService);\n\n /**\n * VAD Shape\n */\n private _shape: number[] = [];\n\n /**\n * VAD LSTM hidden & cell state\n */\n private _state: VADState | null = null;\n\n /**\n * Get session\n */\n private get _session() {\n return this._model.sileroVAD;\n }\n\n /**\n * Initialize\n */\n init() {\n this._shape = this._getShape();\n\n this._state = {\n hidden: new Tensor('float32', new Float32Array(128).fill(0), this._shape),\n cell: new Tensor('float32', new Float32Array(128).fill(0), this._shape),\n };\n }\n\n /**\n * Get VAD score\n *\n * @param chunk\n * @returns\n */\n async score(sample: Float32Array): Promise<number> {\n if (!this._state) throw new Error(`${VadService.name}: Undefined LSTM state.`);\n\n try {\n const tensor = new Tensor('float32', sample, [1, sample.length]);\n const sampleRate = new Tensor('int64', [BigInt(SAMPLE_RATE)], []);\n\n // run inference\n const response = await this._session.run({\n input: tensor,\n sr: sampleRate,\n h: this._state.hidden,\n c: this._state.cell,\n });\n\n // Update memory\n this._state.hidden = response['hn'] as TypedTensor<'float32'>;\n this._state.cell = response['cn'] as TypedTensor<'float32'>;\n\n return response['output'].data[0] as number;\n } catch (error) {\n this._event.exception.next(error as Error);\n return 0;\n }\n }\n\n /**\n * Get shape of vad session\n *\n * Ex: [2, 1, 64]\n */\n private _getShape() {\n const { shape } = (this._session.inputMetadata.find((e) => e.name === 'h') ??\n {}) as InputMetadata;\n\n const vadState = [];\n\n if (shape) {\n for (const sh of shape) {\n if (typeof sh === 'string') vadState.push(1);\n else vadState.push(sh);\n }\n\n return vadState;\n }\n\n throw new Error(`${VadService.name}: Unable to identify shape of the session.`);\n }\n}\n","/**\n * DefaulT VAD threshold\n */\nexport const DEFAULT_VAD_THRESHOLD = 0.5;\n","import { inject, Injectable, OnDestroy } from '@angular/core';\nimport {\n concatMap,\n distinctUntilChanged,\n EMPTY,\n filter,\n ignoreElements,\n map,\n merge,\n scan,\n share,\n switchMap,\n take,\n takeUntil,\n tap,\n throttleTime,\n timer,\n withLatestFrom,\n} from 'rxjs';\nimport { SubSink } from 'subsink';\nimport { ConfigService } from '../config/config-service';\nimport { EventService } from '../event/event-service';\nimport { SpeechEvent } from '../event/event-service.type';\nimport { DEFAULT_INFERENCE_SCORE } from '../model/model-service.const';\nimport { VAD_HANGOVER_FRAMES, VadState } from '../model/model-service.type';\nimport { PipelineService } from '../pipeline/pipeline-service';\nimport { DEFAULT_SILENCE_DURATION, DEFAULT_SPEECH_THRESHOLD_TIME } from './audio-service.const';\nimport { MicrophoneService } from './microphone-service/microphone-service';\nimport { SpeechRecognitionService } from './speech-recognition/speech-recognition-service';\nimport { VadService } from './vad-service/vad-service';\nimport { DEFAULT_VAD_THRESHOLD } from './vad-service/vad-service.const';\n\n@Injectable()\nexport class AudioService implements OnDestroy {\n /**\n * Dependencies\n */\n private readonly _config = inject(ConfigService);\n private readonly _event = inject(EventService);\n private readonly _mic = inject(MicrophoneService);\n private readonly _vad = inject(VadService);\n private readonly _pipeline = inject(PipelineService);\n private readonly _speechRecognition = inject(SpeechRecognitionService);\n\n private readonly _subs = new SubSink();\n\n private _endCurrentRecording = false;\n\n /**\n * Recording state\n */\n private _isRecording = false;\n\n /**\n * Is process is initialized (detected wakeword)\n */\n private _isInitialized = false;\n\n get isRecording() {\n return this._isRecording;\n }\n\n ngOnDestroy(): void {\n this._subs.unsubscribe();\n }\n\n /**\n * Initialize audio\n */\n async init() {\n if (!this._mic.microphones.length) {\n this._event.exception.next(new Error('Microphone permission required!'));\n return;\n }\n\n const data = await this._mic.data;\n\n // Init VAD\n this._vad.init();\n\n this._speechRecognition.init();\n\n // Fire ready event\n this._event.ready.next();\n\n data.subscribe(async (data) => {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const that = this;\n\n // Fire a speech event\n this._event.speech.next({\n ...data,\n sample: this._mic.isMuted ? new Float32Array(1280).fill(0) : data.sample, // no speech data if muted\n vadScore: await this._vad.score(data.sample), // emit vad score even if muted\n get hasVoiceActivity() {\n return this.vadScore > (that._config.audio.vadThreshold ?? DEFAULT_VAD_THRESHOLD);\n },\n });\n });\n\n this._listenForWakeword();\n this._captureCommandAfterWakeword();\n }\n\n /**\n * Force start recording (without wakeword)\n */\n forceStartRecording() {\n this._isInitialized = true;\n this._endCurrentRecording = false;\n\n // this._speechRecognition.reset(); // reset transcript\n this._event.wakeword.next({\n inferenceScore: 0,\n chunk: [],\n vadScore: 0,\n hasVoiceActivity: false,\n sample: new Float32Array(),\n rms: 0,\n db: 0,\n dbNormalized: 0,\n });\n }\n\n /**\n * Force end recording\n */\n forceEndRecording() {\n this._endCurrentRecording = true;\n this._isInitialized = false;\n\n this._event.silence.next({\n chunk: new Float32Array(),\n transcript: '',\n interimResponse: false, // final response\n });\n }\n\n /**\n * Toggle recording\n */\n toggleRecording() {\n if (this._isInitialized) {\n this._isInitialized = false;\n this.forceEndRecording();\n } else this.forceStartRecording();\n }\n\n /**\n * Identifies the wakeword and emits the event\n */\n private _listenForWakeword() {\n const vad$ = this._getWakeWordStream();\n\n this._subs.sink = this._event.speech\n .pipe(\n filter(() => !this._isInitialized && !this._mic.isMuted),\n withLatestFrom(vad$),\n concatMap(async ([speech, vadState]) => {\n const score = await this._pipeline.run(speech);\n return { speech, score, chunk: vadState.buffer };\n }),\n filter(({ score }) => {\n if (this._config.onnx.wakeword) {\n const transcriptArray = this._speechRecognition.transcript\n .toLowerCase()\n .trim()\n .split(' ');\n\n // use speech recognition for wake word identification\n if (transcriptArray.length === this._config.onnx.wakeword.length)\n for (const idx in this._config.onnx.wakeword)\n if (\n +idx < transcriptArray.length &&\n transcriptArray[idx].includes(this._config.onnx.wakeword[idx].toLowerCase())\n )\n return true;\n }\n\n return score > (this._config.onnx.wakewordInferenceThreshold ?? DEFAULT_INFERENCE_SCORE);\n }),\n )\n .subscribe(({ speech, score, chunk }) => {\n this._event.wakeword.next({ ...speech, inferenceScore: score, chunk });\n });\n }\n\n /**\n * New logic: Captures the full command audio after a wakeword\n */\n private _captureCommandAfterWakeword() {\n const SILENCE_DURATION = this._config.audio.silenceDuration ?? DEFAULT_SILENCE_DURATION;\n const VAD_THRESHOLD = this._config.audio.vadThreshold ?? DEFAULT_VAD_THRESHOLD;\n const PRE_ROLL_MS = this._config.audio.speechThresholdTime ?? DEFAULT_SPEECH_THRESHOLD_TIME;\n const CHUNK_DURATION_MS = 80; // Each speech event is fired (by audio processor) at 80 ms\n const MAX_SLIDING_WINDOW_CHUNKS = Math.ceil(PRE_ROLL_MS / CHUNK_DURATION_MS);\n\n // speech sliding window state\n const speechSlidingWindow: Float32Array[] = [];\n\n // trigger 1: wakeword\n const wakewordTrigger$ = this._event.wakeword.pipe(\n filter(() => !this._isRecording), // Ignore wakeword if already recording\n map(() => [] as Float32Array[]),\n );\n\n // trigger 2: Continuous VAD > THRESHOLD\n const continuousVadTrigger$ = this._event.speech.pipe(\n filter(() => !this._mic.isMuted),\n // intercept the raw stream to constantly update the threshold window\n tap((s) => {\n // Only buffer if we aren't already formally recording\n if (!this._isRecording && this._isInitialized) {\n speechSlidingWindow.push(s.sample);\n // Keep the array length strictly to our configured window size\n if (speechSlidingWindow.length > MAX_SLIDING_WINDOW_CHUNKS) speechSlidingWindow.shift();\n }\n }),\n\n // check VAD score\n map((s) => s.vadScore > VAD_THRESHOLD),\n filter(() => !this._isRecording && this._isInitialized),\n distinctUntilChanged(),\n\n switchMap((isVoiceActive) => {\n if (!isVoiceActive) return EMPTY; // Cancel if voice stops before threshold\n\n this._speechRecognition.reset();\n\n // PRE-FILL the actual recording buffer with our duration (ex: 300ms) look back window!\n // clone so future sliding window updates don't mutate the captured audio.\n const bufferedChunks: Float32Array[] = [...speechSlidingWindow];\n\n // continue accumulating new chunks silently while we wait for the timer\n const buffer$ = this._event.speech.pipe(\n filter(() => !this._mic.isMuted),\n tap((s) => bufferedChunks.push(s.sample)),\n ignoreElements(),\n );\n\n // timer that emits the fully accumulated chunks (pre-roll)\n const timer$ = timer(PRE_ROLL_MS).pipe(map(() => bufferedChunks));\n\n return merge(buffer$, timer$).pipe(take(1));\n }),\n );\n\n // combine triggers\n const startRecordingTrigger$ = merge(\n wakewordTrigger$.pipe(\n tap(() => {\n if (!this._isInitialized) this._isInitialized = true; // initialized\n }),\n ),\n continuousVadTrigger$,\n ).pipe(\n filter(() => !this._mic.isMuted),\n throttleTime(this._config.throttleTime), // Prevent double-firing if wakeword and voice overlap\n );\n\n // recording pipeline\n this._subs.sink = startRecordingTrigger$\n .pipe(\n tap(() => {\n this._isRecording = true;\n this._speechRecognition.reset();\n }),\n\n switchMap((bufferedChunks) => {\n // Initialize our command chunks with anything captured during the 1s VAD wait\n const commandChunks: Float32Array[] = [...bufferedChunks];\n\n const speech$ = this._event.speech.pipe(\n filter(() => !this._mic.isMuted),\n tap((speech) => {\n commandChunks.push(speech.sample);\n\n if (this._isRecording)\n // emit recording events\n this._event.recording.next({\n chunk: this._flatten(commandChunks),\n transcript: this._speechRecognition.transcript,\n });\n }),\n share(),\n );\n\n const silence$ = speech$.pipe(\n map((s) => s.vadScore < VAD_THRESHOLD),\n distinctUntilChanged(), // only emit when silence state changes\n );\n\n // silence timeout logic\n const normalSilenceTimeout$ = silence$.pipe(\n switchMap((isSilent) => {\n if (!isSilent) {\n return EMPTY; // if voice cancel the timer\n }\n\n // silence started, start timer\n return timer(SILENCE_DURATION).pipe(\n takeUntil(\n silence$.pipe(filter((silent) => !silent)), // cancel if voice resumes\n ),\n );\n }),\n );\n\n // force end recording\n const forceComplete$ = speech$.pipe(filter(() => this._endCurrentRecording));\n\n return merge(normalSilenceTimeout$, forceComplete$).pipe(\n take(1),\n map(() => this._flatten(commandChunks)),\n );\n }),\n )\n .subscribe({\n next: (chunk) => {\n const interimResponse =\n this._config.mode === 'DEFAULT' || this._config.mode === 'PTT' ? false : true;\n\n this._event.silence.next({\n chunk,\n transcript: this._speechRecognition.transcript,\n interimResponse,\n }); // emit silence event\n\n // Default case\n if (this._config.mode === 'DEFAULT' || this._config.mode === 'PTT') {\n this._isInitialized = false;\n }\n\n this._endCurrentRecording = false; // reset flag after recording ends\n\n this._isRecording = false;\n },\n error: (err) => {\n this._event.exception.next(err);\n },\n });\n }\n\n /**\n * Helper to flatten array of buffers into a single Float32Array\n */\n private _flatten(chunks: Float32Array[]): Float32Array {\n const totalLength = chunks.reduce((acc, chunk) => acc + chunk.length, 0);\n const result = new Float32Array(totalLength);\n let offset = 0;\n\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n return result;\n }\n\n /**\n * Wakeword stream\n * @returns\n */\n private _getWakeWordStream() {\n return this._event.speech.pipe(\n filter(() => !this._mic.isMuted),\n scan(\n (state: VadState, speech: SpeechEvent): VadState => {\n const { hasVoiceActivity, sample } = speech;\n let { isActive, hangoverCounter, buffer } = state;\n\n if (hasVoiceActivity) {\n // If we were idle, start a fresh buffer\n if (!isActive) {\n buffer = [];\n isActive = true;\n }\n // Reset silence tracker to 0 because we hear a voice\n hangoverCounter = 0;\n } else if (isActive) {\n // Increment silence tracker\n hangoverCounter++;\n\n // If we've reached the limit of allowed silent frames\n if (hangoverCounter >= VAD_HANGOVER_FRAMES) {\n isActive = false;\n }\n }\n\n // Add sample if we are in an active speech window\n if (isActive) {\n buffer = [...buffer, sample];\n }\n\n return { buffer, hangoverCounter, isActive };\n },\n { buffer: [], hangoverCounter: -1, isActive: false },\n ),\n\n // Only share the state when it is actively collecting\n share(),\n );\n }\n}\n","import { inject, Injectable, OnDestroy } from '@angular/core';\nimport { throttleTime } from 'rxjs';\nimport { SubSink } from 'subsink';\nimport { OrbComponentService } from '../../../components/orb-component/orb-component-service';\nimport { ConfigService } from '../../config/config-service';\nimport { EventService } from '../../event/event-service';\nimport { PlatformService } from '../../platform/platform-service';\nimport { AudioService } from '../audio-service';\nimport { MicrophoneService } from '../microphone-service/microphone-service';\n\n@Injectable()\nexport class SpeakerService implements OnDestroy {\n /**\n * Dependencies\n */\n private readonly _config = inject(ConfigService);\n private readonly _platform = inject(PlatformService);\n private readonly _event = inject(EventService);\n private readonly _mic = inject(MicrophoneService);\n private readonly _orb = inject(OrbComponentService);\n private readonly _audio = inject(AudioService);\n\n private readonly _subs = new SubSink();\n\n private _upSound!: HTMLAudioElement;\n private _downSound!: HTMLAudioElement;\n private _pingSound!: HTMLAudioElement;\n\n private _nextPlayTime = 0;\n private _sources: AudioBufferSourceNode[] = [];\n\n /**\n * List of available microphones\n */\n private _speakers: MediaDeviceInfo[] = [];\n\n constructor() {\n if (this._config.audio.sound?.enable === false) return;\n\n // Audio is only available in browser context\n if (this._platform.isBrowser) {\n // up\n this._upSound = new Audio(\n this._config.audio.sound?.up ?? `${this._config.basePath}/sounds/up.mp3`,\n );\n\n this._upSound.volume =\n this._config.audio.sound?.upVolume ?? this._config.audio.sound?.masterVolume ?? 0.5;\n\n // down\n this._downSound = new Audio(\n this._config.audio.sound?.down ?? `${this._config.basePath}/sounds/down.mp3`,\n );\n\n this._downSound.volume =\n this._config.audio.sound?.downVolume ?? this._config.audio.sound?.masterVolume ?? 0.5;\n\n // ping\n this._pingSound = new Audio(\n this._config.audio.sound?.ping ?? `${this._config.basePath}/sounds/ping.mp3`,\n );\n\n this._pingSound.volume =\n this._config.audio.sound?.pingVolume ?? this._config.audio.sound?.masterVolume ?? 0.1;\n\n // Preload\n this._upSound.preload = this._downSound.preload = this._pingSound.preload = 'auto';\n\n this._loadSubscriptions();\n\n // Get speaker list\n this._speakerList().then((e) => {\n this._speakers = e;\n });\n }\n }\n\n /**\n * List of speakers\n */\n get speakers() {\n return this._speakers;\n }\n\n /**\n * Set output source\n */\n set source(deviceId: string) {\n this._setSource(deviceId);\n }\n\n ngOnDestroy(): void {\n this._subs.unsubscribe();\n }\n\n /**\n * Play audio chunk\n *\n * @param buffer audio buffer\n * @param sampleRate sample rate to play in\n */\n playChunk(buffer: ArrayBuffer, sampleRate: number) {\n // Calculate how many full 32-bit floats fit in this buffer\n const float32Count = Math.floor(buffer.byteLength / 4);\n\n // Convert raw bytes back to 32-bit floats\n const float32Array = new Float32Array(buffer, 0, float32Count);\n\n // Create an empty audio buffer mapping\n const audioBuffer = this._mic.audioContext!.createBuffer(1, float32Array.length, sampleRate);\n audioBuffer.copyToChannel(float32Array, 0);\n\n this.playAudioBuffer(audioBuffer);\n }\n\n /**\n * Play audio buffer\n *\n * @param audioBuffer\n */\n playAudioBuffer(audioBuffer: AudioBuffer) {\n // if recording, clear the queue\n if (this._audio.isRecording) {\n this._clearQueue();\n return;\n }\n\n // Create a source node to play the buffer\n const source = this._mic.audioContext!.createBufferSource();\n source.buffer = audioBuffer;\n\n source.connect(this._mic.analyzer!);\n source.connect(this._mic.audioContext!.destination);\n\n // Schedule the chunk to play exactly when the previous chunk finishes\n const currentTime = this._mic.audioContext!.currentTime;\n if (this._nextPlayTime < currentTime) {\n this._nextPlayTime = currentTime; // Reset if the queue has emptied\n }\n\n source.start(this._nextPlayTime);\n\n this._sources.push(source); // keep instance of source to stop later\n\n this._nextPlayTime += audioBuffer.duration;\n\n source.onended = () => {\n this._sources.shift();\n\n if (!this._sources.length)\n if (!this._config.orb?.mode || this._config.orb?.mode === 'auto')\n this._orb.setState('initialized'); // reset\n };\n\n if (!this._config.orb?.mode || this._config.orb?.mode === 'auto')\n this._orb.setState('speaking'); // speaking\n }\n\n /**\n * Play on sound\n */\n playUp() {\n if (this._config.audio.sound?.enable === false) return;\n\n this._upSound.play();\n }\n\n /**\n * Play off sound\n */\n playDown() {\n if (this._config.audio.sound?.enable === false) return;\n\n this._downSound.play();\n }\n\n /**\n * Play ping\n */\n playPing() {\n if (this._config.audio.sound?.enable === false) return;\n\n this._pingSound.play();\n }\n\n /**\n * Set source\n *\n * @param deviceId\n */\n private async _setSource(deviceId: string) {\n if (typeof this._mic.audioContext!.setSinkId === 'function') {\n await this._mic.audioContext!.setSinkId(deviceId);\n } else\n this._event.exception.next(\n new Error('AudioContext.setSinkId is not supported. Playing on default'),\n );\n }\n\n /**\n * Clear playback queue\n */\n private _clearQueue() {\n this._sources.forEach((s) => s.stop());\n this._sources = [];\n this._nextPlayTime = 0;\n }\n\n /**\n * Load subscriptions\n */\n private _loadSubscriptions() {\n this._subs.sink = this._event.wakeword\n .pipe(throttleTime(this._config.throttleTime))\n .subscribe(() => {\n this.playUp();\n });\n\n // If default, on silence, play down\n this._subs.sink = this._event.silence.subscribe((ev) => {\n if (!ev.interimResponse) this.playDown();\n else this.playPing();\n });\n\n // If recording event\n this._subs.sink = this._event.recording.subscribe(() => {\n this._clearQueue();\n });\n }\n\n /**\n * Speakers\n */\n private async _speakerList() {\n const devices = await navigator.mediaDevices.enumerateDevices();\n return devices.filter((device) => device.kind === 'audiooutput');\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { OrbComponentService } from '../../components/orb-component/orb-component-service';\nimport { AudioService } from '../audio/audio-service';\nimport { MicrophoneService } from '../audio/microphone-service/microphone-service';\nimport { SpeakerService } from '../audio/speaker-service/speaker-service';\nimport { SpeechRecognitionService } from '../audio/speech-recognition/speech-recognition-service';\nimport { VadService } from '../audio/vad-service/vad-service';\nimport { ConfigService } from '../config/config-service';\nimport { EventService } from '../event/event-service';\nimport { ModelService } from '../model/model-service';\nimport { PipelineService } from '../pipeline/pipeline-service';\nimport { PlatformService } from '../platform/platform-service';\n\n@Injectable()\nexport class BridgeService {\n readonly mic = inject(MicrophoneService);\n readonly speaker = inject(SpeakerService);\n readonly speechRecognition = inject(SpeechRecognitionService);\n readonly vad = inject(VadService);\n readonly audio = inject(AudioService);\n readonly config = inject(ConfigService);\n readonly event = inject(EventService);\n readonly model = inject(ModelService);\n readonly pipeline = inject(PipelineService);\n readonly platform = inject(PlatformService);\n readonly orbComponentService = inject(OrbComponentService);\n}\n","import { NgClass } from '@angular/common';\nimport {\n AfterViewInit,\n Component,\n ElementRef,\n HostListener,\n inject,\n NgZone,\n OnDestroy,\n ViewChild,\n} from '@angular/core';\nimport { SubSink } from 'subsink';\nimport * as THREE from 'three';\nimport { AudioService } from '../../services/audio/audio-service';\nimport { MicrophoneService } from '../../services/audio/microphone-service/microphone-service';\nimport { ConfigService } from '../../services/config/config-service';\nimport { EventService } from '../../services/event/event-service';\nimport { PlatformService } from '../../services/platform/platform-service';\nimport { OrbComponentService } from './orb-component-service';\nimport { AgentState } from './orb-component.type';\n\n@Component({\n selector: 'app-orb-component',\n imports: [NgClass],\n template: `\n <div\n #rendererContainer\n role=\"button\"\n tabindex=\"0\"\n class=\"orb-container\"\n [style.width.px]=\"orbSize\"\n [style.height.px]=\"orbSize\"\n (click)=\"toggleRecording()\"\n (keypress)=\"toggleRecording()\"\n [ngClass]=\"{ muted: isMuted }\"\n ></div>\n `,\n styles: [\n `\n .orb-container {\n display: flex;\n justify-content: center;\n align-items: center;\n overflow: hidden;\n cursor: pointer;\n }\n .muted {\n cursor: not-allowed;\n }\n canvas {\n display: block;\n outline: none;\n }\n `,\n ],\n})\nexport class OrbComponent implements AfterViewInit, OnDestroy {\n @ViewChild('rendererContainer', { static: true })\n private _rendererContainer!: ElementRef<HTMLDivElement>;\n\n private readonly _config = inject(ConfigService);\n private readonly _platform = inject(PlatformService);\n private readonly _audio = inject(AudioService);\n private readonly _mic = inject(MicrophoneService);\n private readonly _event = inject(EventService);\n private readonly _ngZone = inject(NgZone);\n private readonly _service = inject(OrbComponentService);\n private readonly _subs = new SubSink();\n\n // Three.js Core\n private _scene!: THREE.Scene;\n private _camera!: THREE.PerspectiveCamera;\n private _renderer!: THREE.WebGLRenderer;\n private _sphere!: THREE.Points;\n private _material!: THREE.ShaderMaterial;\n private _animationFrameId!: number;\n private _timer = new THREE.Timer();\n private _geometry!: THREE.BufferGeometry;\n\n // Audio Processing\n private dataArray!: Uint8Array<ArrayBuffer>;\n private micVolume = 0;\n\n // State Management\n private currentState: AgentState = 'idle';\n private agentProfiles = {\n idle: {\n spike: 0.05,\n noiseScale: 1.0,\n speed: 0.2,\n twist: 0.0,\n pulse: 0.0,\n base: '#001133',\n peak: '#ff4000',\n },\n initialized: {\n spike: 0.05,\n noiseScale: 1.0,\n speed: 0.2,\n twist: 0.0,\n pulse: 0.0,\n base: '#001133',\n peak: '#00aaff',\n },\n listening: {\n spike: 0.2,\n noiseScale: 2.5,\n speed: 1.0,\n twist: 0.0,\n pulse: 0.0,\n base: '#002211',\n peak: '#00ff88',\n },\n thinking: {\n spike: 0.2,\n noiseScale: 1.5,\n speed: 1.5,\n twist: 1.5,\n pulse: 0.0,\n base: '#220033',\n peak: '#ff00ff',\n },\n speaking: {\n spike: 0.1,\n noiseScale: 1.0,\n speed: 0.5,\n twist: 0.0,\n pulse: 0.1,\n base: '#331100',\n peak: '#ff8800',\n },\n };\n\n private targets = { ...this.agentProfiles.idle };\n private targetColorBase = new THREE.Color(this.targets.base);\n private targetColorPeak = new THREE.Color(this.targets.peak);\n\n get orbSize(): number {\n return this._config.orb?.size ?? 400;\n }\n\n get isMuted() {\n return this._mic.isMuted;\n }\n\n ngAfterViewInit(): void {\n if (this._platform.isServer) return;\n\n this.dataArray = new Uint8Array(this._mic.analyzer!.frequencyBinCount);\n this._loadSubscribers();\n\n // MUST run outside Angular to prevent CD loops\n this._ngZone.runOutsideAngular(() => {\n this._initThreeJs();\n this._timer.connect(document);\n this._animate();\n });\n }\n\n ngOnDestroy(): void {\n if (this._platform.isServer) return;\n\n cancelAnimationFrame(this._animationFrameId);\n\n this._subs.unsubscribe();\n\n if (this._renderer) {\n this._renderer.dispose();\n this._renderer.forceContextLoss();\n // Remove canvas from DOM to ensure cleanup\n const domElement = this._renderer.domElement;\n if (domElement && domElement.parentNode) {\n domElement.parentNode.removeChild(domElement);\n }\n }\n\n if (this._geometry) this._geometry.dispose();\n if (this._material) this._material.dispose();\n }\n\n /**\n * Space bar press\n */\n @HostListener('window:keydown', ['$event'])\n handleSpacebarPress(event: KeyboardEvent): void {\n if (event.code !== this._config.hotkey) return;\n\n event.preventDefault();\n this.toggleRecording();\n }\n\n /**\n * Toggle recording\n */\n toggleRecording() {\n if (this.isMuted) return;\n\n this._audio.toggleRecording();\n }\n\n /**\n * Set state of orb\n *\n * @param state orb state\n */\n setState(state: AgentState): void {\n const profile = this.agentProfiles[state];\n\n this.currentState = state;\n this.targets = { ...profile };\n this.targetColorBase.set(profile.base);\n this.targetColorPeak.set(profile.peak);\n }\n\n /**\n * Subscriptions\n */\n private _loadSubscribers(): void {\n this._subs.sink = this._event.speech.subscribe((data) => {\n this.micVolume = this.isMuted ? 0 : data.dbNormalized;\n });\n\n // only update orb state if mode is auto\n if (!this._config.orb?.mode || this._config.orb?.mode === 'auto') {\n // after wakeword, set to listening\n this._subs.sink = this._event.wakeword.subscribe(() => {\n this.setState('listening');\n });\n\n // after silence, set thinking or idle\n this._subs.sink = this._event.silence.subscribe((ev) => {\n if (ev.interimResponse) this.setState('thinking');\n else this.setState('idle');\n });\n\n // if recording started\n this._subs.sink = this._event.recording.subscribe(() => {\n this.setState('listening');\n });\n\n // state change using service\n this._subs.sink = this._service.state.subscribe((state) => {\n this.setState(state);\n });\n }\n }\n\n /**\n * Speech volume for animation\n */\n private _getTTSVolume(): number {\n this._mic.analyzer!.getByteFrequencyData(this.dataArray);\n const sum = this.dataArray.reduce((a, b) => a + b, 0);\n return sum / this.dataArray.length / 255.0;\n }\n\n /**\n * Init\n */\n private _initThreeJs(): void {\n const size = this.orbSize;\n\n this._scene = new THREE.Scene();\n this._camera = new THREE.PerspectiveCamera(50, 1, 0.1, 1000);\n this._camera.position.z = 6;\n\n this._renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true });\n this._renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));\n this._renderer.setSize(size, size);\n\n this._rendererContainer.nativeElement.appendChild(this._renderer.domElement);\n\n const particlesCount = this._config.orb?.particlesCount ?? 30000;\n this._geometry = new THREE.BufferGeometry();\n const posArray = new Float32Array(particlesCount * 3);\n const randomArray = new Float32Array(particlesCount);\n const radius = this._config.orb?.radius ?? 1.8;\n\n for (let i = 0; i < particlesCount; i++) {\n const phi = Math.acos(-1 + (2 * i) / particlesCount);\n const theta = Math.sqrt(particlesCount * Math.PI) * phi;\n\n posArray[i * 3] = radius * Math.cos(theta) * Math.sin(phi);\n posArray[i * 3 + 1] = radius * Math.sin(theta) * Math.sin(phi);\n posArray[i * 3 + 2] = radius * Math.cos(phi);\n randomArray[i] = Math.random();\n }\n\n this._geometry.setAttribute('position', new THREE.BufferAttribute(posArray, 3));\n this._geometry.setAttribute('aRandom', new THREE.BufferAttribute(randomArray, 1));\n\n this._material = new THREE.ShaderMaterial({\n uniforms: {\n uTime: { value: 0 },\n uSpike: { value: 0.05 },\n uNoiseScale: { value: 1.0 },\n uSpeed: { value: 0.2 },\n uTwist: { value: 0.0 },\n uPulse: { value: 0.0 },\n uColorBase: { value: new THREE.Color('#002244') },\n uColorPeak: { value: new THREE.Color('#00ffff') },\n },\n vertexShader: this._getVertexShader(),\n fragmentShader: this._getFragmentShader(),\n transparent: true,\n blending: THREE.AdditiveBlending,\n depthWrite: false,\n });\n\n this._sphere = new THREE.Points(this._geometry, this._material);\n this._scene.add(this._sphere);\n }\n\n /**\n * Animator\n */\n private _animate = (): void => {\n this._animationFrameId = requestAnimationFrame(this._animate);\n this._timer.update();\n const elapsedTime = this._timer.getElapsed();\n\n this._material.uniforms['uTime'].value = elapsedTime;\n\n let dynamicSpike = this.targets.spike;\n let dynamicPulse = this.targets.pulse;\n\n if (this.currentState === 'listening') {\n dynamicSpike += this.micVolume * 1.0;\n } else if (this.currentState === 'speaking') {\n const ttsVolume = this._getTTSVolume();\n dynamicPulse += ttsVolume * 0.5;\n }\n\n const lerpFactor = 0.08;\n this._material.uniforms['uSpike'].value +=\n (dynamicSpike - this._material.uniforms['uSpike'].value) * lerpFactor;\n this._material.uniforms['uPulse'].value +=\n (dynamicPulse - this._material.uniforms['uPulse'].value) * lerpFactor;\n\n this._material.uniforms['uNoiseScale'].value +=\n (this.targets.noiseScale - this._material.uniforms['uNoiseScale'].value) * lerpFactor;\n this._material.uniforms['uSpeed'].value +=\n (this.targets.speed - this._material.uniforms['uSpeed'].value) * lerpFactor;\n this._material.uniforms['uTwist'].value +=\n (this.targets.twist - this._material.uniforms['uTwist'].value) * lerpFactor;\n\n this._material.uniforms['uColorBase'].value.lerp(this.targetColorBase, lerpFactor);\n this._material.uniforms['uColorPeak'].value.lerp(this.targetColorPeak, lerpFactor);\n\n this._sphere.rotation.y = elapsedTime * 0.1;\n this._sphere.rotation.z = elapsedTime * 0.01;\n\n this._renderer.render(this._scene, this._camera);\n };\n\n /**\n * Vertex shader\n */\n private _getVertexShader(): string {\n return `\n uniform float uTime;\n uniform float uSpike; \n uniform float uNoiseScale; \n uniform float uSpeed; \n uniform float uTwist; \n uniform float uPulse; \n \n varying vec3 vColor;\n varying float vDisplacement;\n\n attribute float aRandom;\n\n // Simplex 3D Noise\n vec4 permute(vec4 x){return mod(((x*34.0)+1.0)*x, 289.0);}\n vec4 taylorInvSqrt(vec4 r){return 1.79284291400159 - 0.85373472095314 * r;}\n float snoise(vec3 v){ \n const vec2 C = vec2(1.0/6.0, 1.0/3.0);\n const vec4 D = vec4(0.0, 0.5, 1.0, 2.0);\n vec3 i = floor(v + dot(v, C.yyy) );\n vec3 x0 = v - i + dot(i, C.xxx) ;\n vec3 g = step(x0.yzx, x0.xyz);\n vec3 l = 1.0 - g;\n vec3 i1 = min( g.xyz, l.zxy );\n vec3 i2 = max( g.xyz, l.zxy );\n vec3 x1 = x0 - i1 + 1.0 * C.xxx;\n vec3 x2 = x0 - i2 + 2.0 * C.xxx;\n vec3 x3 = x0 - 1.0 + 3.0 * C.xxx;\n i = mod(i, 289.0 ); \n vec4 p = permute( permute( permute( i.z + vec4(0.0, i1.z, i2.z, 1.0 )) + i.y + vec4(0.0, i1.y, i2.y, 1.0 )) + i.x + vec4(0.0, i1.x, i2.x, 1.0 ));\n float n_ = 1.0/7.0;\n vec3 ns = n_ * D.wyz - D.xzx;\n vec4 j = p - 49.0 * floor(p * ns.z *ns.z);\n vec4 x_ = floor(j * ns.z);\n vec4 y_ = floor(j - 7.0 * x_ );\n vec4 x = x_ *ns.x + ns.yyyy;\n vec4 y = y_ *ns.x + ns.yyyy;\n vec4 h = 1.0 - abs(x) - abs(y);\n vec4 b0 = vec4( x.xy, y.xy );\n vec4 b1 = vec4( x.zw, y.zw );\n vec4 s0 = floor(b0)*2.0 + 1.0;\n vec4 s1 = floor(b1)*2.0 + 1.0;\n vec4 sh = -step(h, vec4(0.0));\n vec4 a0 = b0.xzyw + s0.xzyw*sh.xxyy ;\n vec4 a1 = b1.xzyw + s1.xzyw*sh.zzww ;\n vec3 p0 = vec3(a0.xy,h.x);\n vec3 p1 = vec3(a0.zw,h.y);\n vec3 p2 = vec3(a1.xy,h.z);\n vec3 p3 = vec3(a1.zw,h.w);\n vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3)));\n p0 *= norm.x; p1 *= norm.y; p2 *= norm.z; p3 *= norm.w;\n vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0);\n m = m * m;\n return 42.0 * dot( m*m, vec4( dot(p0,x0), dot(p1,x1), dot(p2,x2), dot(p3,x3) ) );\n }\n\n void main() {\n vec3 pos = position;\n float time = uTime * uSpeed;\n \n float angle = pos.y * uTwist;\n mat2 rot = mat2(cos(angle), -sin(angle), sin(angle), cos(angle));\n pos.xz *= rot;\n\n vec3 normal = normalize(pos);\n float noise = snoise(pos * uNoiseScale + time);\n \n float totalDisplacement = (noise * uSpike) + uPulse;\n pos += normal * totalDisplacement;\n \n vDisplacement = totalDisplacement;\n\n vec4 mvPosition = modelViewMatrix * vec4(pos, 1.0);\n \n gl_PointSize = (15.0 + totalDisplacement * 20.0) * (1.0 / -mvPosition.z);\n gl_PointSize *= (1.0 + sin(uTime * 5.0 + aRandom * 50.0) * 0.2);\n\n gl_Position = projectionMatrix * mvPosition;\n }\n `;\n }\n\n /**\n * Fragment shader\n */\n private _getFragmentShader(): string {\n return `\n varying float vDisplacement;\n uniform vec3 uColorBase; \n uniform vec3 uColorPeak;\n\n void main() {\n float dist = distance(gl_PointCoord, vec2(0.5));\n if (dist > 0.5) discard;\n float alpha = 1.0 - pow(dist * 2.0, 2.0);\n \n float mixValue = smoothstep(-0.2, 0.5, vDisplacement);\n vec3 finalColor = mix(uColorBase, uColorPeak, mixValue);\n\n gl_FragColor = vec4(finalColor, alpha * 0.9);\n }\n `;\n }\n}\n","import { Component, EventEmitter, inject, OnDestroy, OnInit, Output } from '@angular/core';\nimport { throttleTime } from 'rxjs';\nimport { SubSink } from 'subsink';\nimport { OrbComponent } from './components/orb-component/orb-component';\nimport { AudioService } from './services/audio/audio-service';\nimport { BridgeService } from './services/bridge/bridge-service';\nimport { ConfigService } from './services/config/config-service';\nimport { EventService } from './services/event/event-service';\nimport {\n RecordingEvent,\n SilenceEvent,\n SpeechEvent,\n WakeWordEvent,\n} from './services/event/event-service.type';\nimport { PlatformService } from './services/platform/platform-service';\n\n@Component({\n selector: 'wakeywakey',\n imports: [OrbComponent],\n template: '<app-orb-component (orbClick)=\"fireWakeWord()\" />',\n providers: [],\n})\nexport class WakeyWakeyComponent implements OnInit, OnDestroy {\n /**\n * Fires when library loaded. Emits bridge service event\n */\n @Output() ready = new EventEmitter<BridgeService>();\n\n /**\n * Fires when there is an error\n */\n @Output() exception = new EventEmitter<Error>();\n\n /**\n * Fires when speech is detected\n */\n @Output() speech = new EventEmitter<SpeechEvent>();\n\n /**\n * Fires when wake word is detected\n */\n @Output() wakeword = new EventEmitter<WakeWordEvent>();\n\n /**\n * Fires when recording starts (after wake word detection)\n */\n @Output() recording = new EventEmitter<RecordingEvent>();\n\n /**\n * Fires silence is detected\n */\n @Output() silence = new EventEmitter<SilenceEvent>();\n\n /**\n * Dependencies\n */\n private readonly _config = inject(ConfigService);\n\n /**\n * Dependencies\n */\n private readonly _platform = inject(PlatformService);\n private readonly _event = inject(EventService);\n private readonly _audio = inject(AudioService);\n private readonly _bridge = inject(BridgeService);\n\n /**\n * Subscriptions\n */\n private readonly _subs = new SubSink();\n\n ngOnInit(): void {\n // Execute pipeline\n this._execute();\n }\n\n /**\n * Fire face wakeword event\n */\n fireWakeWord() {\n this._event.wakeword.next({\n inferenceScore: 1,\n chunk: [],\n vadScore: 1,\n hasVoiceActivity: false,\n sample: new Float32Array(),\n rms: 0,\n db: 0,\n dbNormalized: 0,\n });\n }\n\n ngOnDestroy(): void {\n this._subs.unsubscribe();\n }\n\n /**\n * Execute\n */\n private async _execute() {\n // Check if browser\n if (this._platform.isServer) return;\n\n // Listen events\n this._listenEvents();\n\n // Init audio\n await this._audio.init();\n }\n\n /**\n * Listen events\n */\n private _listenEvents() {\n // Ready event\n this._subs.sink = this._event.ready.subscribe(() => {\n this.ready.emit(this._bridge);\n });\n\n // Exception event\n this._subs.sink = this._event.exception.subscribe((e) => {\n this.exception.emit(e);\n });\n\n // Speech event\n this._subs.sink = this._event.speech.subscribe((e) => {\n this.speech.emit(e);\n });\n\n // Wake word event\n this._subs.sink = this._event.wakeword\n .pipe(throttleTime(this._config.throttleTime))\n .subscribe((e) => {\n this.wakeword.emit(e);\n });\n\n // Recording event\n this._subs.sink = this._event.recording.subscribe((e) => {\n this.recording.emit(e);\n });\n\n // Silence event\n this._subs.sink = this._event.silence.subscribe((e) => {\n this.silence.emit(e);\n });\n }\n}\n","import { inject, provideAppInitializer } from '@angular/core';\nimport { env, InferenceSession } from 'onnxruntime-web';\nimport { OrbComponentService } from './lib/components/orb-component/orb-component-service';\nimport { AudioService } from './lib/services/audio/audio-service';\nimport { MicrophoneService } from './lib/services/audio/microphone-service/microphone-service';\nimport { SpeakerService } from './lib/services/audio/speaker-service/speaker-service';\nimport { SpeechRecognitionService } from './lib/services/audio/speech-recognition/speech-recognition-service';\nimport { VadService } from './lib/services/audio/vad-service/vad-service';\nimport { BridgeService } from './lib/services/bridge/bridge-service';\nimport { ConfigService } from './lib/services/config/config-service';\nimport { CONFIG, Config } from './lib/services/config/config-service.type';\nimport { EventService } from './lib/services/event/event-service';\nimport { ModelService } from './lib/services/model/model-service';\nimport { PipelineService } from './lib/services/pipeline/pipeline-service';\nimport { PlatformService } from './lib/services/platform/platform-service';\n\n/**\n * Provide wakey wakey configuration\n *\n * @param config Wakey Wakey configuration\n * @returns\n */\nexport function provideWakeyWakey(config: Config) {\n return [\n {\n provide: CONFIG,\n useValue: config,\n },\n ConfigService,\n MicrophoneService,\n SpeakerService,\n VadService,\n AudioService,\n PlatformService,\n EventService,\n PipelineService,\n SpeechRecognitionService,\n ModelService,\n BridgeService,\n OrbComponentService,\n provideAppInitializer(async () => {\n const _config = inject(ConfigService);\n const _model = inject(ModelService);\n const _platform = inject(PlatformService);\n const _mic = inject(MicrophoneService);\n\n if (_platform.isServer) return;\n\n // Set wasm path\n env.wasm.wasmPaths = _config.onnx.runtimePath ?? `${_config.basePath}/wasm/`;\n\n const modelPath: string[] = [\n _config.onnx.model.melspectrogram ?? `${_config.basePath}/models/melspectrogram.onnx`,\n _config.onnx.model.embedding_model ?? `${_config.basePath}/models/embedding_model.onnx`,\n _config.onnx.model.silero_vad ?? `${_config.basePath}/models/silero_vad_v4.onnx`,\n _config.onnx.model.wakeword,\n ];\n\n // Create sessions\n const sessions = await Promise.all([\n ...Object.values(modelPath).map((path) =>\n InferenceSession.create(path, { executionProviders: ['wasm'] }),\n ),\n _mic.init(),\n ]);\n\n if (!sessions[4]) throw new Error('Failed to initialize mic!');\n\n // set sessions\n _model.session = {\n melspectrogram: sessions[0] as InferenceSession,\n embedding_model: sessions[1] as InferenceSession,\n silero_vad: sessions[2] as InferenceSession,\n wakeword: sessions[3] as InferenceSession,\n };\n }),\n ];\n}\n","/// <reference path=\"./index.d.ts\" />\n\n/*\n * Public API Surface of wakeywakey\n */\nexport * from './lib/services';\nexport * from './lib/wakeywakey-component';\nexport * from './provider';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/index.d.ts
CHANGED
|
@@ -39,7 +39,7 @@ interface OrbConfig {
|
|
|
39
39
|
*/
|
|
40
40
|
mode?: 'auto' | 'manual';
|
|
41
41
|
}
|
|
42
|
-
type AgentState = 'idle' | 'listening' | 'thinking' | 'speaking';
|
|
42
|
+
type AgentState = 'idle' | 'initialized' | 'listening' | 'thinking' | 'speaking';
|
|
43
43
|
|
|
44
44
|
declare class OrbComponentService {
|
|
45
45
|
readonly state: Subject<AgentState>;
|
|
@@ -217,7 +217,7 @@ declare class MicrophoneService implements OnDestroy {
|
|
|
217
217
|
*/
|
|
218
218
|
private _monitor;
|
|
219
219
|
/**
|
|
220
|
-
*
|
|
220
|
+
* Microphones
|
|
221
221
|
*/
|
|
222
222
|
private _microphoneList;
|
|
223
223
|
/**
|
|
@@ -241,9 +241,22 @@ declare class SpeakerService implements OnDestroy {
|
|
|
241
241
|
private readonly _subs;
|
|
242
242
|
private _upSound;
|
|
243
243
|
private _downSound;
|
|
244
|
+
private _pingSound;
|
|
244
245
|
private _nextPlayTime;
|
|
245
246
|
private _sources;
|
|
247
|
+
/**
|
|
248
|
+
* List of available microphones
|
|
249
|
+
*/
|
|
250
|
+
private _speakers;
|
|
246
251
|
constructor();
|
|
252
|
+
/**
|
|
253
|
+
* List of speakers
|
|
254
|
+
*/
|
|
255
|
+
get speakers(): MediaDeviceInfo[];
|
|
256
|
+
/**
|
|
257
|
+
* Set output source
|
|
258
|
+
*/
|
|
259
|
+
set source(deviceId: string);
|
|
247
260
|
ngOnDestroy(): void;
|
|
248
261
|
/**
|
|
249
262
|
* Play audio chunk
|
|
@@ -266,6 +279,16 @@ declare class SpeakerService implements OnDestroy {
|
|
|
266
279
|
* Play off sound
|
|
267
280
|
*/
|
|
268
281
|
playDown(): void;
|
|
282
|
+
/**
|
|
283
|
+
* Play ping
|
|
284
|
+
*/
|
|
285
|
+
playPing(): void;
|
|
286
|
+
/**
|
|
287
|
+
* Set source
|
|
288
|
+
*
|
|
289
|
+
* @param deviceId
|
|
290
|
+
*/
|
|
291
|
+
private _setSource;
|
|
269
292
|
/**
|
|
270
293
|
* Clear playback queue
|
|
271
294
|
*/
|
|
@@ -274,6 +297,10 @@ declare class SpeakerService implements OnDestroy {
|
|
|
274
297
|
* Load subscriptions
|
|
275
298
|
*/
|
|
276
299
|
private _loadSubscriptions;
|
|
300
|
+
/**
|
|
301
|
+
* Speakers
|
|
302
|
+
*/
|
|
303
|
+
private _speakerList;
|
|
277
304
|
static ɵfac: i0.ɵɵFactoryDeclaration<SpeakerService, never>;
|
|
278
305
|
static ɵprov: i0.ɵɵInjectableDeclaration<SpeakerService>;
|
|
279
306
|
}
|
|
@@ -284,6 +311,7 @@ declare class SpeechRecognitionService implements OnDestroy {
|
|
|
284
311
|
*/
|
|
285
312
|
private readonly _event;
|
|
286
313
|
private readonly _platform;
|
|
314
|
+
private readonly _mic;
|
|
287
315
|
private _recognitionClass;
|
|
288
316
|
/**
|
|
289
317
|
* Instance
|
|
@@ -681,6 +709,10 @@ interface AudioConfig {
|
|
|
681
709
|
* Default: true
|
|
682
710
|
*/
|
|
683
711
|
enable?: boolean;
|
|
712
|
+
/**
|
|
713
|
+
* Overall volume (0-1)
|
|
714
|
+
*/
|
|
715
|
+
masterVolume?: number;
|
|
684
716
|
/**
|
|
685
717
|
* Path of sound to be played when wake word is detected
|
|
686
718
|
*
|
|
@@ -688,11 +720,37 @@ interface AudioConfig {
|
|
|
688
720
|
*/
|
|
689
721
|
up?: string;
|
|
690
722
|
/**
|
|
691
|
-
*
|
|
723
|
+
* Up volume (0-1)
|
|
724
|
+
*
|
|
725
|
+
* Default: masterVolume (if defined) else 0.5
|
|
726
|
+
*/
|
|
727
|
+
upVolume?: number;
|
|
728
|
+
/**
|
|
729
|
+
* Path of sound to be played when
|
|
730
|
+
* 1. DEFAULT | PTT: system is done recording and silence is detected
|
|
731
|
+
* 2. VOICE_CHAT: user clicks on orb to stop listening
|
|
692
732
|
*
|
|
693
733
|
* Default: [basePath]/sounds/down.mp3
|
|
694
734
|
*/
|
|
695
735
|
down?: string;
|
|
736
|
+
/**
|
|
737
|
+
* Down volume (0-1)
|
|
738
|
+
*
|
|
739
|
+
* Default: masterVolume (if defined) else 0.5
|
|
740
|
+
*/
|
|
741
|
+
downVolume?: number;
|
|
742
|
+
/**
|
|
743
|
+
* Path of sound to be played when system is done recording and silence is detected (in case of VOICE_CHAT)
|
|
744
|
+
*
|
|
745
|
+
* Default: [basePath]/sounds/ping.mp3
|
|
746
|
+
*/
|
|
747
|
+
ping?: string;
|
|
748
|
+
/**
|
|
749
|
+
* Ping volume (0-1)
|
|
750
|
+
*
|
|
751
|
+
* Default: masterVolume (if defined) else 0.1
|
|
752
|
+
*/
|
|
753
|
+
pingVolume?: number;
|
|
696
754
|
};
|
|
697
755
|
}
|
|
698
756
|
|