Teams / Webex 対応! Linux でバーチャル背景を使う
2020年12月02日 水曜日
CONTENTS
【IIJ 2020 TECHアドベントカレンダー 12/2(水)の記事です】
今年を振り返ってみると、在宅勤務を中心とするテレワークが大きく広がった年になりました。
会議は原則リモートになり、企業や組織では、Microsoft Teams、Cisco Webex、Zoom、Google Meet、Slack といったミーティングツールの活用が進んだことでしょう。オンラインミーティングでは、Web カメラを用いたビデオ会議ができます。言語情報だけでない、表情や身振りといった非言語情報を伝えるのに便利で、電話を置き換えるのに十分な機能を有しています。
そしてほとんどのミーティングツールは、どのような環境でも利用できます。利用者の OS に左右されないことは、ミーティングツールにとって最も重要です。Teams は Linux 向けクライアントもあり、Microsoft 社から配布されています。(※1)
https://docs.microsoft.com/ja-jp/microsoftteams/get-clients#linux
しかしです。
Linux 版 Teams クライアントは、背景効果(バーチャル背景)が使えません。公式に使えない、と書いてあります。(※2)
https://support.microsoft.com/ja-jp/office/f77a2381-443a-499d-825e-509a140f4780
でも、諦めてはいけません。Linux だってできます。
クライアント側で対応されないのなら、Web カメラ側に細工をすれば良いのです。
環境
業務用 PC として会社から貸与されているノートパソコンです。
私の部署は、自分の業務用 PC をハードウエアから OS まで自分で調達することになっています。
- SONY VAIO PRO PG VJPG111 (※3)
- openSUSE Leap 15.2
メジャーどころの Linux ディストリビューションなら、パッケージまわりが少し異なるだけで、だいたい同じでしょう。ちなみに openSUSE なら簡単にハードウエアも認識するし、使いやすいし、パッケージが豊富に揃っているのでオススメです。(宣伝)
手順
1. 仮想 Video デバイスを作れるパッケージと Node.js をインストール
# zypper install v4l2loopback-kmp-default v4l2loopback-utils nodejs-common
2. v4l2loopback ロード時のオプションを追加
# vim /etc/modprobe.d/v4l2loopback.conf options v4l2loopback devices=1 exclusive_caps=1 video_nr=2 card_label="v4l2loopback"
# vim /etc/modules-load.d/v4l2loopback.conf v4l2loopback
3. 再起動
4. Linux-Fake-Background-Webcam を clone して必要なパッケージをインストール
$ git clone https://github.com/fangfufu/Linux-Fake-Background-Webcam # cd Linux-Fake-Background-Webcam # ./install.sh
5. 仮想 Web カメラを起動
/dev/video2 というキャラクタデバイスを作成しますので、root 権限が必要です。
# cd Linux-Fake-Background-Webcam # cd bodypix node app.js & # cd .. # cd fakecam python3 fake.py
- この時点で物理 Web カメラが有効になります。
- 内部的に /dev/video0 の入力をフィルタしてバーチャル背景を追加し、/dev/video2 に渡しています。(処理が重いので CPU がぶん回り始めます)
6. カメラデバイスを「v4l2loopback」にして背景を楽しむ
Teams を起動してカメラデバイスを「v4l2loopback」に設定すると、Web カメラの映像に背景が追加されています。
こんな感じです。
バーチャル背景を終了するときは、ターミナルにも表示されていますが、Ctrl + “\” です。
このとき、/dev/video2 の仮想 Web カメラごとなくなりますので、会議中に終了すると表示中のビデオが切れてしまうことに注意してください。
応用編: 前景にネームプレートを入れる
Teams 会議を作成すると、参加者の名前はテナントの Active Directory に設定されている表示名が自動的に使われます。せっかくホワイトハウスの背景を使っているのですから、「Donald Trump」とでもしたいところですが、社内の Active Directory のポリシーで編集できないようになっているので、「古賀 勇」で我慢するしかありません。
しかしです。海外の人間とテレカンすると、この表示名は全く意味をなさなくなります。
日本語を読めないからです。
何を今さら、という内容ですが、不覚にも相手に指摘されて「はっ」と気が付きました。
私たちは相手のアルファベット表記の名前を読めるので不自由していませんが、相手からはまるで文字化けのように見えていたのです!
ただでさえテレカンは対面と比較して意思疎通が難しいのに、参加者リストとビデオに表示された人間が識別できないとなると、これは業務に支障が出ていると言っても過言ではありません。
こんな不親切なシステムがあってはならない。
そこで、Linux-Fake-Background-Webcam に同梱されているデフォルト画像を編集して、独自のネームプレートを作成することにします。記事のタイトルは「バーチャル背景」ですが、実は手前のレイヤーに任意の前景も入れることができます。これは、どの公式クライアントにもない機能です!
早速、IIJ 運用の障害対応マスコットキャラクター、バリーくん(※4)に手伝ってもらいました。
こんな感じです。
これなら、どこの国とテレカンをしても、私を識別してくれるでしょう。
なお、ネームプレートを入れる方法は、Linux-Fake-Background-Webcam の fakecam/foreground.jpg
と、fakecam/foreground-mask.png
を GIMP などの画像編集ソフトで加工すれば OK。fakecam/foreground-mask.png
には、一番手前の(前景)レイヤーとして描画する部分を白(#FFFFFF)でマスクします。上の画像だと、こんな感じになっています。
ちなみに自分からは文字が反転して見えますが、これは不具合ではありません。
自分側のプレビューがこうなっているのは、おそらく自分の姿は鏡を見ているようにプレビューしたほうが自然だからでしょう。(初めてテストしたとき文字が左右反転したので、わざわざ左右反転した画像を作って Teams に参加したら、ちゃんと見えているのは自分だけだったというオチが…)
どの会議・配信ツールでも使える!
本記事は Teams を例にしていますが、Web カメラ側に細工をしていますので、じつはミーティングツールを選びません。
私が試した範囲では、Cisco Webex、Zoom、Google Meet、Skype いずれも利用可能でした。ミーティングツールではなく、配信ツールである YouTube Live でも利用可能ですので、このバーチャル背景を使ってライブ配信・録画もできます。なお、Web ブラウザベースの Webex、Google Meet、YouTube Live は Web ブラウザ起動前に仮想 Web カメラを起動しておき、ミーティング開始時にカメラへのアクセス許可を与える必要があります。私は Firefox で試しました。
Slack は有料版の環境がないため未確認ですが、おそらく使えるのではないかと思っています。
環境をお持ちの方は、Twitter @IIJ_ITS にて動作報告お待ちしています。
トラブルシューティング
カメラデバイスに「v4l2loopback」が現れない
- Microsoft の Teams クライアントは起動時にカメラデバイスを認識しているようで、Teams クライアントが先に起動していると仮想 Web カメラの v4l2loopback を認識しません。
- 仮想 Web カメラを先に起動してから、Teams を起動すると認識します。
fake.py を実行するとエラーが出る
Traceback (most recent call last): File "fake.py", line 379, in <module> main() File "fake.py", line 375, in main loop.run_until_complete(cam.run()) File "/usr/lib64/python3.6/asyncio/base_events.py", line 488, in run_until_complete return future.result() File "fake.py", line 274, in run await self.load_images() File "fake.py", line 172, in load_images background = cv2.resize(background, (self.width, self.height)) cv2.error: OpenCV(4.2.0) /io/opencv/modules/imgproc/src/resize.cpp:4048: error: (-215:Assertion failed) inv_scale_x > 0 in function 'resize'
このようなエラーが出る場合は、別のソフトウエアが Web カメラ(/dev/video0)を使用中の可能性があります。他のミーティングツールを終了させてください。
OS をアップデートしたらエラーメッセージが出るようになった
# node app.js No GPU found at /dev/nvidia0, using CPU /home/packages/git/Linux-Fake-Background-Webcam/bodypix/node_modules/@tensorflow/tfjs-node/dist/index.js:49 throw new Error("The Node.js native addon module (tfjs_binding.node) can not " ^ Error: The Node.js native addon module (tfjs_binding.node) can not be found at path: /home/packages/git/Linux-Fake-Background-Webcam/bodypix/node_modules/@tensorflow/tfjs-node/lib/napi-v5/tfjs_binding.node. Please run command 'npm rebuild @tensorflow/tfjs-node build-addon-from-source' to rebuild the native addon module. If you have problem with building the addon module, please check https://github.com/tensorflow/tfjs/blob/master/tfjs-node/WINDOWS_TROUBLESHOOTING.md or file an issue. at Object.<anonymous> (/home/packages/git/Linux-Fake-Background-Webcam/bodypix/node_modules/@tensorflow/tfjs-node/dist/index.js:49:11) at Module._compile (internal/modules/cjs/loader.js:778:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10) at Module.load (internal/modules/cjs/loader.js:653:32) at tryModuleLoad (internal/modules/cjs/loader.js:593:12) at Function.Module._load (internal/modules/cjs/loader.js:585:3) at Module.require (internal/modules/cjs/loader.js:692:17) at require (internal/modules/cjs/helpers.js:25:18) at tensorflow (/home/packages/git/Linux-Fake-Background-Webcam/bodypix/app.js:45:16) at Object.<anonymous> (/home/packages/git/Linux-Fake-Background-Webcam/bodypix/app.js:3:12)
エラーメッセージを読むと、何をすればよいのか書いてありますので、慌てずモジュールを作り直せば OK です。
ついでに git pull して最新の状態にしておきましょう。
$ cd Linux-Fake-Background-Webcam $ git pull # ./install.sh # cd bodypix # npm rebuild @tensorflow/tfjs-node build-addon-from-source
注釈
- 公式の Linux 向け Teams クライアントがリリースされる前から、Teams for Linux というオープンソースのプロジェクトがあります。
https://github.com/IsmaelMartinez/teams-for-linux
Electron ベースのラッパーとなっていて、こちらを使うと公式の Linux クライアントでは未実装な機能が先に使えることがあります。(Linux では「手を挙げる」機能は、こちらが先に使えていました) [↑] - 公式の対応を待つ声が Microsoft Users Voice にも毎日のように投稿されていますが、一向に対応される気配がありません。[↑]
- ハードウエアの認識状況は次の通りです。
$ dmesg | fgrep camera [ 3.612811] usb 1-7: Product: Front camera [ 4.781370] uvcvideo: Found UVC 1.00 device Front camera (0408:3020) [ 4.786677] input: Front camera: Front camera as /devices/pci0000:00/0000:00:14.0/usb1/1-7/1-7:1.0/input/input25 # inxi --cpu --audio --graphic CPU: Topology: Dual Core model: Intel Core i7-7500U bits: 64 type: MT MCP L2 cache: 4096 KiB Speed: 800 MHz min/max: 400/3500 MHz Core speeds (MHz): 1: 800 2: 800 3: 800 4: 800 Graphics: Device-1: Intel HD Graphics 620 driver: i915 v: kernel Device-2: Quanta type: USB driver: uvcvideo Display: server: X.org 1.20.3 driver: modesetting unloaded: fbdev,vesa tty: 170x67 Message: Advanced graphics data unavailable in console for root. Audio: Device-1: Intel Sunrise Point-LP HD Audio driver: snd_hda_intel Sound Server: ALSA v: k5.3.18-lp152.47-default
ちなみに法人向けソニーストアで買うとキーボードに US 配列が選択できます。1日のほとんどをターミナルで生活する運用従事者としては、ありがたいカスタマイズモデルです。また、プレゼン発表などで時々必要になるアナログ VGA 端子も装備しているところがビジネスマンとして嬉しいモデルで、私の部署で利用者が増えています。[↑]
- バリーくん LINE スタンプ、販売中です。[↑]
- アイキャッチ画像の素材として、いらすとや、マンガトップさんから拝借させていただきました。