【ITニュース解説】I Built an AI That Reads My Blinks and Speaks Morse Code 👁️ Here's the Code
2025年09月24日に「Dev.to」が公開したITニュース「I Built an AI That Reads My Blinks and Speaks Morse Code 👁️ Here's the Code」について初心者にもわかりやすく解説しています。
ITニュース概要
AIと顔認識技術(MediaPipe)を使い、瞬きをモールス信号に変換して「目で話す」システムを構築した。瞬きの長さで「点」と「線」を区別し、頭の頷きや顔の向きで文字や単語を区切るなど、JavaScriptで技術的課題を解決した。
ITニュース解説
このプロジェクトは、AIの力を借りてまばたきを読み取り、それをモールス信号に変換することで、まるで「目で話す」かのようなシステムを構築する試みである。かつてはSFの世界の出来事と考えられていたこの発想は、AIがリアルタイムで顔の478個もの特徴点をブラウザ上で正確に追跡する技術を目の当たりにしたとき、具体的な目標として立ち現れたという。このシステムは、顔の細かな動きや部位の位置を正確に把握できるため、まばたきのパターンをモールス信号に変換するという夢のようなアイデアを実現できると考えられた。このプロジェクトの着想は、かつて捕虜となったアメリカ人パイロットがプロパガンダビデオの中で「拷問」を意味するモールス信号をまばたきで伝えたという、人間の驚くべき機知に満ちた物語に深く感銘を受けている。
この革新的なシステムを構築するために採用された技術スタックは、非常にシンプルである。すべてのプログラムの動作を制御するロジックは「JavaScript」というプログラミング言語で記述され、ユーザーインターフェース(UI)の見た目や配置は「HTML5」と「CSS3」を用いて作成された。そして、このプロジェクトの根幹をなす技術が「MediaPipe Face Landmarker」である。これはGoogleが提供するオープンソースのAIツールで、リアルタイムで顔の特徴点を検出し、顔の表情(「ブレンドシェイプ」と呼ばれる)を数値として認識する能力を持つ。
プロジェクトを進める上で、いくつかの技術的な課題が発生し、それらを解決する必要があった。
最初の大きな課題は、モールス信号の基本要素である「ドット」(短い信号)と「ダッシュ」(長い信号)をまばたきによって区別することであった。MediaPipeは、顔のさまざまな表情を数値化する「ブレンドシェイプ」という機能を提供しており、幸いにも「eyeBlinkLeft(左目のまばたき)」と「eyeBlinkRight(右目のまばたき)」という項目が用意されていた。これらのブレンドシェイプのスコアは、0に近いほど目が開いていることを示し、1に近いほど目が閉じていることを示す。
当初、目が閉じている時間を計測するためにsetTimeoutというJavaScriptの関数を使用することが考えられたが、これは動画の描画サイクルと同期しないため、正確な時間の計測が困難であるという問題があった。動画は多数の連続した静止画(フレーム)で構成されており、AIはこれらの各フレームを個別に分析する。この特性を利用し、目が閉じている間、連続して何フレームが経過したかを数えるという解決策が考案された。具体的には、左右のまばたきスコアの平均が特定のしきい値(例えば0.5)を超えている間、フレームカウンターをインクリメントしていく。まばたきのスコアがしきい値を下回った時点で、カウンターの値を確認する。もしカウンターが2フレームから14フレームの間であれば短い点滅(ドット)と判断し、15フレーム以上であれば長い点滅(ダッシュ)と判断することで、まばたきの長さを正確に区別し、モールス信号の基本要素を表現できるようになった。
二つ目の課題は、文字や単語の区切りを示すために使用する「頭のうなずき」を正確に検出することだった。最初の試みとして、鼻の先端のY座標(上下方向の位置)をフレームごとに追跡し比較する方法が試みられたが、これは呼吸のようなわずかな体の動きにも反応してしまうほど敏感すぎ、意図しない誤検出が頻発した。
この問題を克服するために、「スライディングウィンドウ」というアルゴリズムが採用された。この方法は、鼻のY座標の履歴を、例えば直近の15フレーム分だけ常に配列に保持し続けるものである。新しいフレームが処理されるたびに、一番古い履歴を配列から削除し、新しいY座標データを追加していく。そして、この履歴データの中からY座標の最小値と最大値を特定し、その差を計算する。この最大値と最小値の差が一定のしきい値よりも大きい場合にのみ、それを意図的な「うなずき」として認識する。このアプローチにより、瞬間的な微細な揺れではなく、明確でまとまった頭の動きだけを正確に検出できるようになった。
三つ目の課題は、バックスペースやスペースといった特定の操作を実行するための「頭の向きの変更」を検出することだった。この検出も、うなずきの検出と同様に、微細な動きで誤検出が起きやすいという問題に直面した。解決策は、頭の向きが変わると顔の左右のプロポーションが変化することに着目したものだった。
顔が正面を向いている場合、AIが検出する鼻から左頬までのX座標の距離と、鼻から右頬までのX座標の距離はほぼ同じである。しかし、顔を例えば左に傾けると、画像上では鼻から右頬までの距離が「長く」見え、左頬までの距離が「短く」見えるようになる。この現象を利用し、鼻と左右の頬のX座標を基に比率を計算する。具体的には、鼻のX座標から右頬のX座標を引いた値と、左頬と右頬のX座標の差(顔全体の幅に相当する)の比率を計算する。顔が正面を向いている場合、この比率は約0.5になる。しかし、顔を左に傾けるとこの比率は0.65よりも大きくなり、顔を右に傾けると0.35よりも小さくなる。この比率の変化を検出することで、頭が左右どちらに傾いているかを高精度に判断できるようになった。
これらの技術的な課題を一つずつ解決することで、AIがまばたき、うなずき、頭の向きといった顔の動きを正確に認識し、それらをモールス信号やシステム操作のコマンドに変換する洗練されたシステムが完成した。このプロジェクトは、ブラウザ上で動作するAIがどれほど身近で強力になったか、そしてオープンソースのツールと創造的な問題解決の組み合わせによって、かつては専門的なハードウェアを必要としたような複雑なシステムでも実現できる可能性を示している。