Linux(Ubuntu)＋Zoom＋OBS Studio＋効果音で楽しいZoomミーティングができる環境を作ってみた


##やりたかったこと
在宅テレワークで楽しくZoomミーティングをできるように、以下のことができる環境を作ってみました。

- Linux(Ubuntu)でZoomミーティング環境の構築
- OBS Studioでシーンを加工
- ミーティング中に効果音をポン出し

必要なのは、Zoom、OBS Studio、OBS Studio用の仮想カメラ、効果音ポン出し用のWebアプリです。Webカメラ以外にはミキサーなどの追加ハードウェアは不要です。

[補足] 私の環境では、後半の仮想マイクの作成はやめました。送信先でどうしてもエコーが消しきれなかったためです。

##Zoomのインストール

1.Zoomのダウンロード

https://zoom.us/download にアクセス。![dl.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680018/97fb8929-731c-b01f-217f-610a26485eba.png)

2.Zoomのインストール

ダウンロードが終わると「クリックしてZoomをインストール」と出るのでクリック。
![inst.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680018/0c57a2c0-ab51-84f1-deb1-180e47b12856.png)

3.インストーラ実行

インストーラが起動するので、「インストール」をクリック。
![inst2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680018/fb0c660c-9623-37e0-8398-0a0f484a0d9f.png)

4.インストール完了
Zoomの青いアイコンができていれば無事インストール完了。
![icon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680018/a563d2e0-aad5-208e-d86c-1699d3d62cd2.png)

##OBS Studioのインストール
レポジトリを引っ張ればaptコマンドでインストールできます。
自分の環境は18.04なので、FFmpegのインストールはスキップして以下のコマンドを実行。他のバージョンの場合や詳細は、以下の参考文献を参照ください。


```
sudo add-apt-repository ppa:obsproject/obs-studio
sudo apt update
sudo apt install obs-studio
```
[参考文献：OBS Project Install instruction](https://obsproject.com/wiki/install-instructions#linux "OBS Project Install instruction")

##仮想カメラのインストール

ここは以下のサイトの記事を参考にさせて頂き、一部を除きこの通りにやれば無事導入できました。画面スナップ付きで詳しく説明されているので、こちらをご覧いただくほうが良いです。
[元記事：[Day of Speed]obs-v4l2sinkを使ってLinux上のOBS Studioで合成した映像をSkypeやZoomに流す](http://www.nofuture.tv/diary/20200413.html)
以下は自分の環境で導入した際のコマンドです。

1.v4l2loopbackのインストール

```
sudo apt install v4l2loopback-dkms v4l2loopback-utils
```

2.v4l2loopbackのロード

```
sudo modprobe v4l2loopback devices=1 video_nr=10 card_label="OBS Cam" exclusive_caps=1
```

3.obs-v4l2sinkプラグインのダウンロード
obs-v4l2sink.debパッケージを以下よりダウンロードします。

[https://github.com/CatxFish/obs-v4l2sink/releases](https://github.com/CatxFish/obs-v4l2sink/releases)

4.obs-v4l2sinkプラグインのインストール
ダウンロードしたディレクトリに移動して、以下のコマンドでインストールします。

```
sudo apt install ./obs-v4l2sink.deb
```

5.obs-v4l2sinkプラグインのシンボリックリンク作成
インストール先とOBS Studioの参照先が異なるとのことで、シンボリックリンクを以下のコマンドで作成する必要があるとのことです（元記事参照）。

```
cd /usr/lib/x86_64-linux-gnu/obs-plugins
sudo ln -s /usr/lib/obs-plugins/v4l2sink.so 
```

6.OBS Studio側の設定

OBS Studioの画面右下「コントロール」にある「設定」をクリックし、現れたダイアログの左から「映像」を選択し、基本解像度とカメラ解像度を合わせる必要があるとのこと。元記事の方に画面スナップ付きで丁寧に説明されているので、そちらを参照ください。

7.仮想カメラの有効化

仮想カメラを有効化、すなわちZoomからカメラとして仮想カメラを選択できるようにします。上記のコマンド、設定がうまくいっていれば、OBS Studioの「ツール」メニューに *v4l2sink* が現れているはずなので、これをクリックします。

![obsmenu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680018/f4404923-43e5-696e-c65d-ed7f036d3e06.png)

以下のダイアログが現れます。

![v4l2sink_dlg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680018/893719a5-f8a4-435b-1ccf-93b30ed86bff.png)

「Start」を押すと仮想カメラが有効化されます。「Auto Start」をチェックしておくと、都度都度設定しなくても OBS Studio 起動時に自動的に仮想カメラが有効化されます。

今度は、Zoom側でカメラとして仮想カメラを選択します。Zoomミーティングが始まったら、ミーティング画面の左下の *Start Video* の脇の上矢印をクリックするとカメラの選択肢の中に*OBS Cam*が現れているはずなので、これを選択します。仮想カメラの名前は上記のv4l2loopbackのロード時につけたオプションの *card_label="OBS Cam"* で指定したものになります。

![obscam.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680018/9d9e3fbd-a4ca-4e4c-b6df-ffcb998cdf15.png)

##仮想カメラの永続化

上記で仮想カメラが使えるようになるのですが、OSを再起動するとモジュールは自動的に読み込まれないので、都度都度コマンド入力が必要になります。そのためモジュールのロードを永続化しておきます。自分は /etc/modules-load.d を使いましたが、Linux自体にお詳しい方ならもっと適切なお作法があるのかもしれません。

1./etc/modules-load.dにconfファイルを作成

modules-load.dにconfファイルを作っておくと、起動時に指定したカーネルモジュールがロードされます。自分の場合は、obs.confというファイルを以下のように新規に作って /etc/modules-load.d に置きました。

```/etc/modules-load.d/obs.conf
v4l2loopback
```
sudoするなどしてスーパーユーザで作成してください。

2./etc/modprobe.dにconfファイルを作成

コマンドラインから *modprobe* でカーネルモジュールをロードする際につけていたオプションを起動時のロード時に引き渡すために、/etc/modprobe.d にオプションを記述しておきます。自分の場合は、obs_opt.confというファイルを以下のように新規に作って /etc/modprobe.d に置きました。

```/etc/modprobe.d/obs_opt.conf
options v4l2loopback devices=1 video_nr=10 card_label="OBS Cam" exclusive_caps=1
```
行内の並び順は、オプション追加を意味する *options* の次に、このオプションをつけるモジュールの名前、その後ろはつけたいオプションをそのまま並べます。

sudoするなどしてスーパーユーザで作成してください。

##効果音や音楽を流せるようにするために仮想マイクを作る

OBS Studioは音声ミキサーを備えているので、マイクからの音声に、PC上で再生している音楽をかぶせて放送することが可能です。ただこれは、OBS StudioからYouTubeなどで放送配信しているときには有効なのですが、仮想カメラでZoomに映していてもミキサーの音はZoomには流れません。仮想放送的なプラグインがあるといいのかもしれませんが、残念ながら見つけられませんでした。

ちなみに Share screen している時に音声をPC上の音声をかぶせる場合には、仮想マイク無しでもできます（後述）。ここではミーティング参加者として送っている音声にかぶせる場合に必要な設定を説明しています。

ここでは、仮想マイクを作ってPC上の再生音とマイクからの音声をミックスして流します。仮想マイクの作成については、以下の投稿を参考にしました（というかそのまんま）。

[元記事：Redirecting Pulseaudio sink to a virtual source](https://unix.stackexchange.com/questions/576785/redirecting-pulseaudio-sink-to-a-virtual-source)
記事中の最後の回答が作成方法そのものになります。記事中では *pactl* コマンドが使われていますが、今は *pacmd* に置き換わっているようです。

Linuxのサウンド管理の仕組みの上位層のPulse Audioを使って仮想マイクを作成して、そこにアプリから再生されている音声とマイクからの音声を流し込むように設定することで実現しています。

1.マイク音声とPC上の再生音声をミックスするための Sink を生成

mix-for-virtual-mic という名前で Sink を生成します。

```
pacmd load-module module-null-sink sink_name=mix-for-virtual-mic sink_properties=device.description=Mix-for-Virtual-Microphone
```

2.PC上の再生音声とマイク音声をミックスする Sink を生成

```
pacmd load-module module-combine-sink sink_name=virtual-microphone-and-speakers slaves=mix-for-virtual-mic,alsa_output.pci-0000_00_1b.0.analog-stereo
```

3.マイク音声をミックスするための Sink にループバック

```
pacmd load-module module-loopback source=alsa_input.pci-0000_00_1b.0.analog-stereo sink=mix-for-virtual-mic latency_msec=20
```

4.ダミーのエコーキャンセル Sink の生成

エコーキャンセラーの出力は使わないので、null sinkを用意しておきます。

```
pacmd load-module module-null-sink sink_name=silence sink_properties=device.description=silent-sink-for-echo-cancel
```

5.仮想マイクの作成

エコーキャンセラーモジュールを使って仮想マイク（Virtual-Microphone）を作成します。これをZoomから使います。

```
pacmd load-module module-echo-cancel sink_name=virtual-microphone source_name=virtual-microphone source_master=mix-for-virtual-mic.monitor sink_master=silence aec_method=null source_properties=device.description=Virtual-Microphone sink_properties=device.description=Virtual-Microphone
```

6.Zoom側の設定

ここまで各コマンドの実行でエラーがでなければ設定は成功しています。作成した各 Sink が Zoom から見えるようになります。Zoom側ではマイクとスピーカーとして以下のように選択します。

![mix.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680018/b9da65f7-f774-e178-7e9a-b8bf5c3d9567.png)

これで、例えばPC上で音楽再生しながらマイクでしゃべると、Zoomミーティングの参加者に音楽と声の両方が届くようになります。

##仮想マイクの永続化

上記で仮想マイクが使えるようになりますが、仮想カメラの時と同様に、OSを再起動すると消えてしまいますので永続化します。

ここまでの設定はすべて PulseAudio 上で実行していますので、PulseAudioの起動スクリプトに記述しておけば、OS起動時に自動的に Sink が起動します。起動スクリプトは、以下のいずれかになります。自分はシステム設定にしました。

- ~/.pulse/default.pa ： 個人設定
- /etc/pulse/default.pa ： システム設定

/etc/pulse/default.pa を開くと、すでにいろいろな設定が入っていますので、一番最後に以下を追加します

``` /etc/pulse/default.paへの追記
load-module module-null-sink sink_name=mix-for-virtual-mic sink_properties=device.description=Mix-for-Virtual-Microphone
load-module module-combine-sink sink_name=virtual-microphone-and-speakers slaves=mix-for-virtual-mic,alsa_output.pci-0000_00_1b.0.analog-stereo
load-module module-loopback source=alsa_input.pci-0000_00_1b.0.analog-stereo sink=mix-for-virtual-mic latency_msec=20
load-module module-null-sink sink_name=silence sink_properties=device.description=silent-sink-for-echo-cancel
load-module module-echo-cancel sink_name=virtual-microphone source_name=virtual-microphone source_master=mix-for-virtual-mic.monitor sink_master=silence aec_method=null source_properties=device.description=Virtual-Microphone sink_properties=device.description=Virtual-Microphone

```

##効果音の再生

効果音はフリーの適当なものをダウンロードしてプレーヤーで再生すればいいのですが、便利なWebアプリがあったので、それを使っています。これだけ揃っていればネタ的に困らないです。大変ありがたく使わせて頂いています。

[効果音ラボ ポン出し https://soundeffect-lab.info/pon/app.html](https://soundeffect-lab.info/pon/app.html)
![pon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680018/9b6e0dec-c865-7fa0-3671-91b89d11f0f2.png)

##[補足] OBS StudioのシーンをZoomで画面共有しつつPC上の音声も共有

他にもやり方があるのかもしれませんが、仮想カメラでのOBS Studioのシーンの配信はそのまま画面共有には出ないので、以下の方法でやってみました。

1.OBS Studioのシーンのウィンドウプロジェクターで画面に出す

OBS Studioのシーンから共有したいシーンを選び、右クリックでウィンドウプロジェクターを選択。

![winprj.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680018/ecef1b24-887c-e596-c516-463647dbeacc.png)

すると、シーンが合成された結果がウィンドウとして開きます。

2.Share Screenでアプリの共有としてウィンドウプロジェクターを共有

Share Screenを選ぶとダイアログが出るので、先程開いたウィンドウプロジェクターを共有します。

![sharescreen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680018/248a3695-6599-4e36-27e9-2a6a11ba2590.png)

このとき、ダイアログの左下にある Share computer sound にチェックを入れていると、効果音や音楽などをZoom上に流すことができます（少し前のZoomのバージョンまでは Windows版のみの機能でしたが、今は Linux版でも使えます）。