これは何か
きっかけは、友達にMuseを勧めたときの雑談です。「Museって何でもできるんだよ」と得意げに話したら、友達から「え、じゃあZoomとかもできたりすんの?」と返されました。
……正直、その場では「いや、それはさすがに無理でしょ」と思いました。AIアシスタントが住んでいるのは、画面も音もないサーバーの中です。でも言われてみると気になって、その夜に本人(AI)へ「VMの中にZoomってインストールして立ち上げることできる?」と聞いてみたんです。
できちゃいました。しかもインストールだけじゃなく、本物のZoomミーティングにVMの中から参加して、こちらの映像を受け取り、チャットを送り、最後は音声まで双方向で通すところまで行きました。まさかできると思わなかった。本気でびっくりしました。この記事はその記録です。
役割分担について
この記事は「自分でやった」ではなく、「AIアシスタントにやらせた」体験記です。
- 自分(人間側):お題を出す、Zoomミーティングを立てる、パスコードを教える、向こうで手を振る
- AIアシスタント側:普段使っているAIアシスタント「Muse」(名前は「かぐや」)が、VMへのZoomインストール、GUI操作、仮想オーディオの構築、音声合成での発話まで全部やりました
人間側がやったのは「できる?」と聞いて、ミーティングを立てて、最後に手を振っただけです。
実施日:2026年11月7日 未明
環境
- Muse の VM:Ubuntu 24.04.5 LTS、4 vCPU、メモリ 7.7GB、画面は Xvfb の仮想ディスプレイ(1280×800)
- Zoom Workplace 7.2.5(Linux版 .deb)
- ミーティングのホストは人間側(自宅PCのWeb版Zoomから参加)
1. Zoomを入れるだけで一苦労
公式の zoom_amd64.deb を落として入れるだけ、のはずが順調にハマりました。
-
aptで入れようとすると依存関係の競合(dconf / ibus まわり)で失敗する - 依存ライブラリ(libxcb 系など)を個別に入れてから
dpkg -iすると、今度は「ibus がない」で止まる - 日本語入力を使わない用途なので、中身が空のダミーの ibus パッケージを作って入れたら先に進んだ(力技)
- 起動したら
libEGL.so.1がなくて落ちる → GL系ライブラリを追加 - コマンド名
zoomが、VMに元からある別ツールのコマンドと被っていて、そっちが起動してしまった(本体は/usr/bin/zoom)
なんやかんやで、サインイン画面まで到達。
2. ミーティングに参加する(GUIを自動で操作)
サインインはしないので、ゲスト参加です。AI側は仮想ディスプレイのスクリーンショットを撮りながら、xdotool でマウスとキーボードを操作して参加しました。座標の目測が何度もずれて、ボタン1つ押すのにスクショ確認を繰り返すのが地味に大変だったそうです。
- 「Join a meeting」→ 会議IDと名前(Kaguya)を入力
- パスコードは平文が必要だった(招待リンクの中のパスコードは暗号化されていて、そのまま打てない)→ 人間側がアプリに表示されているパスコードを教えて解決
- プレビュー画面を押したら、無事に入室。ホスト(人間)の映像もVM側に届きました
チャットも送れましたが、このVMには日本語入力(IME)がないので、送った日本語は盛大に文字化けしました。ここは今後の課題です。
ホスト側の画面はこんな感じでした(左が Muse のチャット、右が Zoom)。招待 URL とパスコードは隠してあります。
3. 音を通す(PulseAudioの仮想デバイス)
入室直後は「スピーカーが検出できません」「マイクが検出できません」。VMには音響デバイスが1つもないので当然です。そこで PulseAudio で仮想デバイスを作りました。
# 音声サーバーを専用のランタイムディレクトリで起動
mkdir -p /tmp/xdg && chmod 700 /tmp/xdg
XDG_RUNTIME_DIR=/tmp/xdg pulseaudio -D --exit-idle-time=-1
# かぐやの声を流す入れ物(シンク)と、会議の音を受ける入れ物(シンク)
pactl load-module module-null-sink sink_name=voice sink_properties=device.description=KaguyaVoice
pactl load-module module-null-sink sink_name=spk sink_properties=device.description=MeetingOut
# voice のモニタを「マイクらしく」見せる仮想ソース(これが必須だった)
pactl load-module module-virtual-source source_name=kaguya_mic master=voice.monitor source_properties=device.description=KaguyaMic
pactl set-default-sink spk
pactl set-default-source kaguya_mic
ハマりどころは2つありました。
-
モニタソースを直接マイクにしてもZoomが認識しない —
module-virtual-sourceで包んで「普通のマイク」に見せたら認識した -
Zoomの起動環境 — Zoomを
XDG_RUNTIME_DIR=/tmp/xdg付きで起動し直さないと、PulseAudioサーバーを発見できず「検出できません」のまま。一度退出してアプリを再起動し、再入室したらスピーカーとマイクの両方が出てきました
4. 声を届ける
マイク(KaguyaMic)に、音声合成で作ったかぐやの声を流し込みます。
paplay --device=voice kaguya-hello.wav
流したのは「sato、聞こえる?かぐやだよ。Zoomから声をかけてみたよ。届いてたら、手を振ってみせて。」という一文。
手を振ってもらえました。 両手で。
逆方向も確認済みです。ホストの声は仮想スピーカー(MeetingOut)に届いていて、モニタから録音できました。録音した25秒の音量は mean −31.6dB / max −0.9dB で、ちゃんと人の声が入っていました。
声が届いたあとのホスト側の画面。左のチャットには、かぐやが VM 側で撮影した「手を振るホスト」の写真が届いています。
できていないこと
- 会話の往復 — 相手の声をリアルタイムで音声認識して返す仕組み(STT)は未実装。録音までできているので、あとは文字起こしを繋ぐだけ、ではあります
- 姿を見せる — カメラがないので参加枠は名前だけの黒い表示。画面共有で画像やアニメを映す手はあるけど未検証
- Zoomチャットでの日本語入力 — IMEがないので文字化けする
まとめ
- VM(画面なし・音なし・マイクなし)にZoomを入れて、実ミーティングへの参加と音声の双方向疎通まではできた
- 壁はだいたい「仮想化された環境に、実在するデバイスのふりをさせる」系で、PulseAudioの仮想ソース化と、起動時の環境変数が効いた
- 「AIに任せたら」の部分は誇張ではなく、インストールのトラブル対応からGUI操作、仮想オーディオ構築まで、AI側がエラーを見て直しながら進めました。人間はお題とパスコードと、手を振る係です
次はSTTを繋いで「聞いて返す」ところまで行けるか試したいと思います。
そして友達には、もちろん「Zoom、できたよ」と報告しました。




