brilliantsole 0.0.27 → 0.0.29

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.
Files changed (202) hide show
  1. package/assets/3d/anchor.glb +0 -0
  2. package/assets/3d/coin.glb +0 -0
  3. package/assets/3d/glasses.glb +0 -0
  4. package/assets/audio/bounceMedium.wav +0 -0
  5. package/assets/audio/bounceStrong.wav +0 -0
  6. package/assets/audio/bounceWeak.wav +0 -0
  7. package/assets/audio/coin.wav +0 -0
  8. package/assets/audio/getUp.wav +0 -0
  9. package/assets/audio/grab.wav +0 -0
  10. package/assets/audio/kick.wav +0 -0
  11. package/assets/audio/platterFadeIn old.wav +0 -0
  12. package/assets/audio/platterFadeIn.wav +0 -0
  13. package/assets/audio/platterFadeOut.wav +0 -0
  14. package/assets/audio/punch.wav +0 -0
  15. package/assets/audio/punchSqueak.wav +0 -0
  16. package/assets/audio/purr.wav +0 -0
  17. package/assets/audio/purrFadeOut.wav +0 -0
  18. package/assets/audio/release.wav +0 -0
  19. package/assets/audio/splat.wav +0 -0
  20. package/assets/audio/stomp.wav +0 -0
  21. package/build/brilliantsole.cjs +3091 -741
  22. package/build/brilliantsole.cjs.map +1 -1
  23. package/build/brilliantsole.js +2759 -709
  24. package/build/brilliantsole.js.map +1 -1
  25. package/build/brilliantsole.ls.js +2602 -543
  26. package/build/brilliantsole.ls.js.map +1 -1
  27. package/build/brilliantsole.min.js +1 -1
  28. package/build/brilliantsole.min.js.map +1 -1
  29. package/build/brilliantsole.module.d.ts +295 -65
  30. package/build/brilliantsole.module.js +2749 -710
  31. package/build/brilliantsole.module.js.map +1 -1
  32. package/build/brilliantsole.module.min.d.ts +295 -65
  33. package/build/brilliantsole.module.min.js +1 -1
  34. package/build/brilliantsole.module.min.js.map +1 -1
  35. package/build/brilliantsole.node.module.d.ts +289 -62
  36. package/build/brilliantsole.node.module.js +3080 -742
  37. package/build/brilliantsole.node.module.js.map +1 -1
  38. package/build/dts/BS-output.d.ts +10 -0
  39. package/build/dts/BS.d.ts +21 -8
  40. package/build/dts/CameraManager.d.ts +72 -0
  41. package/build/dts/Device.d.ts +64 -13
  42. package/build/dts/DeviceInformationManager.d.ts +4 -4
  43. package/build/dts/DeviceManager.d.ts +2 -0
  44. package/build/dts/FileTransferManager.d.ts +18 -8
  45. package/build/dts/InformationManager.d.ts +2 -0
  46. package/build/dts/MicrophoneManager.d.ts +88 -0
  47. package/build/dts/TfliteManager.d.ts +22 -2
  48. package/build/dts/WifiManager.d.ts +61 -0
  49. package/build/dts/connection/BaseConnectionManager.d.ts +35 -3
  50. package/build/dts/connection/ClientConnectionManager.d.ts +7 -2
  51. package/build/dts/connection/bluetooth/NobleConnectionManager.d.ts +2 -1
  52. package/build/dts/connection/bluetooth/WebBluetoothConnectionManager.d.ts +1 -0
  53. package/build/dts/connection/bluetooth/bluetoothUUIDs.d.ts +2 -2
  54. package/build/dts/connection/udp/UDPConnectionManager.d.ts +28 -0
  55. package/build/dts/connection/webSocket/WebSocketConnectionManager.d.ts +25 -0
  56. package/build/dts/devicePair/DevicePair.d.ts +5 -5
  57. package/build/dts/scanner/BaseScanner.d.ts +4 -1
  58. package/build/dts/scanner/NobleScanner.d.ts +2 -1
  59. package/build/dts/sensor/MotionSensorDataManager.d.ts +5 -2
  60. package/build/dts/sensor/SensorDataManager.d.ts +5 -4
  61. package/build/dts/server/BaseClient.d.ts +5 -3
  62. package/build/dts/server/ServerUtils.d.ts +1 -1
  63. package/build/dts/server/websocket/WebSocketUtils.d.ts +1 -1
  64. package/build/dts/utils/AudioUtils.d.ts +2 -0
  65. package/build/dts/utils/Console.d.ts +2 -0
  66. package/build/dts/utils/ThrottleUtils.d.ts +2 -0
  67. package/build/dts/vibration/VibrationManager.d.ts +19 -2
  68. package/build/index.d.ts +292 -62
  69. package/build/index.node.d.ts +286 -59
  70. package/examples/3d/scene.html +19 -5
  71. package/examples/3d-generic/index.html +144 -0
  72. package/examples/3d-generic/script.js +266 -0
  73. package/examples/basic/index.html +267 -17
  74. package/examples/basic/script.js +958 -105
  75. package/examples/camera/barcode-detector.js +109 -0
  76. package/examples/camera/depth-estimation.js +71 -0
  77. package/examples/camera/face-detector.js +119 -0
  78. package/examples/camera/face-landmark.js +111 -0
  79. package/examples/camera/gesture-recognition.js +97 -0
  80. package/examples/camera/hand-landmark.js +74 -0
  81. package/examples/camera/image-segmentation.js +98 -0
  82. package/examples/camera/image-to-text.js +43 -0
  83. package/examples/camera/image-upscale.js +75 -0
  84. package/examples/camera/index.html +129 -0
  85. package/examples/camera/object-detection.js +98 -0
  86. package/examples/camera/pose-landmark.js +60 -0
  87. package/examples/camera/script.js +316 -0
  88. package/examples/camera/utils.js +165 -0
  89. package/examples/camera/yolo-tiny.js +54 -0
  90. package/examples/camera/yolo.js +119 -0
  91. package/examples/edge-impulse/script.js +157 -48
  92. package/examples/edge-impulse-test/README.md +11 -0
  93. package/examples/edge-impulse-test/edge-impulse-standalone.js +7228 -0
  94. package/examples/edge-impulse-test/edge-impulse-standalone.wasm +0 -0
  95. package/examples/edge-impulse-test/index.html +75 -0
  96. package/examples/edge-impulse-test/run-impulse.js +135 -0
  97. package/examples/edge-impulse-test/script.js +200 -0
  98. package/examples/glasses-gestures/README.md +11 -0
  99. package/examples/glasses-gestures/edge-impulse-standalone.js +7228 -0
  100. package/examples/glasses-gestures/edge-impulse-standalone.wasm +0 -0
  101. package/examples/glasses-gestures/index.html +69 -0
  102. package/examples/glasses-gestures/run-impulse.js +135 -0
  103. package/examples/glasses-gestures/script.js +226 -0
  104. package/examples/gloves/edge-impulse-standalone.js +7228 -0
  105. package/examples/gloves/edge-impulse-standalone.wasm +0 -0
  106. package/examples/gloves/index.html +4 -1
  107. package/examples/gloves/run-impulse.js +135 -0
  108. package/examples/gloves/script.js +367 -51
  109. package/examples/graph/script.js +94 -37
  110. package/examples/microphone/gender.js +54 -0
  111. package/examples/microphone/index.html +102 -0
  112. package/examples/microphone/script.js +394 -0
  113. package/examples/microphone/utils.js +45 -0
  114. package/examples/microphone/whisper-realtime.js +166 -0
  115. package/examples/microphone/whisper.js +132 -0
  116. package/examples/punch/index.html +135 -0
  117. package/examples/punch/punch.tflite +0 -0
  118. package/examples/punch/script.js +169 -0
  119. package/examples/server/index.html +98 -22
  120. package/examples/server/script.js +317 -109
  121. package/examples/ukaton-firmware-update/merged-firmware.bin +0 -0
  122. package/examples/utils/aframe/aframe-master.min.js +2 -0
  123. package/examples/utils/aframe/bs-vibration.js +150 -0
  124. package/examples/utils/aframe/force-pushable.js +80 -0
  125. package/examples/utils/aframe/grabbable-anchor.js +46 -0
  126. package/examples/utils/aframe/grabbable-listener.js +31 -0
  127. package/examples/utils/aframe/grabbable-physics-body.js +190 -0
  128. package/examples/utils/aframe/grow-shrink.js +25 -0
  129. package/examples/utils/aframe/hand-punch.js +119 -0
  130. package/examples/utils/aframe/my-obb-collider.js +293 -0
  131. package/examples/utils/aframe/occlude-hand-tracking-controls.js +47 -0
  132. package/examples/utils/aframe/occlude-mesh.js +42 -0
  133. package/examples/utils/aframe/palm-up-detector.js +47 -0
  134. package/examples/utils/aframe/shadow-material.js +20 -0
  135. package/examples/utils/aframe/soft-shadow-light.js +9 -0
  136. package/examples/webxr-2/assets/3d/soccerBall.glb +0 -0
  137. package/examples/webxr-2/assets/audio/shellBounce.wav +0 -0
  138. package/examples/webxr-2/assets/audio/shellHit.wav +0 -0
  139. package/examples/webxr-2/assets/audio/shellKick.wav +0 -0
  140. package/examples/webxr-2/assets/audio/soccerBounce.wav +0 -0
  141. package/examples/webxr-2/assets/audio/soccerKick.mp3 +0 -0
  142. package/examples/webxr-2/assets/images/shellTexture.png +0 -0
  143. package/examples/webxr-2/components/bs-ankle.js +337 -0
  144. package/examples/webxr-2/components/coin.js +84 -0
  145. package/examples/webxr-2/components/custom-wrap.js +17 -0
  146. package/examples/webxr-2/components/goomba.js +3250 -0
  147. package/examples/webxr-2/components/init-shell-material.js +215 -0
  148. package/examples/webxr-2/components/platter.js +172 -0
  149. package/examples/webxr-2/components/shell.js +374 -0
  150. package/examples/webxr-2/components/soccer-ball.js +250 -0
  151. package/examples/webxr-2/components/squashed-goomba.js +249 -0
  152. package/examples/webxr-2/edge-impulse-standalone.js +7228 -0
  153. package/examples/webxr-2/edge-impulse-standalone.wasm +0 -0
  154. package/examples/webxr-2/index.html +996 -0
  155. package/examples/webxr-2/kick.tflite +0 -0
  156. package/examples/webxr-2/kick2.tflite +0 -0
  157. package/examples/webxr-2/run-impulse.js +135 -0
  158. package/examples/webxr-2/script.js +384 -0
  159. package/examples/webxr-3/components/bs-camera.js +65 -0
  160. package/examples/webxr-3/index.html +134 -0
  161. package/examples/webxr-3/script.js +432 -0
  162. package/package.json +2 -1
  163. package/src/.prettierrc +4 -0
  164. package/src/BS.ts +79 -8
  165. package/src/CameraManager.ts +497 -0
  166. package/src/Device.ts +691 -86
  167. package/src/DeviceInformationManager.ts +19 -10
  168. package/src/DeviceManager.ts +85 -25
  169. package/src/FileTransferManager.ts +145 -20
  170. package/src/InformationManager.ts +40 -15
  171. package/src/MicrophoneManager.ts +599 -0
  172. package/src/TfliteManager.ts +171 -25
  173. package/src/WifiManager.ts +323 -0
  174. package/src/connection/BaseConnectionManager.ts +130 -30
  175. package/src/connection/ClientConnectionManager.ts +34 -10
  176. package/src/connection/bluetooth/BluetoothConnectionManager.ts +8 -2
  177. package/src/connection/bluetooth/NobleConnectionManager.ts +147 -41
  178. package/src/connection/bluetooth/WebBluetoothConnectionManager.ts +99 -34
  179. package/src/connection/bluetooth/bluetoothUUIDs.ts +40 -13
  180. package/src/connection/udp/UDPConnectionManager.ts +356 -0
  181. package/src/connection/websocket/WebSocketConnectionManager.ts +282 -0
  182. package/src/devicePair/DevicePair.ts +95 -25
  183. package/src/devicePair/DevicePairPressureSensorDataManager.ts +27 -7
  184. package/src/scanner/BaseScanner.ts +49 -11
  185. package/src/scanner/NobleScanner.ts +76 -14
  186. package/src/sensor/MotionSensorDataManager.ts +21 -6
  187. package/src/sensor/PressureSensorDataManager.ts +37 -8
  188. package/src/sensor/SensorConfigurationManager.ts +73 -22
  189. package/src/sensor/SensorDataManager.ts +109 -23
  190. package/src/server/BaseClient.ts +150 -36
  191. package/src/server/BaseServer.ts +50 -2
  192. package/src/server/ServerUtils.ts +39 -9
  193. package/src/server/udp/UDPServer.ts +73 -22
  194. package/src/server/udp/UDPUtils.ts +9 -2
  195. package/src/server/websocket/WebSocketClient.ts +27 -7
  196. package/src/server/websocket/WebSocketUtils.ts +4 -2
  197. package/src/utils/AudioUtils.ts +65 -0
  198. package/src/utils/Console.ts +62 -9
  199. package/src/utils/ParseUtils.ts +24 -5
  200. package/src/utils/ThrottleUtils.ts +62 -0
  201. package/src/utils/Timer.ts +1 -1
  202. package/src/vibration/VibrationManager.ts +166 -40
@@ -12,7 +12,9 @@ window.device = device;
12
12
  // GET DEVICES
13
13
 
14
14
  /** @type {HTMLTemplateElement} */
15
- const availableDeviceTemplate = document.getElementById("availableDeviceTemplate");
15
+ const availableDeviceTemplate = document.getElementById(
16
+ "availableDeviceTemplate"
17
+ );
16
18
  const availableDevicesContainer = document.getElementById("availableDevices");
17
19
  /** @param {BS.Device[]} availableDevices */
18
20
  function onAvailableDevices(availableDevices) {
@@ -24,19 +26,24 @@ function onAvailableDevices(availableDevices) {
24
26
  const availableDeviceContainer = availableDeviceTemplate.content
25
27
  .cloneNode(true)
26
28
  .querySelector(".availableDevice");
27
- availableDeviceContainer.querySelector(".name").innerText = availableDevice.name;
28
- availableDeviceContainer.querySelector(".type").innerText = availableDevice.type;
29
+ availableDeviceContainer.querySelector(".name").innerText =
30
+ availableDevice.name;
31
+ availableDeviceContainer.querySelector(".type").innerText =
32
+ availableDevice.type;
29
33
 
30
34
  /** @type {HTMLButtonElement} */
31
- const toggleConnectionButton = availableDeviceContainer.querySelector(".toggleConnection");
35
+ const toggleConnectionButton =
36
+ availableDeviceContainer.querySelector(".toggleConnection");
32
37
  toggleConnectionButton.addEventListener("click", () => {
33
38
  device.connectionManager = availableDevice.connectionManager;
34
39
  device.reconnect();
35
40
  });
36
41
  device.addEventListener("connectionStatus", () => {
37
- toggleConnectionButton.disabled = device.connectionStatus != "notConnected";
42
+ toggleConnectionButton.disabled =
43
+ device.connectionStatus != "notConnected";
38
44
  });
39
- toggleConnectionButton.disabled = device.connectionStatus != "notConnected";
45
+ toggleConnectionButton.disabled =
46
+ device.connectionStatus != "notConnected";
40
47
 
41
48
  availableDevicesContainer.appendChild(availableDeviceContainer);
42
49
  });
@@ -75,7 +82,9 @@ device.addEventListener("connectionStatus", () => {
75
82
  case "connected":
76
83
  case "notConnected":
77
84
  toggleConnectionButton.disabled = false;
78
- toggleConnectionButton.innerText = device.isConnected ? "disconnect" : "connect";
85
+ toggleConnectionButton.innerText = device.isConnected
86
+ ? "disconnect"
87
+ : "connect";
79
88
  break;
80
89
  case "connecting":
81
90
  case "disconnecting":
@@ -99,15 +108,20 @@ function onConnectedDevice(connectedDevice) {
99
108
  // SENSOR CONFIGURATION
100
109
 
101
110
  /** @type {HTMLTemplateElement} */
102
- const sensorTypeConfigurationTemplate = document.getElementById("sensorTypeConfigurationTemplate");
111
+ const sensorTypeConfigurationTemplate = document.getElementById(
112
+ "sensorTypeConfigurationTemplate"
113
+ );
103
114
  BS.ContinuousSensorTypes.forEach((sensorType) => {
104
- const sensorTypeConfigurationContainer = sensorTypeConfigurationTemplate.content
105
- .cloneNode(true)
106
- .querySelector(".sensorTypeConfiguration");
107
- sensorTypeConfigurationContainer.querySelector(".sensorType").innerText = sensorType;
115
+ const sensorTypeConfigurationContainer =
116
+ sensorTypeConfigurationTemplate.content
117
+ .cloneNode(true)
118
+ .querySelector(".sensorTypeConfiguration");
119
+ sensorTypeConfigurationContainer.querySelector(".sensorType").innerText =
120
+ sensorType;
108
121
 
109
122
  /** @type {HTMLInputElement} */
110
- const sensorRateInput = sensorTypeConfigurationContainer.querySelector(".sensorRate");
123
+ const sensorRateInput =
124
+ sensorTypeConfigurationContainer.querySelector(".sensorRate");
111
125
  sensorRateInput.value = 0;
112
126
  sensorRateInput.max = BS.MaxSensorRate;
113
127
  sensorRateInput.step = BS.SensorRateStep;
@@ -117,15 +131,20 @@ BS.ContinuousSensorTypes.forEach((sensorType) => {
117
131
  device.setSensorConfiguration({ [sensorType]: sensorRate });
118
132
  });
119
133
 
120
- sensorTypeConfigurationTemplate.parentElement.appendChild(sensorTypeConfigurationContainer);
134
+ sensorTypeConfigurationTemplate.parentElement.appendChild(
135
+ sensorTypeConfigurationContainer
136
+ );
121
137
  sensorTypeConfigurationContainer.dataset.sensorType = sensorType;
122
138
  });
123
139
  /** @param {BS.Device} device */
124
140
  function onSensorConfiguration(device) {
125
- for (const sensorType in device.sensorConfiguration) {
126
- const sensorRate = device.sensorConfiguration[sensorType];
141
+ BS.SensorTypes.forEach((sensorType) => {
142
+ const sensorRate = device.sensorConfiguration[sensorType] ?? 0;
143
+
127
144
  /** @type {HTMLInputElement?} */
128
- const input = document.querySelector(`.sensorTypeConfiguration[data-sensor-type="${sensorType}"] .input`);
145
+ const input = document.querySelector(
146
+ `.sensorTypeConfiguration[data-sensor-type="${sensorType}"] .input`
147
+ );
129
148
  if (input) {
130
149
  input.value = sensorRate;
131
150
  }
@@ -146,17 +165,21 @@ function onSensorConfiguration(device) {
146
165
  chartContainer.style.display = display;
147
166
  });
148
167
  }
149
- }
168
+ });
150
169
  }
151
170
  /** @param {BS.Device} device */
152
171
  function updateSensorRateInputs(device) {
153
- for (const sensorType in device.sensorConfiguration) {
172
+ BS.SensorTypes.forEach((sensorType) => {
154
173
  /** @type {HTMLInputElement?} */
155
- const input = document.querySelector(`[data-sensor-type="${sensorType}"] .input`);
174
+ const input = document.querySelector(
175
+ `[data-sensor-type="${sensorType}"] .input`
176
+ );
156
177
  if (input) {
157
- input.disabled = !device.isConnected;
178
+ const containsSensorType = sensorType in device.sensorConfiguration;
179
+ input.closest("label").style.display = containsSensorType ? "" : "none";
180
+ input.disabled = !device.isConnected || !containsSensorType;
158
181
  }
159
- }
182
+ });
160
183
  }
161
184
 
162
185
  // GRAPHING
@@ -276,7 +299,9 @@ window.chartContainers = chartContainers;
276
299
  /** @type {HTMLTemplateElement} */
277
300
  const chartTemplate = document.getElementById("chartTemplate");
278
301
  BS.ContinuousSensorTypes.forEach((sensorType) => {
279
- const chartContainer = chartTemplate.content.cloneNode(true).querySelector(".chart");
302
+ const chartContainer = chartTemplate.content
303
+ .cloneNode(true)
304
+ .querySelector(".chart");
280
305
  chartsContainer.appendChild(chartContainer);
281
306
  chartContainers[sensorType] = chartContainer;
282
307
 
@@ -299,6 +324,12 @@ BS.ContinuousSensorTypes.forEach((sensorType) => {
299
324
  case "rotation":
300
325
  axesLabels = ["x", "y", "z", "w"];
301
326
  break;
327
+ case "orientation":
328
+ axesLabels = ["heading", "pitch", "roll"];
329
+ break;
330
+ case "barometer":
331
+ axesLabels = ["barometer"];
332
+ break;
302
333
  default:
303
334
  console.warn(`uncaught sensorType "${sensorType}"`);
304
335
  return;
@@ -323,36 +354,53 @@ BS.ContinuousSensorTypes.forEach((sensorType) => {
323
354
  yRange = { min: -360, max: 360 };
324
355
  break;
325
356
  case "magnetometer":
326
- // FILL
357
+ yRange = { min: -100, max: 100 };
327
358
  break;
328
359
  case "gameRotation":
329
360
  case "rotation":
330
361
  yRange = { min: -1, max: 1 };
331
362
  break;
363
+ case "orientation":
364
+ yRange = { min: -360, max: 360 };
365
+ break;
332
366
  }
333
367
 
334
368
  switch (sensorType) {
335
369
  case "gameRotation":
336
370
  case "rotation":
337
371
  {
338
- const eulerChartContainer = chartTemplate.content.cloneNode(true).querySelector(".chart");
372
+ const eulerChartContainer = chartTemplate.content
373
+ .cloneNode(true)
374
+ .querySelector(".chart");
339
375
  chartsContainer.appendChild(eulerChartContainer);
340
376
  chartContainers[`${sensorType}.euler`] = eulerChartContainer;
341
- createChart(eulerChartContainer.querySelector("canvas"), sensorType + "Euler", ["yaw", "pitch", "roll"], {
342
- min: -Math.PI,
343
- max: Math.PI,
344
- });
377
+ createChart(
378
+ eulerChartContainer.querySelector("canvas"),
379
+ sensorType + "Euler",
380
+ ["yaw", "pitch", "roll"],
381
+ {
382
+ min: -Math.PI,
383
+ max: Math.PI,
384
+ }
385
+ );
345
386
  }
346
387
  break;
347
388
  case "pressure":
348
389
  {
349
- const pressureMetadataChartContainer = chartTemplate.content.cloneNode(true).querySelector(".chart");
390
+ const pressureMetadataChartContainer = chartTemplate.content
391
+ .cloneNode(true)
392
+ .querySelector(".chart");
350
393
  chartsContainer.appendChild(pressureMetadataChartContainer);
351
394
  chartContainers["pressureMetadata"] = pressureMetadataChartContainer;
352
- createChart(pressureMetadataChartContainer.querySelector("canvas"), "pressureMetadata", ["sum", "x", "y"], {
353
- min: 0,
354
- max: 1,
355
- });
395
+ createChart(
396
+ pressureMetadataChartContainer.querySelector("canvas"),
397
+ "pressureMetadata",
398
+ ["sum", "x", "y"],
399
+ {
400
+ min: 0,
401
+ max: 1,
402
+ }
403
+ );
356
404
  }
357
405
  break;
358
406
  }
@@ -361,7 +409,12 @@ BS.ContinuousSensorTypes.forEach((sensorType) => {
361
409
  const euler = new THREE.Euler();
362
410
  euler.reorder("YXZ");
363
411
 
364
- createChart(chartContainer.querySelector("canvas"), sensorType, axesLabels, yRange);
412
+ createChart(
413
+ chartContainer.querySelector("canvas"),
414
+ sensorType,
415
+ axesLabels,
416
+ yRange
417
+ );
365
418
  });
366
419
 
367
420
  /** @param {BS.Device} device */
@@ -437,12 +490,16 @@ if (false)
437
490
 
438
491
  const websocketClient = new BS.WebSocketClient();
439
492
  /** @type {HTMLButtonElement} */
440
- const toggleServerConnectionButton = document.getElementById("toggleServerConnection");
493
+ const toggleServerConnectionButton = document.getElementById(
494
+ "toggleServerConnection"
495
+ );
441
496
  toggleServerConnectionButton.addEventListener("click", () => {
442
497
  websocketClient.toggleConnection();
443
498
  });
444
499
  websocketClient.addEventListener("isConnected", () => {
445
- toggleServerConnectionButton.innerText = websocketClient.isConnected ? "disconnect from server" : "connect to server";
500
+ toggleServerConnectionButton.innerText = websocketClient.isConnected
501
+ ? "disconnect from server"
502
+ : "connect to server";
446
503
  });
447
504
  websocketClient.addEventListener("connectionStatus", () => {
448
505
  let disabled;
@@ -0,0 +1,54 @@
1
+ import { pipeline } from "https://cdn.jsdelivr.net/npm/@huggingface/transformers@3.2.4";
2
+
3
+ import { registerModel } from "./utils.js";
4
+
5
+ let classifier = undefined;
6
+ let isRunning = false;
7
+
8
+ const createClassifier = async () => {
9
+ console.log("creating classifier");
10
+ classifier = await pipeline(
11
+ "audio-classification",
12
+ "Xenova/wav2vec2-large-xlsr-53-gender-recognition-librispeech"
13
+ );
14
+ console.log("created classifier", classifier);
15
+ };
16
+
17
+ registerModel(
18
+ "gender",
19
+ () => {
20
+ if (!classifier) {
21
+ createClassifier();
22
+ }
23
+ },
24
+ () => {},
25
+ async (microphoneRecordingAudio, mediaResultsElement) => {
26
+ if (!classifier) {
27
+ console.error("classifier not created yet");
28
+ return;
29
+ }
30
+ if (isRunning) {
31
+ return;
32
+ }
33
+ isRunning = true;
34
+ const output = await classifier(microphoneRecordingAudio.src);
35
+ isRunning = false;
36
+
37
+ console.log("output", output);
38
+ let maxLabel, maxScore;
39
+ output.forEach(({ label, score }) => {
40
+ maxLabel ??= label;
41
+ maxScore ??= score;
42
+ if (score > maxScore) {
43
+ maxScore = score;
44
+ maxLabel = label;
45
+ }
46
+ });
47
+ mediaResultsElement.innerText = `${maxLabel}: ${maxScore.toFixed(3)}`;
48
+ }
49
+ );
50
+
51
+ const sampleOutput = [
52
+ { label: "male", score: 0.9976564049720764 },
53
+ { label: "female", score: 0.002343568252399564 },
54
+ ];
@@ -0,0 +1,102 @@
1
+ <html>
2
+ <head>
3
+ <title>Microphone | BrilliantSole JavaScript SDK</title>
4
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
5
+ <link rel="shortcut icon" type="image/x-icon" href="/favicon.ico" />
6
+ <script src="https://unpkg.com/peaks.js/dist/peaks.js"></script>
7
+ <script type="module" src="./script.js"></script>
8
+ <script type="module" src="./whisper.js"></script>
9
+ <script type="module" src="./whisper-realtime.js"></script>
10
+ <script type="module" src="./gender.js"></script>
11
+ </head>
12
+ <style>
13
+ #zoomview-container,
14
+ #overview-container {
15
+ width: 1000px;
16
+ height: 100px;
17
+ }
18
+ .highlighted {
19
+ color: green;
20
+ }
21
+ </style>
22
+ <body>
23
+ <nav>
24
+ <a href="../../">home</a>
25
+ </nav>
26
+
27
+ <h1>Microphone | BrilliantSole JavaScript SDK</h1>
28
+
29
+ <button id="toggleConnection">connect</button>
30
+ <label>
31
+ model type
32
+ <select id="modelType">
33
+ <optgroup label="model type">
34
+ <option>none</option>
35
+ </optgroup>
36
+ </select>
37
+ </label>
38
+ <br />
39
+
40
+ <label><b>status:</b> <span id="microphoneStatus"></span></label>
41
+
42
+ <button disabled hidden id="toggleMicrophone">start microphone</button>
43
+ <button disabled id="startMicrophone">start microphone</button>
44
+ <button disabled id="stopMicrophone">stop microphone</button>
45
+ <button disabled id="enableMicrphoneVad">
46
+ enable microphone voice activity detection
47
+ </button>
48
+ <br />
49
+ <button disabled id="toggleMicrophoneRecording">start recording</button>
50
+
51
+ <br />
52
+ <label>
53
+ <b>microphone configuration: </b>
54
+ <pre id="microphoneConfigurationPre"></pre>
55
+ </label>
56
+ <br />
57
+
58
+ <div id="microphoneConfiguration">
59
+ <template id="microphoneConfigurationTypeTemplate">
60
+ <label class="microphoneConfigurationType">
61
+ <b class="type"></b> <span hidden></span>
62
+ <select disabled>
63
+ <optgroup></optgroup>
64
+ </select>
65
+ </label>
66
+ </template>
67
+ </div>
68
+
69
+ <div>
70
+ <b>stream</b>
71
+ <br />
72
+ <audio id="microphoneStream" controls autoplay></audio>
73
+ </div>
74
+
75
+ <label>
76
+ visualization type
77
+ <select id="audioVisualizationType">
78
+ <optgroup label="type">
79
+ <option>waveform</option>
80
+ <option>fft</option>
81
+ </optgroup>
82
+ </select>
83
+ </label>
84
+ <br />
85
+ <canvas id="audioVisualizer" width="1000" height="200"></canvas>
86
+
87
+ <h1 id="modelResults"></h1>
88
+
89
+ <div>
90
+ <b>recording</b>
91
+ <label>
92
+ auto play
93
+ <input type="checkbox" id="autoPlayMicrphoneRecording" />
94
+ </label>
95
+ <br />
96
+ <audio id="microphoneRecording" controls></audio>
97
+ </div>
98
+
99
+ <div id="zoomview-container"></div>
100
+ <div id="overview-container"></div>
101
+ </body>
102
+ </html>