MulmoClaudeの音声入力で、自分専用のW杯グループステージ管理アプリを作る

YouTubeで開く ↗
概要

開発者の中島氏は、前回に続いて、MulmoClaudeで「コレクション」を使ったアプリを作る実演をした。コレクションはデータベースアプリと呼んでもよいものである。題材はサッカーW杯のグループステージだ。出場チームの一覧から始め、旗の画像、勝敗と得失点、グループごとのカード表示、試合のコレクションまで、曖昧な日本語の注文だけで作っていく。デモをしやすくするため、この回から音声入力も使っている。

11分で読めます

この記事では、作業の流れ、途中で起きた誤り、そして中島氏が強調した「個人向けのバイブコーディング」についての考え方を順に追う。

7:00

音声入力の仕組み

デモで使う音声入力機能は、収録当日の朝に追加したばかりだという。この機能自体もバイブコーディングで作った。OpenAIのWhisperをローカルで動かし、受け取った音声を渡して文字に起こす仕組みである。

ローカル実行を選んだ理由として、中島氏は二つの事情を挙げた。Appleの組み込みの音声入力は出来がいまひとつである。一方、外部サービスを使うと、高くはないものの使うたびに課金が発生する。実際に使ってみた感想は「結構いい」というものだった。

デモ中はマイクを毎回切っている。マイクを入れたまま説明をすると、その声がノイズとして入ってしまうからだ。一人で作業するときは入れっぱなしでも構わないと中島氏は話している。

0:43

最初の注文:48チームのコレクション

最初の依頼は、ほぼ次のような話し言葉だった。「ワールドサッカーが今盛りなので、グループステージにいる全チームのコレクションを作ってほしい」。

MulmoClaudeはコレクションが何かを知っている。そのため、この程度の指示でも作業を始められる。中島氏の説明では、LLMは文脈を読むのが上手で、実際にネット検索してグループステージの出場チームを調べてから作る。スキーマ、つまりデータベースにどんなフィールドを持たせるかも、かなり勝手にうまく決めてくれる。気に入らなければ後から注文を出せばよい、というのが中島氏の姿勢である。

作業の途中には、AIの説明が逐一表示された。スキーマの書き方を記した資料を読み、作り方が分かったので作る、という内容である。グループの項目も追加すると述べていた。中島氏が期待していたのは、少なくとも国名とグループが入った48チームのコレクションだった。

出来上がったコレクションには次の項目が並んだ。

  • 旗(絵文字)
  • 国名(英語・日本語)
  • グループ名
  • 連盟
  • ランク

グループごとに並べ替えると、Aグループ、Bグループと区切って確認できた。連盟の項目について、中島氏は「そういうのがあるんだ、知らなかった」と反応している。

3:45

旗を絵文字から画像ファイルへ

旗は絵文字で作られていた。中島氏はひとまず許容したうえで、次の注文を出した。「旗が絵文字なのが気に入らないので、ネットから探して、それぞれの国の旗をイメージファイルとして持つようにしてほしい」。絵文字では、大きく表示したときにきれいに見えないからだという。

ここで中島氏は、内部で何が起きているかを補足した。実際に作られているのはネイティブなプログラムコードではない。JSON形式で書かれたDSL、すなわちスキーマファイルである。それに加えて、AIはさまざまな作業をこなす。厳密に言えばバイブコーディングの一種だが、エンドユーザーはコードを書いていることを意識せずに注文するだけでよい。中島氏はこの点を、従来のプログラミングとの大きな違いとして語った。

AIは各国の旗画像をダウンロードし、スキーマを絵文字から画像ファイルへ変更した。中島氏は「全部生だから、うまくいくか分からない」と前置きしていた。普段使っていてもうまくいく時といかない時があるので、焦らずに見るという。結果として、各国の旗は画像として入った。

カスタムビュー:グループAからLのカード表示

次はカスタムビューの実演である。依頼内容は、カード型のグリッドデザインで、グループAからLまでをカードに分け、各カードにそのグループの4チームを表示する、というものだった。

作業中、AIは試行錯誤を見せた。うまくいかないのでデータ構造を変える、といった工夫である。中島氏は「100%正しいとは限らないが、色々工夫して一生懸命やってくれる」と評した。

作ったビューは、ローカルの「コレクション」の領域に追加される。お気に入りに登録すると、そこからビューを開ける。チャットはバックグラウンドで動いているので、放っておいても作業は進む。完成した「グループ表」を開くと、中島氏はほぼ期待通りの出来だと評価した。

11:50

勝敗・得失点を加え、実際の数字で埋める

カードには連盟の情報も載っていた。中島氏はそれを不要と判断し、代わりに勝敗を入れたいと考えた。依頼の内容は、各チームの現在の勝ち・引き分け・負けの数と、得点・失点をフィールドに加え、ネットから実際の数字を取ってきて埋める、というものだった。

裏で動いているのはClaude Codeである。ネットから情報を取ってくる作業は、旗の画像と同じくとても得意だと中島氏は言う。

作業の途中で、AIは自分の誤りを見つけて修正した。出場チームの扱いに問題があり、コスタリカを削除して一時47チームになった。その後、正しいチームを追加して48チームに戻った。中島氏は「こういう間違いもする」「面白い」と受け止め、それも含めて見てほしいという姿勢だった。順位の並べ替えやデータの再構成にも手間取っている様子が、画面にそのまま表示された。

コレクションの表には、勝敗、得点、失点の数が入った。得失点差は計算で出されている。

13:48

指示していないのにビューが更新された

中島氏は続けて、グループ表にも得失点差を出してもらおうと考えていた。ところが、その指示を出す前にグループ表が更新されていた。カードには勝敗と得失点差が並び、グループAからLまでそろっている。最初のカードビューにあった連盟の情報は外れていた。

中島氏はこれを、文脈から自分のやりたいことを読み取った結果だと受け取っている。最初のビューにあった「どの連盟に入っているか」は、どうでもいい情報だった。勝敗や得失点のほうが明らかに良い、と中島氏は話す。

14:53

緑の枠の意味を問い直す

カードを見ると、各グループの1位と2位に緑の枠が付いていた。中島氏が意味を尋ねると、AIは上位2チームが進出権内であることを示すと答えた。

中島氏は、これでは良くないと考えた。上位2チームを緑にしても意味がないので、勝ち上がりが確定したチームだけを緑にするよう求めた。その時点で確定チームがいるかどうかは、中島氏自身も確信がなかった。

ここで中島氏は、こうしたやり取りの性質を説明している。ウェブサイトを作るとき、企画担当者はエンジニアにこういう話し方をする。それと同じ感覚で、コードを書けない普通の人でも作れるのがこの仕組みの良いところだという。

変更後の表では、メキシコやアメリカなど進出が決まったチームだけが緑になった。オランダや日本はまだ決まっていない状態として表示された。

10:20

個人向けアプリと著作権の考え方

旗やデータをネットから集める流れの中で、中島氏は著作権についての考えを述べた。これは個人向けのアプリで、どこかに公開するものではない。だから著作権にそれほどこだわる必要はない、というのが中島氏の立場である。YouTubeで見せる程度なら構わないだろうとも話した。

一方、サービスとして提供するなら事情は変わる。旗の画像の著作権が問題ないかを確認する必要がある。サッカーではあまり言われないだろうが、オリンピックでは無断で情報を出すと組織委員会から怒られることがある、とも付け加えた。

こうしたバイブコーディングを、中島氏は「バイブクラフティング」と呼んでいる。個人が楽しむアプリにぴったりで、その用途ならネットから情報を取ってくることも問題ない、という考えである。例として、以前作った「自分が見た映画の記録」のコレクションも挙げた。そこに使った画像も、厳密にはどこかに著作権のある絵である。それでも、個人がAIに取ってこさせて使う程度なら問題ないと中島氏は述べた。

18:27

二つ目のコレクション:グループステージの全試合

中島氏はもう一つコレクションを作ることにした。グループステージの試合を1試合ずつ入れるもので、条件は次の通りである。

  • 対戦する2チームが分かる
  • 会場が分かる
  • 終わった試合には結果が入る
  • チーム名は、最初に作ったチームのコレクションを参照(リファレンス)する

中島氏は、この依頼を「結構難しいこと」だと位置づけた。肝は「参照」にある。データベース同士はつなげることができる。チーム名や旗の情報は、すでにチームのコレクションにある。それを試合のコレクションに重複して持たせることもできるが、参照して表示するほうが効率がよく、データもばらけない。中島氏はこれをリレーショナルデータベースのテーブル同士の関係にたとえ、同じことがMulmoClaudeでもできるようにしていると説明した。

試合数は、中島氏がその場で計算した。4チームの総当たりなら4×3÷2で6試合、それが12グループで72試合になる。

21:26

待ち時間と、裏で動くAIの作業

今回はスキーマ作成とデータ投入を一度にまとめて頼んだ。そのため、AIは先にデータを集めてからテーブルを作る流れになり、時間がかかった。中島氏は、スキーマだけ先に作らせてからデータを入れさせる進め方もできると補足している。

待っている間、中島氏は取得途中の試合結果を眺めて話した。ブラジルとモロッコが引き分けたこと。オランダと日本が引き分けたのは良かったこと。日本はあとスウェーデンに勝てば、あるいは引き分けでも進めるかもしれないこと。ただし、そうした見通しは解説者に任せると話を切り上げた。

MulmoClaudeはマルチタスクで動くので、テーブル作成の会話が裏で進んでいる間に別のことをしていても構わない。作業の途中では、順位表との整合性をとるためとみられるPythonスクリプトをAIが自分で書いて実行していた。中島氏はPythonを書くよう頼んでいない。整合性を保つための使い捨てのコードを書いて走らせているのだろう、というのが中島氏の推測である。

画面には、AIがどのツールを呼び出しているかを表示する欄もある。主にデバッグ用で、エンドユーザーにはあまり関係ないが、見ると何が起きているか大体分かるという。最終的なAIの報告は、50試合が終了済み、22試合が予定、というものだった。データはJSONファイルとして書き出された。

25:01

試合コレクションの確認と、自分の勘違い

完成した「グループ試合」には、グループ、キックオフ予定、開催地などが並んだ。カレンダービューは元々組み込まれているので、それで表示すると、いつどこで試合があるかが分かる。収録日は24日で、その日はメキシコ対スイス戦などが予定されていた。日本の試合は翌日だと中島氏は話している。カスタムビューも作れるが、無理に作る必要はないとこの時点では判断した。

続いて中島氏は、対戦相手が思った通りに作られていない、と指摘しかけた。「メキシコ対韓国」のように文字列で入っていて参照になっていない、と注文を出そうとしたのだ。しかし話している途中で、ホームもアウェイもきちんと参照になっていることに気づいた。中島氏は、これは自分の勘違いだったと訂正し、指示を取り消している。

参照が効いていることは、画面上で確認できた。試合のコレクションでカナダをクリックすると、チームのコレクションのカナダの行へジャンプする。

今後の運用についても説明があった。試合結果は手で入力してもよいし、Claude Codeに頼んでアップデートしてもらってもよい。その際は、試合のコレクションだけでなくチーム側の勝敗も更新するよう頼めば、きちんと両方を直してくれる設計になっているという。

28:37

収録後の追記:誤った日程の修正とカスタムビュー

収録の最後に、中島氏は後日の作業を補足した。AIが取ってきた試合スケジュールの情報にはかなりの誤りがあったので、修正させたという。さらに、これから試合を見るのに便利なカスタムビューも作ってもらった。そのビューでは、試合結果に加えて、今日や明日のどの試合が何時から行われるかが一目で分かるようになった、と中島氏は締めくくった。