Twitterも発信中!詳しくはこちら

AIハヤト風の音声アシスタント制作方法│プログラミング初心者でもできたので共有します

広告 このコンテンツは広告を含んでいます。

「プログラミングができないから、作る側にはなれない」——ずっとそう思っていました。でも先日、声で話しかけると返事をして、頼んだ作業を裏で進めてくれるAIアシスタントを作ることができました。しかも、コードは1行も書いていません。この記事では、その4日間の記録を包み隠さず書きます。

※制作にはCodexやClaude CodeなどのAIエージェントを使用します。

スポンサーリンク
目次(クリックでジャンプできます)

作ったもの:声で頼むと、裏で作業が進む相棒

まず、何を作ったのかからお話しします。

話しかけると声で返事をして、頼んだ作業を裏で進めてくれるAIアシスタントです。名前は「ハヤト」と付けました。

使い方はこんな感じです。

「〇〇のフォルダの中、何が入ってるか調べておいて」

ハヤト「了解です。始めました」

「ところで、来週の動画のネタどうしようかな」

ハヤト「……(そのまま雑談が続く)」

ハヤト「さっきの件、終わりました。〇〇が入っていて──」

ポイントは、頼んだあとに待たされないことです。「始めました」とすぐ返ってきて、その間ずっと別の話ができます。そして作業が終わると、向こうから報告してきます。

そして、ここが本題です

私は、このアシスタントのコードを1行も書いていません。

書いたのは Claude Code というAIです。私がやったのは、チャットと声で「こうしたい」「ここが変」とお願いし続けただけ。それで4日でここまで動くようになりました。

私はプログラマーではありません。動画編集を仕事にしている人間です。

きっかけは、大好きなドラマのワンシーンだった

そもそも、なぜこんなものを作ろうと思ったのか。

きっかけは、TBSのドラマ『VIVANT』です。私はこの作品が本当に好きで、シーズン1からずっと見ています。各話、最低2回は見ているほどです。

その劇中に出てきたAIを見たとき、ふと思ったんです。

「これ、自分でも作れないかな」

以前なら「無理だな」で終わっていました。私にはプログラミングの知識がないからです。でも今は Claude Code がある。だったら試してみようか、と。

それだけの動機でした。壮大な計画があったわけではありません。

仕組み:AIを「2つ」に分けたことがすべてだった

技術的な話は最小限にしますが、ここだけは知っておくと面白いと思います。

このアシスタントには、AIが2つ入っています

役割担当やること
耳と口Gemini(音声モデル)聞く・話す・判断する
Claude Codeファイルを触る・調べる・実行する

「1つじゃダメなの?」と思われるかもしれません。

実は、喋るのが得意なAIと、作業が得意なAIは別物なんです。だから「喋る係」と「手を動かす係」に分けました。

そして分けたおかげで、作業をしている最中もずっと喋っていられるようになりました。これが後で効いてきます。

つまずき①:画面を大きくしたら、声が途切れた

ここからが本題の「4日間の記録」です。うまくいった話より、つまずいた話のほうが役に立つと思うので、正直に書きます。

このアシスタントには、光る球体のようなウィンドウを付けました。せっかくなので大きくして表示してみたところ──

AIの声が、ブツブツ途切れるようになりました。

原因を調べてもらったところ、意外なものでした。

絵を描く仕事と、音を受け取る仕事が、同じ列に並んでいたのです。絵が重いと、音がその後ろで待たされてしまう。

測ってもらったら、1フレームを描くのに254ミリ秒かかっていました。間に合わせるには33ミリ秒以内に終わらせる必要があります。約8倍のオーバーでした。

どう直したか

「小さい絵を描いてから、それを引き伸ばす」方式に変えてもらいました。こうすると、ウィンドウをどれだけ大きくしても描画の手間が変わりません。

大きくすれば綺麗になると思っていたのに、逆に喋れなくなる。素朴に驚いた出来事でした。

つまずき②:PCのせいだと思っていたら、自分のバグだった

個人的に、これが一番印象に残っている出来事です。

AIの声が、ときどき音割れするようになりました。私はずっとこう思っていました。

「うちのPCのスペックが足りないのかな……」

正直、買い替えを考えていたくらいです。

ところが調べてもらったら、完全にプログラム側のバグでした。

何が起きていたのか

音声のデータは、少しずつではなくまとめて届きます。そのため、再生の途中で一瞬だけデータが途切れることが普通にあります。

ところがプログラムは、一瞬でも途切れるたびに「溜め直し」を始める作りになっていました。そのたびに0.4秒ほど無音が入り、結果としてブツ切れに聞こえていたのです。

どう直したか

0.35秒以上空いたときだけ、本当の切れ目とみなす」というルールに変えてもらいました。それだけで解決しました。

機械のせいにしていたけれど、原因はこちら側だった。しかも自分では絶対に気づけなかった。これはちょっと、バツが悪くもあり、感動的でもありました。

つまずき③:一番こだわりたい名前を、誤読された

完成してしばらく使っていて気づきました。

ハヤトが「VIVANT」を「ヴィバント」と読むのです。

ヴィバン」でしょ、と。一番こだわりたかったところなのに。

原因は「発音」ではなく「言い回し」だった

これも調べてもらって驚きました。発音そのものは正しかったのです。

問題は、ハヤトがこう言っていたことでした。

「ヴィバンお読みします」

この助詞の「と」が直前の音とつながって、「ヴィバント」に聞こえていたのです。

さらに笑ってしまったのが、その言い回しは、私が過去に書いたメモをAIがそのまま真似ていたということでした。原因は自分だったわけです。

もうひとつ、根の深い問題があった

ついでに人名の読み方も直そうとしたのですが、ここでもっと厄介なことがわかりました。

読み方の一覧表を渡すだけでは、直らないのです。

理由はこうです。AIが出力した「文字」が、そのまま音になります。漢字のまま出力されると、音声合成がその漢字を勝手に読んでしまう。読み方の表は無視されます。

つまり表は「読み方を聞かれたら答える」のには効きますが、「会話の中で名前を口にするとき」には使われていなかったのです。

そこで、表に「話すときの書き方」という列を作り、漢字ではなくカタカナを出力させる方式に変えました。

表記話すときの書き方
乃木卓ノギスグル
熊谷一輝クマガイカズキ

これで、5回試して5回とも正しく読むようになりました。

できたこと:頼んだあと「待たされない」という快感

失敗談が続いたので、うまくいった話も。

最初からやりたかったのは、「頼んだあと、待たされないこと」でした。

普通、AIに何かを頼むと、終わるまで画面を見ていることになります。進捗バーを眺めている時間、けっこう無駄ですよね。

ハヤトは「始めました」とすぐ返ってきて、その間ずっと別の話ができます。そして終わったら向こうから報告してくる。

これが動いたときが、一番「作ってよかった」と思った瞬間でした。

作り方:4,135行のPythonを生んだ環境

具体的に何を使ったのか、まとめます。

役割使ったもの
耳と口Gemini の音声モデル(音声のまま聞いて、音声のまま話す種類)
Claude Code
見た目光る球体のウィンドウ(これも Claude Code が作成)
記憶テキストファイル1枚。メモ帳で直接編集できる

声は30種類から選べたので、実際に喋らせて聴き比べて決めました。

そして最終的な規模がこちらです。

Python 13ファイル・合計 4,135行
そのすべてを Claude Code が書きました。

「記憶がテキストファイル1枚」というのも、個人的には気に入っているところです。覚えてほしいことがあれば、メモ帳で書き足すだけで済みます。

私がやったのは「日本語で文句を言うこと」だけ

では、私は何をしていたのか。

日本語でお願いしただけです。

一番多かったのは、この繰り返しでした。

動かしてみる → おかしいところを言う → 直してもらう

しかも、専門用語は一切使っていません。実際に私が言っていたのは、こんな言葉です。

  • 「声が途切れる」
  • 「音が割れる」
  • 「反応が遅い」
  • 「ここが変」

これで全部通じました。「バッファアンダーランが」とか「レンダリングスレッドが」なんて言葉は知りません。知らないままで大丈夫でした。

気になる費用:待機中を9割カットした話

一番気になるであろう、お金の話です。

項目費用の目安
マイク(自分が話す)0.9円 / 分
AIの発話2.8円 / 分
Claude Code 側サブスクの範囲内(追加課金なし)
※1ドル155円換算。実測値です。

待機中はほとんどタダになった

ここにも工夫があります。

最初は、マイクの音を常に送り続ける作りでした。でもそれだと、黙っている間もずっと課金されるわけです。

そこで「黙っている間はデータを送らない」仕組みを入れてもらいました。結果、送信量が約9割カットできました。待機しているだけの時間は、ほとんどお金がかかりません。

この節約案も、実は Claude Code の側から提案してくれたものです。

⚠️ 注意:APIキーは自分で用意する必要があります

これは無料では動きません。Google AI Studio でAPIキーを取得する必要があります(無料枠あり)。キーは他人に見せない、コードに直接書かない、画面録画時に映り込ませない、の3点にご注意ください。

「作れる人」と「作れない人」の線が動いた

ここからは、私が一番言いたかったことです。

今回作って強く感じたのは、「作れる人」と「作れない人」の境界線が、動いたということでした。

以前は、「プログラミングができる人」だけが作る側でした。できない人は、誰かが作ったものを使うだけ。

でも今は違います。「こういうものが欲しい」と言葉にできれば、形にできる。

頭の中にあるだけだったものが、外に出せる

「あったら便利なのにな」で終わっていたアイデアが、実際に手元で動く。これは、思っていた以上に大きな変化でした。

そして、これが単純に楽しい

正直に言うと、作っている間ずっと楽しかったです。

思いついたことをすぐ試せる。試したらすぐ動く。ダメならすぐ直せる。このサイクルの速さが、とにかく気持ちいいんです。

うまくいかなかった3日間も、振り返れば全部面白かった。

まとめ:あなたのアイデアも、言葉にすれば形になる

最後にまとめます。

項目結果
開発期間4日間
自分が書いたコード0行
生成されたコードPython 13ファイル / 4,135行
システム構成2つのAIによる並列処理
費用マイク0.9円/分・発話2.8円/分+サブスク

私がやったのは、「こうしたい」と言い続けただけです。それでも4日で、思い描いていたものが動きました。

作りたいものがある人へ

もし「あったらいいのにな」と思っているものがあるなら、いきなりプログラミングの勉強を始めなくていいと思います。

まず、言葉にしてみるところからで大丈夫です。

「こういうものが欲しい」「こう動いてほしい」──それをAIに話しかけてみてください。私の場合は、それだけで形になりました。


おまけ:同じものを作りたい方へ

この記事で紹介したアシスタントを、ゼロから作るためのプロンプト集を別途公開しています。実際に私がつまずいた落とし穴をすべて先回りで潰せる内容にしてあるので、同じ失敗を踏まずに済むはずです。

Googleドライブで保存していますので、下記のリンクからご参照ください。

音声アシスタント用プロンプト集

上記のプロンプト集が分かりづらいと思った方は、AIエージェントにそのまま渡せるプロンプトも作りましたので、下記のプロンプトをコピペしてエージェントに依頼してみてください。

````text
声で対話できるAIアシスタントを作ってください。
私はプログラミングができません。コードは全部お任せします。
専門用語を使わず、日本語で、何をしているか都度説明しながら進めてください。

════════════════════════════════════════
■ 作るもの
════════════════════════════════════════
音声対話モデルが「耳と口」、Claude Code CLI が「手」になるアシスタント。
・私が話しかけると音声で返事をする
・作業を頼むと Claude Code を別プロセスで起動して実行させる
・実行中もそのまま会話を続けられる
・終わったら向こうから口頭で報告してくる

════════════════════════════════════════
■ 技術的な前提
════════════════════════════════════════
・Python で作る
・音声モデルは Google の Gemini Live API(音声のまま入力し、音声のまま出力する
  ネイティブ音声モデル)を使う
・APIキーは環境変数から読む。絶対にコードに直接書かない
・設定は config.json にまとめ、私が後から書き換えられるようにする

【モデルの選び方 — 推測で書かないこと】
使えるモデル名は頻繁に変わります。必ず次の手順で実際に確かめてください。
 1. APIのモデル一覧を取得する
 2. bidiGenerateContent(双方向の音声対話)に対応しているものだけに絞る
 3. 翻訳専用・文字起こし専用・ロボット用などを除き、会話用の候補を2〜3個選ぶ
 4. 実際に接続し、同じ質問を投げて応答を比べる
 5. 結果を私に報告し、推奨を1つ挙げる
新しい世代のモデルの方が、指示の守り方・受け答えの自然さ・事実の正確さで
優れていることが多いです。ただし preview 版は仕様変更の可能性があるとも伝えてください。

(参考:OpenAI の Realtime API でも作れますが、日本語の固有名詞の発音が崩れやすく、
 音声の単価も数倍高いという実測結果があります。まず Gemini 側で作ってください。
 あとで切り替えられるよう、config.json の provider 一つで両対応にしておいてください。)

════════════════════════════════════════
■ 一番大事な要件:待たされないこと
════════════════════════════════════════
・タスクを投げる関数は即座に返り、すぐ会話に戻れること
・Claude Code はバックグラウンドで動き続けること
・完了したらアシスタントの方から自発的に報告してくること
・「今どうなってる?」と聞いたら状況を答えられること
・「やめて」と言ったら中断できること

実装のヒント:Claude Code CLI は次の形で非対話実行できます。
  claude -p "指示文" --output-format stream-json
これを子プロセスとして起動し、出力を読みながら進捗を拾ってください。

注意:Claude Code の中からこのアシスタントを起動すると環境変数が干渉して
認証に失敗します。子プロセスに渡す環境変数から CLAUDE_CODE_ 系を取り除いてください。

════════════════════════════════════════
■ 既知の落とし穴(実機で判明したもの。先回りで潰すこと)
════════════════════════════════════════
どれもコードを読むだけでは気づけず、動かして初めて出るものです。

【1】発話の終わりが判定できず永久に待つ
 節約のため無音を送らない作りにすると、サーバからは「まだ喋っている途中」に見えて
 永遠に応答が始まりません。
 → サーバ側の発話区切り判定を無効にし、こちらから「話し始め」「話し終わり」を
   明示的に通知する方式にする。
 → 何秒黙ったら終わりとみなすかは config.json で変更可能に(既定3秒)。

【2】ツール呼び出し後に固まる
 Gemini はツールを呼んだあと「ターン完了」を送らず、こちらの結果を待ちます。
 こちらも「ターン完了」を待つ作りだと、互いに待ち合って停止します。
 → ツール呼び出しを受け取った時点で、こちら側で区切りを立てる。

【3】画面描画が音声を殺す
 画面表示と音声受信を同じ流れで動かすと、描画が重いとき音が途切れます。
 実測で1フレーム254ミリ秒かかっていました(許容は33ミリ秒)。
 → 固定サイズの内部キャンバスに描いてから拡大する方式にし、
   ウィンドウの大きさと描画コストを切り離す。
 → フレーム時間を実測し、重いときは自動でコマ数を落として音声を優先する。

【4】音が途切れる・音割れする
 再生バッファが一瞬でも空になるたびに溜め直すと、音声はまとめて届くので
 発話の途中で普通に空になり、そのたび無音が入ってブツ切れになります。
 → 0.35秒以上空いたときだけ「発話の切れ目」とみなす。

【5】思考テキストが字幕に漏れる
 → 思考の出力をオフにし、思考フラグが付いたパートは読み飛ばす。

【6】無音を送って課金がかさむ
 → ローカルで音の大きさを見て、黙っている間は送信しない仕組みを入れる。
   暗騒音を自動学習し、それより一定以上大きいときだけ送る。
   どれだけ削減できたか表示できるようにする。

【7】しばらく放置すると勝手に終了する
 リアルタイム音声接続にはセッション時間制限があり、サーバから切断されます。
 切断でアプリごと終了する作りだと「ターミナルは残っているのに本体だけ落ちる」
 という状態になります。
 → 私が終了を選んでいない限りアプリを終了せず、自動で繋ぎ直す。
 → サーバから切断予告が来たら、切れる前に先回りして繋ぎ直す。
 → 再接続時はセッション設定を送り直し、接続をまたぐ状態はリセットする。
 → ただし繋いだ直後にまた切れる異常時に無限再接続しないよう、
   再試行の間隔を空ける(最大30秒程度まで広げる)。

【8】装飾記号で音声が壊れる ★見つけにくい
 設定ファイルや資料に ** などの装飾記号があると、モデルが書式ごと真似て
 発話テキストに記号を混ぜ、音声合成が壊れます。
 実際に、特定の質問で音声が一切返らなくなりました(無音のままターン終了)。
 → 渡す資料には装飾記号を使わない。
 → システムプロンプトにも「装飾記号を文章に混ぜない」と明記する。

════════════════════════════════════════
■ 起動まわり(プログラミングを知らない人でも使える形に)
════════════════════════════════════════
・すべてエクスプローラーからダブルクリックで完結すること
・.ps1(PowerShell)は使わない。Windowsの実行ポリシーで既定ブロックされ、
  初心者が必ず詰まります。起動用はすべて .cmd にする
・.cmd の中身は ASCII のみ。バッチファイルに日本語を書くと文字コードの
  食い違いで if ブロックごと壊れます(実際に壊れました)
・日本語メッセージはすべて Python 側で出す
・.cmd の先頭で chcp 65001 し、Python は UTF-8 で出力する

作ってほしいファイル:
 setup.cmd   … 仮想環境を作り、必要なパッケージを入れ、最後に環境チェック
 run.cmd     … 起動
 set-key.cmd … APIキーを貼り付けて保存。保存前に本当に使えるキーか実際に
               問い合わせて検証し、駄目なら保存せず理由を教える。
               コピー時に紛れ込む余計な空白や見えない文字は自動除去する
 doctor.py   … 何が足りないかを日本語で一覧表示する環境チェック

════════════════════════════════════════
■ 権限とコスト表示
════════════════════════════════════════
【権限】
Claude Code の権限モードを acceptEdits にすると、自動許可されるのは
「ファイルの作成・編集」だけです。ウェブ検索やシェルコマンドは拒否されます。
→ 必要なものだけ --allowedTools で個別に許可する形にする。
→ 全部通す bypassPermissions は使わない。
  声の聞き間違いがそのまま実行されると危険なため。

【コスト表示】
・起動してからの累計料金を画面に常時表示(円とドル)
・音声モデルと Claude Code の合計で
・コンソールに /cost と打つと内訳が見られるように
・終了時にも表示

════════════════════════════════════════
■ 記憶させる仕組み(memory.md)
════════════════════════════════════════
・memory.md というテキストファイル1枚にする
・起動のたびに、その内容をシステムプロンプトに差し込む
・メモ帳で直接編集できること
・声で「これ覚えておいて」と言ったら追記されること

【注意1】見出しを探すとき、# の数(見出しレベル)を決め打ちにしないこと。
決め打ちにすると既存の見出しを見つけられず、同じ名前の見出しを新しく作り、
矛盾した情報が2箇所に残ります。実際にこれで誤作動しました。

【注意2】memory.md の中で ** による装飾を使わないこと(落とし穴8)。

【注意3】memory.md の内容は、システムプロンプトの一番最後に置くこと。
長い指示文の途中に埋もれると、モデルが参照し損ねます。

════════════════════════════════════════
■ 固有名詞を正しく読ませる ★意外な落とし穴
════════════════════════════════════════
人名・社名・作品名を高い確率で誤読します。
しかも「読み方の一覧表」を渡すだけでは直りません。

【原因】
モデルが出力した「文字」が、そのまま音になります。
漢字のまま出力されると、音声合成がその漢字を勝手に読み、読み方の表は無視されます。
表は「読み方を聞かれたら答える」のには効きますが、
「会話の中で名前を口にするとき」には使われません。

【対策】
memory.md の読み方の表に「話すときの書き方」という列を作り、カタカナを書く。
そのうえでシステムプロンプトに
「表にある固有名詞は、漢字で書かず、そのカタカナをそのまま書く」と指示する。

例:
 表記     | 話すときの書き方 | 読み
 東海林   | ショウジ         | しょうじ
 一色     | イッシキ         | いっしき

【もうひとつ】
固有名詞の直後に助詞の「と」が来ると、音が繋がって別の語に聞こえます。
(「〇〇とお読みします」→「〇〇ト」に聞こえる)
確認するときは「読み方は〇〇で合っていますか」のように、
固有名詞の直後に「と」が来ない言い方にさせてください。

════════════════════════════════════════
■ 話し方
════════════════════════════════════════
システムプロンプトに以下を入れてください。

・常に日本語。テンポよく、1〜2文で短く。長い前置きはしない
・「〜ですね」「説明します」「承知しました」のような前置きを置かず、
  いきなり本題から話す
・知っている内容の出どころを口に出さない。
  「メモリに登録されている情報では」「資料によると」は言わない。
  自分が元から知っていることとして答える
・知らないことは言い訳を並べず「そこまでは分かりません」と短く言う。
  知ったかぶりで作り話をしない
・記号やURLをそのまま読み上げない。装飾記号を文章に混ぜない
・パスは「〇〇フォルダ」のように言い換える
・相手が考え中のときは黙って待つ。相槌を連発しない
・破壊的な操作(大量削除、上書き、git push)を含む依頼は、
  実行前に必ず口頭で確認を取る

════════════════════════════════════════
■ 検証のしかた ★ここを省略しないこと
════════════════════════════════════════
「読み方を答えて」と聞くテストでは正しく答えるので、直った気になります。
実際の使用条件と違うためです。必ず次の条件で確かめてください。

・毎回まっさらな接続を張る(起動直後の1問目と同じ条件)
・読み方を聞かず、普通の質問をする
・出てきた音声をファイルに書き出し、文字起こしして実際の音を確認する
 (faster-whisper などを使う。字幕テキストが正しくても実音が違うことがあります)

この方法で測ったところ、対策前は5問中0問しか正しく読めていませんでした。

作ってほしい検証ツール:
 smoke_test.py … マイクを使わず、接続・音声生成・ツール呼び出し・完了報告を検証
 doctor.py     … 環境チェック(キー・パッケージ・Claude Code のログイン状態)
 音声デバイスの一覧を表示するコマンド

════════════════════════════════════════
■ 進め方
════════════════════════════════════════
1. まず全体の構成を、専門用語なしで説明してください。私が納得してから実装に入ること
2. モデルの候補を実際に接続して比較し、推奨を報告すること
3. 実装は段階的に進め、区切りごとに「今どこまでできたか」を教えてください
4. 未検証のものは「未検証」と必ず明示してください
5. 完成報告には、途中で何を失敗してどう直したかも書いてください
6. 最後に、実機で分かった落とし穴を README にまとめてください

作業を始める前に、分からない点があれば質問してください。
````

この記事の数値について

記事中の数値はすべて、実際の開発環境での実測値です。

  • 開発期間:2026年8月27日〜30日
  • コード規模:Python 13ファイル / 4,135行
  • 描画時間:1フレーム254ミリ秒(許容33ミリ秒)
  • 音声判定:0.35秒
  • 通信削減率:約90%

なお、AIのモデル名・料金・仕様は変動します。導入を検討される場合は、必ず公式の最新情報をご確認ください。

この記事が気に入ったら
いいね または フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次(クリックでジャンプできます)