fix(voice): stabilize deepfilter input and enforce legacy AGC constraints

This commit is contained in:
ServerBob 2026-03-05 08:43:56 +00:00
parent 3cc12c8b48
commit d387d85dac
1 changed files with 18 additions and 0 deletions

View File

@ -139,6 +139,15 @@ const buildMicConstraints = (devices: TDeviceSettings): MediaTrackConstraints =>
legacy.googEchoCancellation = true; legacy.googEchoCancellation = true;
legacy.googAutoGainControl = true; legacy.googAutoGainControl = true;
legacy.googTypingNoiseDetection = true; legacy.googTypingNoiseDetection = true;
} else {
// Chromium variants can still honor legacy goog* constraints.
// Mirror our intended DSP state explicitly to avoid implicit AGC.
const legacy = constraints as unknown as Record<string, unknown>;
legacy.googHighpassFilter = false;
legacy.googNoiseSuppression = !!constraints.noiseSuppression;
legacy.googEchoCancellation = !!constraints.echoCancellation;
legacy.googAutoGainControl = !!constraints.autoGainControl;
legacy.googTypingNoiseDetection = false;
} }
return constraints; return constraints;
@ -410,6 +419,7 @@ const VoiceProvider = memo(({ children }: TVoiceProviderProps) => {
const dest = ctx.createMediaStreamDestination(); const dest = ctx.createMediaStreamDestination();
let current: AudioNode = source; let current: AudioNode = source;
let preGainNode: GainNode | undefined;
let deepFilterNode: AudioWorkletNode | undefined; let deepFilterNode: AudioWorkletNode | undefined;
let deepFilterCore: DeepFilterNet3Core | undefined; let deepFilterCore: DeepFilterNet3Core | undefined;
let rnnoiseNode: AudioWorkletNode | undefined; let rnnoiseNode: AudioWorkletNode | undefined;
@ -420,6 +430,7 @@ const VoiceProvider = memo(({ children }: TVoiceProviderProps) => {
gateNode?.disconnect(); gateNode?.disconnect();
rnnoiseNode?.disconnect(); rnnoiseNode?.disconnect();
deepFilterNode?.disconnect(); deepFilterNode?.disconnect();
preGainNode?.disconnect();
source.disconnect(); source.disconnect();
dest.disconnect(); dest.disconnect();
deepFilterCore?.destroy?.(); deepFilterCore?.destroy?.();
@ -438,6 +449,13 @@ const VoiceProvider = memo(({ children }: TVoiceProviderProps) => {
try { try {
if (useDeepFilterNet) { if (useDeepFilterNet) {
// Mild pre-gain helps keep quiet speech above the model floor
// without aggressively boosting background noise.
preGainNode = ctx.createGain();
preGainNode.gain.value = 1.35;
current.connect(preGainNode);
current = preGainNode;
const deepFilterSuppression = sensitivityToDeepFilterLevel( const deepFilterSuppression = sensitivityToDeepFilterLevel(
devices.voiceSensitivity ?? 70 devices.voiceSensitivity ?? 70
); );