気の向くままに辿るIT/ICT/IoT
IoT・電子工作

自作スマートスピーカーからビデオ会議や内線通話...etc.を開始

ホーム前へ次へ
Raspberry Piって?

自作スマートスピーカーからビデオ会議や内線通話...etc.を開始

自作スマートスピーカーからビデオ会議や内線通話...etc.を開始

2021/09/23

 以前、作って運用しつつもブラッシュアップ中のRaspberry Pi 3 Model B+とJuliusOpen JTalkベースの自作スマートスピーカーがあります。

 主な機能は、

 尚、ラズパイ用ACアダプタを挿したスイッチ付きコンセントでのON/OFFとは別にラズパイ用boot/reboot/shutdown物理ボタン付き。

 音声認識にJuliusを使った自作スマートスピーカーに伝言とメモの機能を実装するにあたり、マイクとスピーカーを専有してしまうOSSやALSAからPulseAudioに移行しました。

 ちなみに便利なのでラズパイだけでなく、PC/Debianにも自作スマートスピーカー機能を搭載しています。

 自ずとモニタ付きとなるPC版スマートスピーカーには、PC及びラズパイ双方のスマートスピーカー機能のデスクトップアプリとしてPyQt5/Qt Designerによる操作パネルも作成しました。

概要

ブラウザによるJitsi Meet参加例

 今回は、Julius・Open JTalk自作スマートスピーカー機能を入れたモニタ付きラズパイやLinuxパソコンから、同一ネットワーク内のこれらやスマートスピーカー機能のないモニタ付き端末(ラズパイやパソコン)を含めて内線ビデオ通話の開始・終了、また、インターネットを介して世界中から参加可能なビデオ会議・リモート会議を音声操作、スマートスピーカー機能用GUIメニュー操作で開始できるようにしてみました。

 後述の通り、自作スマートスピーカー機能からは呼びませんが、もちろん、スマホやタブレットでもビデオ会議、ボイスチャット、テキストチャットに参加はできます。

 数十年も遅々として進まなかった中、皮肉にもコロナ禍の影響で認知度も上がり、一気に一般的になり始めた在宅勤務、テレワーク、リモートワーク環境においても、オフィス内、家族住まい等の自宅内でも、場合によってはシェアハウスでも、映像、音声、テキストでチャットできると、音声操作や操作パネルからミーティングや会議に、リモート交流に、遠方に住む家族との連絡など無料で手軽に参加できると便利かなと。

 ただ、スマートスピーカーに誤認識は付き物なので特に外部とつながるこの手の機能は、パネル操作に留め、音声操作は控えた方が無難かも。

 但し、ラズパイ3B+ RAM1GBだと電源なのか、ビデオ通話アプリ+Webカメラの組み合わせに対してRAMが足りないのか、何れもなのか、厳しいようでJitsi Meet上では、試してみた手持ちの3台のWebカメラ何れもマイクはともかく、カメラが認識されませんでした。

 他方、ラズパイ3B+でも、これらの内、任意の1台のUSBカメラをつなぎ、Cheeseやguvcview、gst-launch-1.0など何れか1つでは、また、Linuxパソコン(デュアルコアCPU/RAM4GB)では、これらアプリの他、ビデオ通話アプリでも3台とも映像表示できます。

 RAM増強で無線+動画再生が可能になったという経験もあり、おそらくですが、RAMも増強され、電源5V/3A以上のUSB Type-C接続のラズパイ4B RAM4GBや8GBならいけると思います。

 ただ、火災で焼けた大手半導体工場再フル稼働の話も入ってくる中、今更ながらの半導体不足の影響なのか、新たに買おうにもモデルに関わらず、世界的にラズパイが在庫切れして品薄なようですが。

 そんな中、こと4Bについては、初期に電源系の不具合があり、全てが修正済みとは限らないらしいので品薄な中、慌てて買うのは避けた方が無難かと。

 ちなみにラズパイ3B+ではWebカメラを2台接続させる時点で、ほぼ無理である一方、このLinuxパソコンでは、USBハブを介さず、USB2.0 x2/USB3.0 x2の4つある内、3つのUSBポートに3台のWebカメラを同時に接続、ビデオ通話アプリ、Cheese、guvcviewやgst-launch-1.0の何れか3つなら(4つめのアプリを起動した場合、他のアプリを終了させれば残りの3つで)同時に、それぞれ正常に映像表示できました。

 尚、スマホのJitsi Meetアプリと、このLinuxパソコン間ではビデオ通話できています。

自作スマートスピーカー用GUI操作パネルによる操作・音声操作でビデオチャット/ボイスチャット/テキストチャット参加時の初期画面例

 これらを実現するにあたっては、WebRTCや類似の機能をベースにブラウザで、また、アカウントなしで使え、ブラウザのみで完結、IDがURLの一部となるJitsi Meetだと簡単なので、ここでは、これを使う前提とします。

 多くの企業では、ZoomやSlack(でこれらを利用)の方が流行りみたいですけどね。

 Jitsiについては、いろいろなOSでUSBカメラを使う/Debian JessieとUSBカメラでビデオ会議・通話・チャットでデスクトップ版を使ってみたこともあります。

 ビデオ会議については、開始のみですが、同一ネットワーク内の内線機能については、sshを使い、開始側の端末から他方の端末においても同時に開始・終了可能としています。

 もちろん、スマホやタブレットでも参加できますが、Jitsi Meetの場合、これらは専用アプリを使う必要があるので同一ネットワーク内にあってもURL指定やssh操作できず、アプリを開いて会議IDを入力して参加することになります。

 スマホやタブレットのブラウザにURLを入れてアクセスしようとした場合でも、アプリを使ってねといった旨が表示された画面のリンクからJitsi Meetアプリを起動することはできますが。

 尚、通話は無料でも通信データ容量を消費するわけでスマホやタブレットの場合、多くは、1ヶ月のデータ通信量の制約があるでしょうし、特にビデオ通話はデータ量が多くなるのでWi-Fi環境のあるところで使うのがよいでしょう。

 自前、または信頼の足るWi-Fi環境が望ましいですが、万一にもフリーWi-Fiを使うなら最低限VPNを使うなどセキュリティは十分に考慮すべきでしょう。

自作スマートスピーカー用GUI操作パネルによる操作・音声操作でビデオチャット/ボイスチャット/テキストチャット参加例

 Jitsi Meetでは、ビデオや音声のON/OFFもできるのでビデオ通話・ビデオチャットはもちろん、映像なしの音声通話・ボイスチャットも可能ですし、テキストチャット機能もあります。

 もちろん複数人での会議・ミーティングもできます。

 開催者は、その後の入出者に対してパスワードを設定したり、許可を与えることで入室を制限できる他、とあるベータ版の機能などもあります。

 オーディオやYouTubeの共有もできますし、背景設定もでき、背景には、「少しぼかし」、「ぼかし」の他、デフォルトでは部屋の写真や風景などもあり、好きな画像を取り込むこともできるようです。

 Jitsiに限ったことではないでしょうが、参加者が入るとデフォルトの背景はちょっと不自然になるので距離感などを考慮した写真を使うのが良さそうです。

 また、他でマイクを使っていたりすると?ブラウザ用に必要なマイクがが割り当てられておらず、音が出ないということもあり、その場合、何らかの設定パネルなどからブラウザに当該マイクを割り当てる必要がある場合もあります。

 尚、自作スマートスピーカー機能による音声操作には、音声認識にJulius、応答にperlスクリプトを、GUIパネル操作については、PyQt/Qtデザイナーを使っており、その手順は次の通りです。

 ちなみに自身は、Firefoxを愛用しているのでブラウザには、サブのChromiumを使うことにしました。

 というか、「Raspberry Pi OS」アップデートで「Chromium」のビデオ会議が快適ににもあるようにラズパイでRaspberry Pi OSを使う場合、ビデオ会議仕様にChromiumを強化しているっぽいので、むしろ都合が良さそうです。

ビデオ会議・リモート会議・遠方の親族とのビデオ電話など

 インターネットを介したリモート会議や同居していない家族とのビデオ通話などについては、会議IDを含むURLを指定してブラウザを起動するのみです。

 その際、Jitsi Meetなどのビデオ通話アプリは、相手を招待することができるので、これを使うことになります。

 Jitsi Meetにおいては、主催者は、パスワードを設けたり、許可制にすることなどができます。

 音声操作の場合は、音声認識Juliusの辞書に任意のワードを追加、ファイルエンコーディングをutf-8からeuc-jpに変換、音声合成・応答スクリプトに当該ワードによる条件分岐追加し、systemctl daemon-reload/restart スマートスピーカー機能systemdユニットファイル、応答スクリプトから、パネル操作は、GUIボタンを作って、その押下で、これを実行するスクリプトをコールします。

$ cat path/to/start_meeting.sh
#!/bin/sh
 
if [ $1 = projectA ]
then
destpath='meet.jit.si/会議ID'
 
  chromium $destpath 2>&1 > /dev/null &
fi
$

 サンプルには条件分岐が1つしかありませんが、応答スクリプトから呼ばれるスクリプトは、対象会議やプロジェクトに相当する値を引数に取るようにすると良いかもしれません。

 音声操作では、例えば、[プロジェクトA開始]などをキーにChrome互換Chromiumが起動、会議IDを含むURLを開き、終わったら、ブラウザを閉じるだけです。

ビデオ内線機能

$ cat path/to/start_meeting.sh
#!/bin/sh
 
destpath='meet.jit.si/会議ID'
 
if [ $1 = inside ]
then
  chromium $destpath 2>&1 > /dev/null &
 
  ping -c1 hostname.local 2>&1 > /dev/null &
  if [ $? -ge 1 ]; then
    :
  else
    ssh user@hostname.local "export DISPLAY=:0.0;chromium $destpath 2>&1 >/dev/null &"
  fi
fi
$ cat path/to/stop_meeting.sh
#!/bin/sh
 
pkill chromium
 
ping -c1 hostname.local
if [ $? -ge 1 ]; then
  :
else
  ssh user@hostname.local 'pkill chromium 2>&1 >/dev/null'
fi
$

 ビデオ内線機能については、同一ネットワーク内において、自端末については、会議IDを含むURLを指定してブラウザを起動、他端末については、これをsshで実行、その際、モニタが使えるようにexport DISPLAY=:0.0;を先に指定する必要があります。

 音声操作の場合、音声認識Juliusの辞書に任意のワードを追加、ファイルエンコーディングをutf-8からeuc-jpに変換、音声合成・応答スクリプトに当該ワードによる条件分岐追加し、systemctl daemon-reload/restart スマートスピーカー機能systemdユニットファイル、応答スクリプトから、パネル操作は、GUIボタンを作って、その押下で、これを実行するスクリプトをコールする点については、リモート会議の場合と同じです。

 違いは、開始と終了において自端末だけでなく、他端末の操作もする点。

 サンプルコードは、条件分岐が1つしかありませんが、[path/to/start_meeting.sh inside]の恰好で引数によってミーティングや会議が異なるイメージです。

 家庭での内線通話なら、分岐が必要なケースもあれば、不要なケースもあるでしょうが、一方で相手側端末の開始・終了もあるので相手ホストの存在確認及びブラウザ起動の条件分岐は、端末の数だけ行うことになります。

 終了は、ブラウザをpkillしているだけです。

 そのまま、他の部屋の人と話したかったのに...というケースもあるかもしれませんが、気づかなかったことにします。

 企業・オフィス内でもありでしょうが、家庭でもフロアが違う、同じフロアの各部屋、リビングやキッチンなどの間でビデオ通話・ビデオ電話、音声のみとか、テキストチャットもできたりして便利かと。

 あまり近すぎるとハレーションに悩まされますが。

備考

 というか、ブラウザをモニタにできるビデオ会議アプリは結構ありますが、相当複雑なものやユニークなものにしないと、それにしても会議IDがかぶる可能性はゼロではないですよね。

 だとすると会議IDは、常に同じものを使うのではなく、ある意味、使い捨てと割り切った運用が必要という前提なんですかね?

 そうなら、会議ID決め打ちの、ここでのスクリプト操作は、考えものですね...。

 毎回、ランダムに生成するようにして招待...としても被らない保証はないですし...、被った場合の検出ができないと再生成できないですし。

 関係ないけど、そうなるとパスワード生成するアプリだって...。

 それにしてもユニークなものにすればするほど、レアケースだとしても、んー...、まいっか。

2021/10/06

 おっと、Jitsi Meet(ビデオ会議システム)のサーバを Docker Compose で起動する手順...、なるほどサーバを立てられるならルーム名も管理下におくこともできるか...。

 ただ、宅内ならよいけど、外とって考えると...。

ホーム前へ次へ