WebRTCのノイズキャンセリングについて
現在Skywayを使用してWebRTCを実装しています。
しかし、テストしてみると、WebRTCはSkypeに比べて、周囲の音やノイズをそのまま拾ってしまうということに気が付きました。(チューニングしていないので当然かもしれませんが・・・)
完成したらオンライン学習ツールとして使用したいと考えているのですが、現状、周囲の音やノイズをかなり拾ってしまい、講義に大きな影響が出てしまいます。
そこで、周囲の音やノイズを消す方法があれば、ご教示いただけますと幸甚です。
-
WebRTCはノイズ削減機能を、ブラウザのライブラリ内で実装しています。(https://webrtc.org/architecture/)
個人的な意見ですが、現状、ノイズを削減するための簡単な方法は、イヤホンマイクやピンマイクなど、ノイズを拾いにくいマイクを使うことかと思います。なお、getUserMediaで取得した音声に対し、WebAudio APIを利用して自前で処理を加えることもできるので、ご自身でノイズ削減に対応することも可能です。(が、かなり難易度が高いと思います)
Skypeは、Skype独自のノイズ削減機能を実装しているのだと思いますが、Skype自体もWebRTCへの移行が進んでおり、ブラウザで使えるようになっています。(https://webrtchacks.com/working-to-make-edge-dull-extended-qa-for-rtc-devs/)
-
岩瀬様
ご返信ありがとうございます。
良いヘッドセットを使用して検証したのですが、やはり周囲の音を拾ってしまうので、Web Audio APIで実装してみて、音声を加工することはできました。
しかし、getUserMediaで取得したstreamからaudioだけ取り出して、加工したaudioStreamをstreamに戻すところがうまくかず、audioだけ送信してしまします。
流れとしては
1. getUserMediaでstreamを取得
2. audioを取り出して加工する
3. 加工したaudioをstreamに戻す
4. 相手に送信する
のようになると思うのすが、audioを取り出す方法と戻す方法についてご教示いただけますと幸いです。
-
getUserMediaで取得したMediaStreamに対して
1. 音声(audio)は加工する
2. 映像はそのままにするを実施し、[1]と[2]をあわせもったMediaStreamを作成されたい、という理解であっておりますでしょうか?
その場合
https://www.slideshare.net/mganeko/webrtc-build-mcu-on-browser
のP.17-18に記載されている処理が役立つかと思います。 -
岩瀬様
早速のご回答ありがとうございます。
以下の方法で実装したところ、うまく音声だけ加工してmediastreamに戻すことができました。
一度removeしてaddTrackしました。
navigator.mediaDevices.getUserMedia(constraints).then(function(stream){
var audioContext = new AudioContext();
var gain_node = audioContext.createGain();
gain_node.gain.value = 1;
var source = audioContext.createMediaStreamSource(stream);//以下webaudioAPI操作
・・・・・・・・
lowpassfilter.connect(output);
stream.removeTrack(stream.getAudioTracks()[0]);
stream.addTrack(output.stream.getAudioTracks()[0]);window.localStream = stream;
}
こちらもし実装方法に問題があるようでしたら、ご指摘いただけますと幸いです。
-
そちらの実装方法で良いかと思います。
なお、ご参考までに複数カメラ・マイクなどがある環境である場合は、 enumerateDevices をgetUserMediaの前にご利用になれます。アプリケーションを高度化したい場合に、参考になれば幸いです。
Please sign in to leave a comment.
Comments
5 comments