Fingerprint Pro Internals
Collector s52

Speech voices

the installed speech synthesis voice list, hashed

Group: Audio and speech · signal map · run it live

// s52 — sig_s52_origin
// module cm, stage2, codes 1 0 -1 -2, value is a digest
//
// measures
//   window.origin window.AudioBuffer window.PushManager window.ServiceWorker navigator.geolocation
//   window.RTCPeerConnection navigator.vendor.indexOf("Apple") window.ApplePayError window.Counter
//   window.CSSPrimitiveValue window.RGBColor window.WebKitMediaKeys
// engine
//   Array.isArray() ArrayBuffer JSON.stringify() Uint32Array Uint8Array Promise undefined
// reported value
//   call null value
// probes
//   "," "0" "1" "\\$1" "function" "voiceschanged"
// compares against
//   != "function" === 0 === 548031109 > 127 >= 3 >= 4 in "ApplePayError" in "AudioBuffer"
//   in "CSSMozDocumentRule" in "CSSPrimitiveValue" in "CanvasCaptureMediaStream" in "Counter"
//   in "MozAppearance" in "PushManager" in "RGBColor" in "RTCPeerConnection" in "ServiceWorker"
//   in "WebKitMediaKeys" in "buildID" in "geolocation" in "mozInnerScreenX"
//   in "onmozfullscreenchange"
// decides on
//   fn161: typeof speechSynthesis?.getVoices != "function"
//   fn161: !arg931.tts
//   fn161: fn25()
//   fn161: function (arg934) { return !arg934.addEventListener || fn46() && fn140() || fn25() && fn48(window.origin ?? "") === 548031109; }(arg933)
//   fn161: !arg934.addEventListener || fn46() && fn140() || fn25() && fn48(window.origin ?? "") === 548031109
//   fn161: Array.isArray(v1058) && v1058.length
//   fn161: !(v1055 == null)
//   fn161: !v1055
//   fn25: fn9(["ApplePayError" in window, "CSSPrimitiveValue" in window, "Counter" in window, navigator.vendor.indexOf("Apple") === 0, "RGBColor" in window, "WebKitMediaK…
//   fn46: fn9(["buildID" in navigator, "MozAppearance" in (document.documentElement?.style ?? {}), "onmozfullscreenchange" in window, "mozInnerScreenX" in window, "CSSMoz…
//   fn140: fn36([!("PushManager" in window), !("AudioBuffer" in window), !("RTCPeerConnection" in window), !("geolocation" in navigator), !("ServiceWorker" in window)]) >=…
//   fn158: Date.now() < v1036
//   visibilitychange: !(v869 || v868)
//   visibilitychange: !v869 && v868
//   hash128: v422 > 127
//   hash128: ("00000000" + (v415[0] >>> 0).toString(16)).slice(-8) + ("00000000" + (v415[1] >>> 0).toString(16)).slice(-8) + ("00000000" + (v416[0] >>> 0).toString(16)).slic…
//
// 1 owned helper inlined below.
// shared with other collectors, see agent.clean.js:
//   asUint8Array:6496 crc32OfBytes:4943 fn140:7174 fn158:8266 fn161:8448 fn166:8783 fn25:712
//   fn36:1793 fn46:3216 fn48:3370 fn53:3506 fn65:3849 fn81:4410 fn9:252 fn91:4777 fn93:5043
//   fn96:5398 hash128:2674 stringToBytes:7901 v3:446 v4:447 v5:461 v6:462 v7:463 v8:464 v9:465
//   visibilitychange:6423

// agent.clean.js:6821
function sig_s52_origin(arg782) {
  return fn161(arg782, h_s52_fn);
}

// agent.clean.js:7125
function h_s52_fn(arg813) {
  const v949 = (arg814) => (arg814 ? arg814.replace(/([,\\])/g, "\\$1") : ""),
    v950 = arg813
      .map((arg815) =>
        [
          v949(arg815?.voiceURI),
          v949(arg815?.name),
          v949(arg815?.lang),
          arg815?.localService ? "1" : "0",
          arg815?.default ? "1" : "0",
        ].join(","),
      )
      .sort();
  return { s: arg813.length ? 0 : 1, v: hash128(JSON.stringify(v950)) };
}