花火大会当日に
Rokidアプリを作ってみた

リアルタイム花火解説アプリをぶっつけ本番投入

あぶち(@abricheese)

あぶち(@abricheese)

XR Meetup Kagoshima 共同代表

仕事:業務用VRアプリ開発

趣味:XRアプリ制作
コミュニティ活動、3Dスキャン

最近はスマートグラスも試し中

Rokid標準カメラの花火写真

花火大会前日夜

せっかくだからRokidアプリ作ろう

アイデア出し

リアルタイム花火解説の構成

カメラ取得Camera2
TextureViewからBitmap
→
端末内解析HandlerThread
検出・追跡・特徴抽出
→
解説HUD文例選択
最低3秒保持

すべてRokid本体内。解析中は次の取得をスキップ。

Android / Kotlin。画像特徴から端末内の文例を選択。LLMへの都度問い合わせなし。

オタクくんの解説

保存データから再構成/デバッグ枠の途中形状は一部近似/境界はフェード処理
通常表示
デバッグ表示

ギャルの解説

保存データから再構成/デバッグ枠の途中形状は一部近似/境界はフェード処理
通常表示
デバッグ表示

連続花火・吹き上げ花火

保存データから再構成/デバッグ枠の途中形状は一部近似/境界はフェード処理
通常表示
デバッグ表示

花火判定の流れ

80×60の輝度背景差分+閾値
連結領域を抽出
→
個別追跡拡大・ピーク・減衰
吹き上げ候補
→
連続演出同時数・発数・時間
シーケンス分類

FireworkEvent(個別花火)とFireworkSequence(連続演出)を分離

画像認識モデルの推論ではなく、特徴とルールで判定。

事前確認は部屋でYouTubeを見ながら

暗い部屋でPCの花火映像を再生し、Rokidで確認

部屋で動いたので、会場へ

PCの花火映像で動作確認

花火ランキング

花火ランキング

同じ花火やないか!
(エセ関西弁)

元動画と解説を、後から組み合わせる

Rokidで観測カメラ映像
花火の解析・解説
→
MP4:元動画約3秒ずつ分割
イベント前9秒・後6秒を保持
JSON:イベント花火の解析結果
解説内容・表示済み状態
→
後から再構成時刻で映像と解説を対応付け
解説付き動画へ

共通のセッション時刻で関連付け。HUDは元動画に焼き込まない。

これで何かあった時も
元データは残るので安心!

・・・と思ったら

録画は640 × 480だった

アプリ録画画質:480×640
標準カメラ画質:960×1280

録画画質を相談すると

録画画質を相談すると

もう花火大会終わってるよ

分割録画の切れ目

MediaRecorderを約3秒単位で切り替え

実際の録画の一例では、境界に
約0.38〜0.46秒 の未録画区間

ファイルをつないでも、
欠落したフレームは戻らない

右:解説付き再構成映像(境界フェードなし)

まとめ:Rokid単体で解析・解説まで動作

軽量な画像処理と状態管理で、端末内に処理を収めた

動画・解析・解説を分離し、後から再構成できた

録画解像度と、セグメント切替時の欠落は改善が必要

次のデバッグは、また来年。

15秒。有料観覧席を購入済み。寝る直前に発案。ここではまだ実装していない。

スカウターと図鑑案。ChatGPTが提案したSDKを実際の採用技術と混同しない。

以前の2枚に対応する33件を元MP4から再配置。上下の余白をトリミングし比率を維持。

下端揃え。同じ画素スケールで縦横2倍。添付ファイルの比較であり、撮影時刻・条件は異なる。

本人の記憶と添付会話から再構成したイメージ。実ログ・逐語引用ではない。

本人の記憶と添付会話から再構成したイメージ。実ログ・逐語引用ではない。

10秒。締め。この後に補足スライドを表示しない。