はじめに
キーボードから手を離したまま、AI に仕事を頼めたら便利だと思いませんか。
- 料理をしながら「さっきのバグ、原因わかった?」と聞く
- 紙の資料を手に持ったまま「これ見て」とカメラに映して相談する
- ソファで iPad を持ったまま、Mac で動いている作業に「承認」と答える
こうした「声だけで AI と一緒に仕事をする」体験を、Mac の上で実用になる形で組み上げたのが VoiceTerminal です。ターミナルを内蔵した1枚窓の macOS アプリで、中で Claude Codeが動き、それを声で操作します。音声入力だけではなく、実際にClaudeと音声会話しながらコーディングを進める環境です。
この記事では、VoiceTerminal の構想と、自分で使っていて「これは便利だ」と感じた目玉機能を中心に紹介します。内部の実装より、どんな場面で何が嬉しいのかについて書きました。雰囲気が伝わればうれしいです。
VoiceTerminal は個人で開発しているアプリでApp Store では配布していません自分の Mac でビルドして使っています。VoiceTerminal自体もVoiceTerminalで作っています。
声で頼んで、耳で聞いて、声で返す
目指しているループ
VoiceTerminal で目指しているのは、次のループを止まらずに回すことです。
- 口頭で指示する
- Claude が作業する
- 報告を読み上げてもらう
- 聞いた内容をもとに、また口頭で指示を出し仕事を回していく
言葉にするとあたりまえですが、実際にやってみると「声だけで回る」状態を作るのは意外と大変でした。どこか1箇所でも「結局キーボードに手を伸ばす」場面が残るとループが途切れてしまうのです。
詳細は画面、要点は声
VoiceTerminal の設計で大事にしているのは、画面と声の役割分担です。
| 担当 | 中身 |
|---|---|
| 画面 | Claude の応答の全文、コード、表、ログ |
| 声 | 「何が起きたか」と「次に何をするか」の1行だけ |
人間が判断するための最低限の情報を読み上げてもらいます。
AI の応答をそのまま全部読み上げると長すぎて聞いていられません。そこで Claude には、応答の先頭に「読み上げ用の1行」を書いてもらう決まりにしています。VoiceTerminalは【AI】を発見すると、それを読み上げます。
【AI】ログイン画面の余白を8ポイント詰めました。次はどうしますか。
【読み】ログインガ'メンノ/ヨハ'クヲ/ハチポイ'ント/ツメマ'シタ、ツギワ'/ドウシマ'スカ
【AI】 の行が読み上げる文、【読み】 の行がその読み仮名です。声で聞くのはこの1行だけで、詳細情報が知りたければ画面を見ます。やってみると分かりますが詳細情報まで必要な場面って、あまり無いんです。読み仮名についてはあとで触れます。
MCP をつなげば、Mac のあらゆる作業が声の対象になる
VoiceTerminal は Xcode 開発のための道具として作り始めましたが、今は「声で Mac を操るための入口」と考えています。
Claude Code には MCPやCLIでXcode、カレンダー、Slack、カメラ……など、さまざまな道具をつなげます。つないだ先はすべて、VoiceTerminal から声で動かせる対象になります。
| 層 | 役割 |
|---|---|
| VoiceTerminal | 声を文字にしてターミナルに入れる。応答を読み上げる。今の状態を見せる |
| Claude Code | どの道具を使うかを判断する |
| MCP でつないだ道具 | 実際に動く先(Xcode、カレンダー、カメラなど) |
VoiceTerminalアプリ自身はつなぎ先を一切知りません。道具を増やしてもアプリ側は変わらず、声の経路は「ターミナルに文字を書く」の1本のままです。この割り切りのおかげで、アプリは声と端末のことだけに集中できています。
VoiceTerminal自身は1枚のウィンドウアプリですが、複数のウィンドウを開いて複数のプロジェクトにアサインすることができます。それぞれのウィンドウがフォルダ(またはリポジトリ)に紐付けられていると考えると分かりやすいです。
画面の一番下には、今の状態を示す1行を常に出しています。声の操作は目に見えないので、「いま聞いているのか、考えているのか、喋っているのか」の状態がここで分かるようにしました。状態は色でも示していて、聞き取り中は赤、認識中は黄、読み上げ中は青です。遠目でも分かります。
使ってみるとこんな感じ
まずは、ある日の作業の一場面を会話で見てみます。
ユーザー: アプリのログイン画面のボタンをもう少し大きくして
VoiceTerminal: ログイン画面のボタンを大きくしますね。
…(Claude が作業中。画面にはコードの差分が流れる)…
VoiceTerminal: 【AI】ボタンの高さを44ポイントに広げました。確認しますか。
ユーザー: うん、スクショ撮って
VoiceTerminal: 【AI】許可を待ってます。1番は承認、2番はいつも承認、3番は却下です。
ユーザー: 承認
VoiceTerminal: スクリーンショットを撮りました。画面に出しています。
会話にはいくつかのAIモデルを使っていますが、最初の「ログイン画面のボタンを大きくしますね。」はClaude の返事ではなく、ローカルLLMを使って「何を聞き取ったか」を復唱させています。その後の考え抜いた報告は Claude が書いた 【AI】 の行です。人間とスムースに会話を進めるために、いくつかのAIを用途別に配置しているのもVoiceTerminalの特徴です。
この会話に出てきた仕掛けを含めて、目玉機能を順に紹介します。
目玉機能
1. 復唱は2秒以内
声で頼んだあと、何も返ってこない時間はとても不安です。「聞こえたのかな」「もう一回言うべき?」と迷ってしまいます。
ClaudeはローカルAIではありませんから、実際に測ってみると話しかけてから最初の声が返るまで 10秒近くかかります。大半は Claude が応答を考えている時間で、ここはアプリの仕組みでは縮められません。
そこで、Claude を待たずに、手元の Mac で動く小さなLLM(Ollama 上の Gemma 3 4B)に短い復唱を作らせて、先に鳴らすことにしました。モデルの応答は 0.4〜0.5 秒ほどで、音声合成と合わせて2秒以内に「何を聞き取ったか」が返ってきます。
ユーザー: さっきのエラー、原因を調べて
VoiceTerminal: (2秒以内)さっきのエラーの原因を調べます。
…
VoiceTerminal: 設定ファイルの読み込み順が原因でした。直しますか。
- 聞き間違いにその場で気付ける(「いや、そうじゃなくて」とすぐ言える)
- 無音の待ち時間が消えて会話らしくなる
- 中身のある返事は今までどおり Claude が返す
Claude が直前に喋った文も一緒にGemmaに渡しているので、それなりに意味の通る復唱が返ってきます。
2. プロジェクトごとに「担当の声」
複数のVoiceTerminalウィンドウを開いてプロジェクトを並行して回している時、報告の声が全部同じでは、どの仕事の話なのか聞き分けられません。
そこで人間のチームと同じように、プロジェクトごとに担当者(声)を置けるようにしました。
(ずんだもんの声) アプリのビルドが通りました。インストールしますか?
(四国めたんの声) ブログ記事の下書きができました。確認しますか。
画面を見ていなくても、声を聞いた瞬間に「あ、これはアプリの方の話だな」と分かります。
読み上げには VOICEVOX と AivisSpeech の2つのエンジンを使っていて、両方の声を1つのリストから選べます。経理関係の仕事には落ち着いた女性の声を割り当てる。設計の仕事は元気な男性の声にするなど、好きな声をプロジェクトに割り当てられるのは、使っていて地味に楽しく便利なところです。
3.ニックネームで窓を呼ぶ
ウィンドウを何枚も開いているとき、プロジェクトに付けたニックネームを呼ぶと、その窓が前に出てきて名乗ります。私が常に起動しているのは「総務部長」というウィンドウ。会社の管理業務についてなんでも相談できます。
ユーザー: 総務部長、聞こえる?
VoiceTerminal: (その窓が前に出て)はい、総務部長です。
ユーザー: 総務部長、状況を教えて
VoiceTerminal: はい、総務部長です。中間納税が1件残っています。
この返事は Claude を通さずアプリ自身が答えています。Claude に聞くと「聞こえる?」への返事に10秒近く掛かることがあるからです。誤作動しないように、いくつか決めごとを置いています。
- 登録したニックネームが文頭にあるときだけ反応する
- 「ジャービスについて調べて」のような普通の文は、そのまま Claude への指示として届く
4. 声で実行許可に答える
Claudeは、コマンドの実行やファイルの変更の前に「実行してよいですか」と許可を求めてきます。ここで毎回キーボードに手を伸ばしていては、声のループが途切れてしまいます。
VoiceTerminal では、許可を求められたことを読み上げ、画面に出ている選択肢もあわせて伝えます。人間は声で答えるだけです。Claudeに仕事を投げて、人間も別の作業をしている時に便利なヤリトリです。
VoiceTerminal: 許可を待ってます。コマンド実行。
ユーザー: 承認 → 1番を選ぶ
ユーザー: いつも承認 → 2番(今後は聞かない)を選ぶ
ユーザー: 却下 → 断る
ユーザー: 3番 → 番号で選ぶ
ここで大事にしたのはノイズ語の対策。何も待っていないときの「承認」という単語を許可として扱わないことです。声で操っている人は画面を見ていないので、たまたま口にした「承認」で勝手に許可が下りても気付けません。
許可を待っている間だけ答えを受け付けるゲートを開け、閉じている間の「承認」は普通の言葉として Claude に届けます。ゲートは一定時間で自然に閉じますし、キーボードで答えた場合もそれを検知して閉じます。
5. 声紋で本人の声だけを通す
常に耳を澄ませているVoiceTerminalアプリには、困った弱点があります。テレビの声や、同じ部屋にいる別人の会話まで拾ってしまうことです。天気予報の「今日は雨が降るでしょう」がそのまま Claude への指示になっては困ります。
そこで、あらかじめ自分の声紋を学習しておき、声が本人に近いときだけその文章を採用する機能を入れました。設定画面に声紋登録が内蔵されています。
テレビ: 次のニュースです。
(ステータス行には「他の人の声として聞き流しました」と表示される)
ユーザー: テストを流して
VoiceTerminal: テストを流します。
Macの内蔵マイク、AirPodsなど利用できるマイクごとに性能が違うので、それぞれの声紋を登録する手間は掛かりますが、効果は抜群です。自分の隣りでYoutubeが流れていても、声を取り違えずに認識するようになりました。
6. AI が「見せて」とカメラ起動をお願いしてくる
人間と AI が同じものを見ながら話せたら相談の質がぐっと上がります。VoiceTerminal には、Claude の側から「見せてください」とカメラ撮影を依頼してくる仕組みがあります。アプリにカメラMCPが内蔵されているので、Claude が「映像が必要だ」と思ったときに自分からお願いしてきます。
ユーザー: 描いたイラストの配色、どう思う?
VoiceTerminal: イラストをカメラに見せてください。
(カメラの小窓が開く)
ユーザー: コレだよ
(人間の声に反応して撮影。写真が Claude に渡る)
VoiceTerminal: 背景の青が強いので、人物が沈んで見えます。彩度を下げてみませんか。
途中で気が変わったら、そのまま別のことを言えば大丈夫です。
VoiceTerminal: イラストをカメラに見せてください。
ユーザー: やっぱりいいや。それより色の組み合わせの基本を教えて
(撮らずに、この発言がそのまま Claude に届く)
「取り消し」の言葉を覚えなくても、撮らない限りは発言がそのまま結果として返るので、Claude が話題を移してくれます。
人間側から映像を見て欲しいと頼むこともあります。「これ見て」と言えば、VoiceTerminalがカメラで1枚撮って、写真を取り込んでくれます。
7. ダッシュボードの Issue や TODO を選んで、そのまま議題にする
VoiceTerminalのコンパニオンアプリとして、AirPodsやApple Watchから音声を取り込んでテキスト認識し自動的にカード型メモを作るアプリがあり、VoiceTerminalウィンドウの上側にカードが自動整列します。例えるとホワイトボードに貼ったポストイットのような感じです。
ウィンドウの右側には、ダッシュボードも置けます。プロジェクトの GitHub Issue と、やることリスト(TODO)がカードで並びます。
これらの中から気になるカードをいくつか選び、「これについてチャット」とすると、選んだものがまとめて議題としてClaudeに送られ、ディスカッションを始めることができます。
これについてチャットしたい。それぞれの概要を理解してからチャットを始めよう。 1) #14 …… 2) 英語化 ……
Issue の中身をコピペでClaudeに貼る手間は無く、溜め込んでいた話題を簡単にClaude に渡せます。カードをターミナルにドラッグして入れることもできます。
8. 起動すると、前回の続きを思い出している
AI との作業で地味に面倒なのが、新しいセッションを始めるたびに「昨日どこまでやったんだっけ」を説明し直すことです。
VoiceTerminal は、起動したときに前回の作業の引き継ぎメモを読み、今回のターンを始めます。起動するだけで、Claude の方から前回の続きを話してくれます。
(アプリを起動)
VoiceTerminal: 前回は読み上げの遅れを直すところまで進みました。続きをやりますか。
ユーザー: うん、続けて
ウィンドウを閉じるときには今までの経緯をメモに残してから閉じます。引き継ぎメモは、ローカルの知識記憶ベース(dejavu という自作のツール)に保存しています。
ほかにもこんなことができます
目玉とまではいかないけれど、毎日使っていて助かっている機能を並べます。
| 機能 | どんなときに便利か |
|---|---|
| 「ストップ」で止める | Claude が見当違いの方向に走り出したとき、声だけで止められる |
| 声でプロジェクトを切り替える | 「◯◯に切り替え」と言うと、確認のうえでそのフォルダに移り、Claude を起こし直す |
| AirPods のステムで一時停止 | 人が来た・電話が来たときに、耳元を触るだけで聞き取りを止められる |
| iPad を遠隔の窓にする | Mac で動く作業を、iPad の画面とマイク・スピーカーで操れる。ソファからでも使える |
| Apple TVで全体確認できる | Mac をAirPlayすればVoiceTerminalを大画面で表示可能。複数ウィンドウをフルスクリーンで作業していても「総務部長、聞いてる?」でウィンドウ切り替えができる |
| メモ欄 | 長い指示を下書きしてから、まとめて Claude に送れる |
| 使用量の表示 | Claude の利用枠をどれくらい使ったかがタイトルバーに出る |
iPad の接続は少し面白い作りです。iPad の中ではシェルも Claude Code も動かせないので、Macの「画面・タッチ・マイク・スピーカー」部分だけをiPadに切り出して担当します。画面は画像ではなくターミナルの出力をそのまま送っていて、通信量は画像で送る場合の数百分の一で済みます。
読み上げのこだわり: 誤読させない
声のループを使い込むほどに気になってくるのが、読み上げの誤読です。音声合成エンジンの読み推定は文脈を見ないのでVOICEVOXは「一行」を「いっこう」と読んだりします。文章を見ずに耳だけで聞いていると、何を言っているのか分かりません。
そこで、先ほど紹介した 【読み】 の行で、Claude 自身に読み仮名とアクセントを書いてもらっています。文の意味を分かっているのは Claude なので、読み方を決めるのも Claude に任せるのが一番確実でした。
【AI】設定の読み込みを直しました。
【読み】セッテイノ/ヨミコミヲ/ナオシマ'シタ
音声エンジンが落ちていたり合成に失敗したりしたときは、macOS 標準の音声に切り替えて喋ります。声が変わってでも喋るほうが、黙るよりずっとましだからです。
苦労したこと
設計の工夫や苦労話を少し紹介します。
自分の声を自分で拾う「回り込み」との戦い
聞いて喋るアプリには宿命的な問題があります。自分の読み上げをマイクが拾い、それを指示として Claude に送り返してしまう現象です。「ビルドが通りました」と読み上げたら、それを聞き取って「ビルドが通りました」と Claude に送り、Claude がまた返事をして……という無限ループになります。
この回り込みは、開発中に何度も何度も発生しました。そのたびに原因が違ったのが厄介でした。
最終的には、何層かの守りを重ねる形に落ち着きました。
- 読み上げている間は、マイクの音を文字起こしに渡さない
- ゲートを閉じる直前に入り込んだ音は、音の時刻を見て「読み上げの残り」だけを捨てる
- アプリを経由せずに鳴った読み上げも検知して、同じようにゲートを閉じる
回り込みが起きるたびに「待ち時間を伸ばせば直るのでは」と考えたくなりますが、そもそもゲートが閉じていない場面ではまったく効きません。それどころか、読み上げ直後に人間が喋った言葉の頭が消える副作用まで出ます。
より自然な会話のためには、まだまだチューンナップが必要。修正前に必ずログで「どこで鳴ったのか」を確かめる手順を決めています。試行錯誤中に却下した案も失敗例として記録に残してあります。
1行の要約を先に読み上げる
AIはおしゃべりです。
CLAUDE.mdの作りにもよりますが、一般的にClaude の応答は先頭に結論が来て、そのあとに表や詳しい説明が続く形です。当初は応答が全部画面に流れ終わってから読み上げていたのですが、実測すると、人間が話しかけてからAI側の返答が始まるまで10秒ちかく掛かっていました。複雑な応答ほど待たされます。
人間の言った事を聞き取ったという返事を先に送り、残りの本文はそのあと、という順にしたいところです。そこで、応答が画面に流れてくる途中で 【AI】 と 【読み】 の2行がそろった時点で読み上げを始めるようにしました。
動かすのに必要なもの
| Item | 必須か | 用途 |
|---|---|---|
| macOS 26 以降 | 必須 | 文字起こしに OS 内蔵の音声認識(SpeechAnalyzer)を使うため |
| Claude Code | 必須 | 中で動く AI |
| Xcode | 必須 | アプリのビルド |
| VOICEVOX / AivisSpeech | 任意 | 自然な読み上げ。無ければ macOS 標準の声で喋る |
| Ollama と Gemma 3 4B | 任意 | 2秒以内の復唱。声紋分析 |
| iPhone | 任意 | 外部カメラ |
| Apple Watch | 任意 | アイデアつぶやき用 |
| AirPods | 任意 | 外部マイク、アイデアつぶやき用 |
| iPad | 任意 | 遠隔ウィンドウ |
まとめ
VoiceTerminal は「声で頼んで、耳で聞いて、声で返答」というループを Mac上で実用するためのアプリです。
作っていて感じたのは「声を利用する」のと「声だけで回す」のは大きな違いだということです。細かい不便を1つずつ潰していくと、ようやく声だけで回るようになりました。「声でAIを操る」ことに興味のある方は参考にして下さい。
