您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Disables WebRTC audio processing to allow raw mic input.
// ==UserScript== // @name Raw Mic Input // @namespace https://files.6942020.xyz/ // @version 1.3 // @description Disables WebRTC audio processing to allow raw mic input. // @author Joey Watts // @author WadeGrimridge // @match *://*/* // @grant none // @license MIT // ==/UserScript== (function() { function setLegacyChromeConstraint(constraint, name, value) { if (constraint.mandatory && name in constraint.mandatory) { constraint.mandatory[name] = value; return; } if (constraint.optional) { const element = constraint.optional.find(opt => name in opt); if (element) { element[name] = value; return; } } if (!constraint.optional) { constraint.optional = []; } constraint.optional.push({ [name]: value }); } function setConstraint(constraint, name, value) { if (constraint.advanced) { const element = constraint.advanced.find(opt => name in opt); if (element) { element[name] = value; return; } } constraint[name] = value; } function disableAutogain(constraints) { console.log("Enabling raw mic input.", constraints); if (constraints && constraints.audio) { if (typeof constraints.audio !== "object") { constraints.audio = {}; } if (constraints.audio.optional || constraints.audio.mandatory) { setLegacyChromeConstraint(constraints.audio, "echoCancellation", false); setLegacyChromeConstraint(constraints.audio, "googAutoGainControl", false); setLegacyChromeConstraint(constraints.audio, "googAutoGainControl2", false); setLegacyChromeConstraint(constraints.audio, "googEchoCancellation", false); setLegacyChromeConstraint(constraints.audio, "googHighpassFilter", false); setLegacyChromeConstraint(constraints.audio, "googNoiseSuppression", false); setLegacyChromeConstraint(constraints.audio, "googTypingNoiseDetection", false); } else { setConstraint(constraints.audio, "autoGainControl", false); setConstraint(constraints.audio, "echoCancellation", false); setConstraint(constraints.audio, "noiseSuppression", false); } } } function patchFunction(object, name, createNewFunction) { if (name in object) { var original = object[name]; object[name] = createNewFunction(original); } } patchFunction(navigator.mediaDevices, "getUserMedia", function (original) { return function getUserMedia(constraints) { disableAutogain(constraints); return original.call(this, constraints); }; }); function patchDeprecatedGetUserMedia(original) { return function getUserMedia(constraints, success, error) { disableAutogain(constraints); return original.call(this, constraints, success, error); }; } patchFunction(navigator, "getUserMedia", patchDeprecatedGetUserMedia); patchFunction(navigator, "mozGetUserMedia", patchDeprecatedGetUserMedia); patchFunction(navigator, "webkitGetUserMedia", patchDeprecatedGetUserMedia); patchFunction(MediaStreamTrack.prototype, "applyConstraints", function (original) { return function applyConstraints(constraints) { disableAutogain(constraints); return original.call(this, constraints); }; }); })();