マイク入力ボリュームが自動で変わる autoGainControl を無効にしたい
TL;DR
以下のように audio.autoGainControl オプションを指定することで、マイク入力のボリュームが自動で調整されます。
audio.autoGainControl は、audio: true と指定した場合にも、デフォルトで true になっています。
navigator.mediaDevices.getUserMedia({ audio: { autoGainControl: true } }); // or { audio: true }
無効にするためには、以下のように autoGainControl: false を指定します。
navigator.mediaDevices.getUserMedia({ audio: { autoGainControl: false } });
もしくは、chrome://flags/#enable-webrtc-allow-input-volume-adjustment を無効にすることで、autoGainControl を無効にすることができます。

対象読者
- ブラウザでマイクを使う際に、マイクのボリュームが自動で調整されるのが気になる
- マイクを使う Web アプリケーションの開発者
はじめに
こんにちは。クラウドエース バックエンドエンジニアリング部 の伊藝です。
みなさんは、ブラウザでマイクを使ったことがありますか?
自分は、Google Meet や Discord などでマイクを使うことが多いです。
そんなとき、マイクのボリュームが大きくなったり小さくなったりと、自動で調整されていることに気づいたことがありますか?
自分は、この現象の影響でマイクのボリュームが過度に小さく設定されてしまい、他の参加者から「なんか声小さくない?」と言われ、手動でマイクのボリュームを調整し直すことがよくあります。

この記事では、ブラウザでマイクを使う際に、マイクのボリュームが自動で調整される原因について調査しました。
原因
Media Capture and Streams API の、MediaTrackSettings の autoGainControl が原因です。
navigator.mediaDevices.getUserMedia() はマイクやカメラなどのメディアデバイスを取得するための API です。
アプリケーション側で以下のようなコードが書かれている場合、マイクのボリュームが自動で調整されます。
navigator.mediaDevices.getUserMedia({ audio: { autoGainControl: true } }); // or { audio: true }
これを無効にすることで、マイクのボリュームが自動で調整されなくなります。
navigator.mediaDevices.getUserMedia({ audio: { autoGainControl: false } });
しかし、この設定はアプリケーションの開発者が指定するものであり、ユーザーが設定することはできません。
対策
Chrome では、chrome://flags/#enable-webrtc-allow-input-volume-adjustment を無効にすることで、autoGainControl を無効にすることができます。
chrome://flags/#enable-webrtc-allow-input-volume-adjustment

WebRTC と言われているのは、Media Capture and Streams API が WebRTC 関連の API であるためです。
まとめ
ブラウザでマイクを使う際に、マイクのボリュームが自動で調整される原因と対策について説明しました。
マイクのボリュームが自動で調整されることで、ユーザーがマイクのボリュームを手動で調整する必要がなくなりますが、ユーザーがマイクのボリュームを手動で調整したい場合は、autoGainControl を無効にすることで対応できます。
また、Chrome では、chrome://flags/#enable-webrtc-allow-input-volume-adjustment を無効にすることで、autoGainControl を無効にすることができます。
参考
Discussion