こんにちは。しおです。
先日、「六角軸ドリル」というアカウントで『simulacra』という動画を投稿しました。この映像を制作・担当しましたので、映像担当者として編集後記を記載したいと思います。編集後記にしては少し投稿が早い気もしますが、忘れないうちに書いておこうという算段です。
まず、この動画は私個人の力だけでは成り立っていません。音声作者の方を含めた六角軸ドリル関係者のみなさんに心から感謝します。
投稿した動画
映像を担当したきっかけ
参考になった映像プロジェクト(モーションタイポグラフィーというらしい)
このプロジェクトの原点は、音声作者の方から、Quartz Composerというビジュアルプログラミング技術を利用した、Metro Exitsという作品があると紹介していただいたのがきっかけです。それを参考にして、今回の音声に実写素材を全く使わない作風で映像を作れないかということでした。
技術的な話
『simulacra』を支える技術
今回の動画では、「NLP」、いわゆる自然言語処理の知識や技術と、画像認識を行うコンピュータビジョンの技術を多く活用しました。
形式言語やオートマトンを扱う分野では、文脈自由文法(Context-Free Grammar)とそれによって生成される文脈自由言語(Context-Free Language)というのを用いることが多いです。文脈と自由、、、、
言語コーパスとtrigram
本動画の作成にあたっては、言語コーパスを用いてn-gramを算出することから始まりました。言語コーパスとは、主に自然言語処理のタスクのため、大規模に文章を構造化、蓄積したものです。n-gramは、単語を単位として扱うとき、連続するN個の要素の並びとして捉える手法のことを言います。Nが2であれば、2-gramことbigram、Nが3であれば3-gramことtrigramとなります。
n-gramを用いて、確率的にランダムな文字を生成することができます。
言語コーパスとは
少し具体例を出します。たとえば言語コーパスに次のような単語の並びがあったとします。
東京 メトロ
東京 駅
東京 都
東京 メトロ
東京 メトロ
すると「東京」の次に来た語を数えて、という回数計算を行います。これがbigramです。
東京 → メトロ 3回
東京 → 駅 1回
東京 → 都 1回
そしてこのbigramを用いて、確率的に文章を生成することを考えます。
たとえば「東京」まで生成されたとき、
メトロ 60%
駅 20%
都 20%
のようにそれぞれを選択する確率を計算し、それをもとに次に生成する単語を決定します。
ただしbigramでは少し弱いところがあり
東京 メトロ
大阪 メトロ
メトロ 駅
メトロ 社員
メトロ 線
のとき、「東京」「メトロ」まで生成していた時、「メトロ」という単語があるということしか使わず、「東京」という単語は生成に使わなくなります。そのため、文脈がかなり弱くなってしまうのです。
対してtrigramでは
東京 メトロ 銀座線
東京 メトロ 社員
東京 メトロ 駅
大阪 メトロ 御堂筋線
大阪 メトロ 中央線
というコーパスがあったとき
東京 メトロ → 銀座線 1
東京 メトロ → 社員 1
東京 メトロ → 駅 1
としてそれぞれ集計します。生成するときは
東京 メトロ →駅
メトロ 駅 → 構内
駅 構内 → では
と、若干考慮する情報量を増やすことができるのです。
ここからは実際に計算を行っていきます。
Transformerによる自然言語処理
とはいえ、前項のtrigramからの文字列生成はあまりにも意味が通じません。後述すると思いますが、テーマとして「情報の進化」というのがありますから、ある程度日本語として意味が通じそうな生成も行いたいと考えました。そこでTransformerという自然言語処理の技術を用いて、少し日本語として通じそうな言語生成の技術も活用することにしました。Transformerは、実際にChatGPTなどにも用いられている、ニューラルネットワーク、深層学習を用いた言語生成技術です。
Transformerを用いた生成は、trigramによる生成と比べて少し文脈がありそうな文章を生成することができます。
Transformerについて深く解説すると、普通に大学の2単位ぐらいになってしまいそうなので、ほんの少しだけ解説します。
たとえば「私は電車に」という入力があったとします。
このとき「私は」「電車 」「に」のように単語単位で分解でき、それぞれの単語はTransformerを通ることで、数百個の数値からなるベクトルに変換されます。
たとえば簡略化してHidden State(各トークンの文脈を反映した内部表現)が4次元だとすると、
隠れ次元
1 2 3 4
私は 0.8 -0.2 0.4 0.1
電車 0.2 0.7 -0.5 0.3
に -0.1 0.6 0.3 -0.7
のような行列になります。そして行列の一番最後の行をもとに、次に現れるであろう単語の確率を計算するのです。
Transformerの入門記事
softmax関数(Transformerでよく用いられる活性化関数の一種)
そしてこの処理は単語を生成する処理を再帰的に行うため、縦方向に徐々に増えていきます。(厳密な説明ではないのですが、繰り返しをしているということです。再帰的処理とループ処理はお互いに展開できつつもその使用例は若干違ったりするためです)
動画中盤のモザイク状の表現は、これを可視化したものです。
そして、動画内で上記の表現に重なっていた文字は、このアルゴリズムに基づいて、実際に生成されたテキストなのです。
要するに、簡易的な生成AIを自作して、その処理過程を可視化しているということです。
人物抽出
画像内から特定の物体を抽出する技術として、YOLO(You Only Look Once)があります。次の画像ように、人物領域をセグメンテーションし、塗りつぶすことができます。
あわせて、BLIP(Bootstrapping Language-Image Pre-training)という技術を活用しました。入力する画像について説明する文章(キャプション)を生成する技術のことです。Sora2など、テキストプロンプトから画像や動画を生成する技術が有名ですが、その反対ともいえる存在です。
BLIPとは
今回はこの2つの技術を組み合わせて、人物画像の画像データセットからそれぞれキャプションを生成し、また人物画像に対してそのキャプションで埋め尽くす画像を出力するプログラムを開発しました。
生成されたキャプションの例
人物領域をキャプションテキストで埋め尽くした様子。よく見ると「A person・・・」となっています。
Three.jsによる人物画像のランダム配置
Three.jsとは
途中の「ドアが閉まります」についても同じ技術を用いています。(こちらは輪郭線に対するテキスト配置)
六角軸ドリルを支える技術
――― メディアコンテンツ共有基盤の開発
六角軸ドリルは、ほかの編集後記で述べられているとおり、複数人の作者による共有アカウントです。つまり複数人合同で映像制作に取り組むわけですが、それゆえ頻繁に素材の共有を行う必要があります。それまで、ファイル転送サービスを用いていましたが、その手間や管理に難がありました。Google Driveなどのサブスクリプション型のストレージサービスの契約も検討しましたが、その契約にかかる月ごとの金銭の管理などがあり、選択肢から外れることとなりました。
これにあたり、六角軸ドリルではオンプレミス(要は自宅に)でファイルサーバーを開発、構築することにしました。技術スタックとしてRuby / Rails API / React / TypeScript / PostgreSQL / Nginx / Certbot / Ubuntu / Cloudflare DNS / Resend / GitHub Actions CI を採用しています。
マルチテナント型のシステムを採用してるので、合作など、プロジェクトごとにテナントを立ち上げることも可能です。いつか下車界隈のデファクトスタンダードになる。たぶん
進捗共有
本システムの構築により、simulacraの制作においても、進捗の共有などに活用することができました(たぶん)。また、すでに3回ほど勉強会等で本システムを構成する技術について登壇を行うこともできています。
関係する登壇テーマ
・RubyでのLintツールについて
・NginxでのX-Accel-Redirectを用いた静的ファイル配信手法
・Nginx内の映像ストリーミング配信の実装
simulacraでの表現
ここからは、simulacraでの表現や制作過程について述べていきます。
全体テーマとサブテーマ
サブテーマは2つあります。
まず、「初めて上京したときの気持ち」を表現することです。私が初めて東京に行ったのは2022年7月でしたが、その時に感じた東京での「人とモノ、情報の一極集中」に圧倒されました。
ですから、このコメントはかなり的確なものなのです。
夏目漱石のこころには
「別に悪い人間というほどのものもいないようです。大抵田舎者いなかものですから」
「田舎者はなぜ悪くないんですか」
私はこの追窮ついきゅうに苦しんだ。しかし先生は私に返事を考えさせる余裕さえ与えなかった。
に続くやりとりがあります。この動画もこの考えに少し影響されているのかもしれません。
次に「言語生成技術の発展」というテーマです。昨今、生成AIの著しい発展によって、社会は大きく変容しました。私はChatGPTが公開される直前の、2022年ごろにその基盤技術たるGPT3モデルの存在を知りましたが、その時は社会がここまで変容することは全く想像することができませんでした。確率的なモデル生成→少し文脈のある言語生成という切り替えを持って、この生成AI技術の発展を表現したかったのです。しかし、動画内で使用するキャプションには、昨今のChatGPTやGeminiのような、実用的な生成AIによって出力されたものは一切使用していません。もはや人間が生成したものと区別がつかないためです。これに関してチューリング・テストという実験があるので気になる人は調べてみてください。
冒頭
東京メトロの2駅間の経路が表示されます。個人個人が別々の行動を取っているということを表現しています。
それぞれに表示される数値は、1日あたり、2つの駅間を移動する人が何人いるかを東京メトロの駅の組み合わせすべてで概算しています。
下位の計算結果
上位の計算結果
西ヶ原~原木中山を移動する人は少なく、新宿~渋谷を移動する人は多いというシミュレーション結果が出ました。ある程度直感通りの結果かもしれません。(かなり雑なシミュレーションなので、あてにはしないでくださいね)
東京メトロの駅に対してボロノイ分割した地域の時間別滞在人口を、メッシュ別人口と、その駅の利用者数をもとにシミュレーションした結果を可視化しています(ただしこれも厳密な計算ではないです)。明るさは、その地域との最低人口状態と比べて、今どれだけ人口が多いかということを表しています。これにより、早朝時間帯と夜間時間帯は最低人口と同じになるので、真っ黒になり、日中は流動で最低人口と差が出るので白に近づくという仕掛けです。
地域ごとにそれぞれの特徴(都市の特徴からあらわれる夜間人口の差など)があることを表しています。もともとは数理モデルのライフゲームを着想を得た表現です。
ビル群
ここで今回の最大の要素である、確率的に生成した文章から生まれるビル群が出てきます。
東京にあるたくさんの高層ビルと、あふれる大量の情報を、確率的に生成したテキストで表現します。絶妙に日本語そうで日本語ではない文章に圧倒されます。制作時にはこれを「文字ビル」と呼んでいました。
文字ビルと文字電車の制作風景
その中を電車で移動します。その電車も都市を構成するものであることを表しています。
ここで下からビルを見上げる構図から、上から俯瞰する構図に切り替えています。
都市の情報量があふれ出してしまいます。
英文側の元データは、夕暮れ時の新宿の画像をもとに生成させたのですが、画面右下に「night from the・・・」という文が見えるように、おおむねそのキャプションは正しく、適切に生成できていることがわかります。
都市の情報から逃れるため、情報のトンネル(≒地下)を通ります。しかしそのトンネルも情報で構成されています。情報を守る手法は情報しかないのです。
情報のトンネルって、VPNのこと・・・!?
地上と地下
地上と、地下と、それを見通す「俯瞰」「追跡」
広告の最適化などのために行われる「トラッキング」や、時間を無限に消費してしまう「ショート動画」とショート動画がその人にあった動画を無限に推薦し続け、人を好みの情報で埋め尽くすアルゴリズムからなかなか逃れられないことを表しています。
本当にショート動画っていう存在よくないと思う。
サビ~後半
情報があふれ出し、それをなんとか整理をしたい気持ちとの格闘する様子を表しています。少し精度の良いTransformerアルゴリズムで生成した文章を挿入しています。良い文章は苦悩を抱えるときに生まれるという意味合いを持たせました。
難しい。雑念は増えるばかり。
そのような環境の中でも、人々は個性を持っていることを、東京メトロカラーで表現しています。
「たられば」というパラレルワールドが脳内をよぎります。
以上が、動画内でのそれぞれの表現のコンセプトです。





































