@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
- * Save microphones
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._upSound.preload = this._downSound.preload = 'auto';
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._clock = new THREE.Clock();
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
- const elapsedTime = this._clock.getElapsedTime();
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._mic.isMuted ? 0 : data.dbNormalized;
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
- let sum = 0;
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
- * Save microphones
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
- * Path of sound to be played when system is done recording and silence is detected
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
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prabhjeet.me/wakeywakey",
3
- "version": "2.0.0",
3
+ "version": "2.2.0",
4
4
  "repository": {
5
5
  "url": "https://github.com/prabhjeet-me/WakeyWakey"
6
6
  },