Claude Codeの/voiceコマンドで音声入力を使う — hold/tap/off
/voiceコマンドはhold・tap・offの3モードを切り替える音声入力機能です。Claude.aiアカウントが必須で音声はローカル処理されない点や、リモート環境で使えない制約を解説します。
/voiceはClaude CodeのCLIでプロンプトを声で入力するコマンドです。キーを押しながら話す「hold」モードと、1回のタップで録音を開始・終了する「tap」モードの2種類があり、Claude.aiアカウントでのサインインが前提になります。
実行すると、有効化時にマイクの確認が走ります。公式の例では次のように表示されます。
/voice
Voice mode enabled (hold). Hold space to record. Dictation language: en (/config to change).最後のDictation language: enが重要です。日本語で話すなら、先に言語設定を変える必要があります。
日本語で話すならlanguageの設定から
音声入力の言語は、Claudeの応答言語を決めるlanguage設定と共通です。設定が空なら英語で文字起こしされます。日本語で話したいなら、/configか設定ファイルでlanguageをjapaneseやjaにします。
{
"language": "japanese"
}設定した言語が対応言語に無い場合、/voiceは有効化時に警告を出し、文字起こしだけを英語にフォールバックします。Claudeのテキスト応答は影響を受けません。VS Code拡張ではlanguageが空のとき、VS Codeのaccessibility.voice.speechLanguageが先に使われます。
対応言語は20言語です。チェコ語・デンマーク語・オランダ語・英語・フランス語・ドイツ語・ギリシャ語・ヒンディー語・インドネシア語・イタリア語・日本語・韓国語が前半です。残りはノルウェー語・ポーランド語・ポルトガル語・ロシア語・スペイン語・スウェーデン語・トルコ語・ウクライナ語です。
languageの値は、Claudeへ「その言語で答えるように」という指示としてそのまま渡されます。日本語にすると応答も日本語になり、音声だけ日本語で応答は英語、という組み合わせは選べません。綴りを間違えてもエラーにならない点にも注意が要ります。
文字起こしはコーディング用語向けに調整されています。regex・OAuth・JSON・localhostのような開発用語は正しく認識され、現在のプロジェクト名とgitのブランチ名も認識のヒントとして自動で加わります。
日本語環境でつまずいた点と修正されたバージョン
日本語で使う場合に絡む不具合は、Claude Codeのchangelogに3件あります。古いバージョンを使っているなら、症状とバージョンを照らし合わせられます。
| バージョン | 症状 | 該当する人 |
|---|---|---|
| v2.1.83 | 症状日本語などのIMEが全角スペースを入力すると、holdモードの長押しが始まらなかった | 該当する人IMEをオンにしたままSpaceで録音する人 |
| v2.1.160 | 症状ディレクトリ名やブランチ名に非ASCII文字や特殊文字があると、接続に失敗した | 該当する人日本語のフォルダ名やブランチ名を使う人 |
| v2.1.195 | 症状スペースで区切らない言語(日本語・中国語・タイ語)で、自動送信が一度も働かなかった | 該当する人tapモードかautoSubmitを使う人 |
3件とも修正済みです。
/voiceの4つの使い方
/voiceは音声入力のオン/オフを切り替え、モードを引数で指定することもできます。指定しなければ、直前のモードを保ったままトグルします。
| コマンド | 効果 |
|---|---|
/voice | 効果オン/オフを切り替え、現在のモードを維持 |
/voice hold | 効果holdモードで有効化 |
/voice tap | 効果tapモードで有効化 |
/voice off | 効果無効化 |
録音した音声はローカルでは処理されず、Anthropicのサーバーへ送られて文字起こしされます。この文字起こしはメッセージやトークンを消費せず、/usageの利用上限にも数えられません。
文字起こしはライブで入力欄に反映されます。確定するまでは薄く表示され、キーボード入力と声を同じプロンプトの中で混ぜられます。文字起こしはカーソル位置に挿入され、カーソルは挿入した文の末尾に残ります。カーソルを動かせば、書いた文章の途中や末尾に声で追記できます。v2.1.84で、文字起こしが正しい位置に挿入されるよう修正されています。
holdとtapのどちらを選ぶか
迷ったら、ウォームアップを許せるかどうかで決めます。
holdモードとtapモード
hold
Spaceを押している間だけ録音し、離すと文字起こしを確定します。キーを押し続けているかどうかは、ターミナルが送るキーリピートで判定します。そのため録音が始まるまで短いウォームアップがあり、フッターにはkeep holding…、録音中はlistening…と出ます。
ウォームアップ中に入力欄へ入った最初の数個のキーリピート文字は、録音が始まると自動で取り除かれます。Spaceを1回タップしただけなら、ふつうに空白が入ります。
tap
1回目のタップで録音を始め、話し終えたらもう1回タップして送信します。キーを押し続ける必要はありません。録音中のフッターは● REC · tap to sendです。
最初のタップが録音を始めるのは入力欄が空のときだけなので、文章を書いている途中の空白は普通に入力できます。2回目のタップは、入力欄の中身にかかわらず録音を止めます。
送信の扱いも違います。tapモードは、文字起こしが3単語以上なら自動で送信します。短い文字起こしは入力欄に入るだけで送信されないので、誤タップで1語だけ送られることはありません。holdモードは既定では入力欄に入れてEnterを待ち、設定で"autoSubmit": trueにすると、キーを離した時点で同じ3単語の条件で送信します。
日本語・中国語・タイ語のようにスペースで区切らない言語でも、単語単位で数えます。つまり日本語の文字起こしも、tapモードとautoSubmitを有効にしたholdモードで自動送信の対象です。
録音は、無音が15秒続くか合計2分に達すると自動で止まります。
録音をやめたいときはEscかCtrl+C
話している途中で言い直したくなったら、EscかCtrl+Cで録音を取り消せます。マイクを止め、文字起こしを捨てて、入力欄を録音前の状態に戻します。
文字起こしの処理中でも同じように取り消せます。処理中に自分で編集したり送信したプロンプトは、そのまま残ります。取り消しの押下では、EscはClaudeの応答を中断せず、Ctrl+Cも入力欄のクリアや終了のための2回押しには数えられません。
使えない環境と使える環境
条件はアカウントとマイクの2点です。
- Claude.aiアカウント: Claude.aiアカウントで認証しているときだけ文字起こしが使えます。AnthropicのAPIキー、Amazon Bedrock、Google CloudのAgent Platform、Microsoft Foundryで構成している場合は使えません
- WSLg(WSL利用時): Microsoft StoreからインストールしたWSL2にはWSLgが同梱されます。WSLgが無い場合は、ネイティブWindows側でClaude Codeを実行します
使えない環境は、Claude Code on the webを含め、どれもマイクと実行場所が離れています。VS Code Remoteでは、マイクはローカル、拡張機能はリモートホストで動くためです。
どこで動くか
使える
- ターミナルのCLI(macOS / Linux / Windows)
- ローカルのVS Code拡張
- WSLgのあるWSL2
使えない
- Claude Code on the web(クラウドセッション)
- SSHセッション
- VS Code Remote(SSH / Dev Containers / Codespaces)
- WSLgの無いWSL1
Linuxでの録音手段
macOS・Linux・Windowsでは組み込みのネイティブモジュールで録音します。Linuxでネイティブモジュールを読み込めないときは、ALSA utilsのarecordかSoXのrecにフォールバックします。どちらも無ければ、/voiceの実行時にパッケージマネージャー向けのインストールコマンドが表示されます。
設定ファイルに固定する
/voiceで切り替えた状態はセッションをまたいで保持されます。初期状態を明示したいときは、ユーザー設定ファイルにvoiceオブジェクトを書きます。/voiceを実行すると、Claude Codeがこのオブジェクトを書き込みます。
{
"voice": {
"enabled": true,
"mode": "tap"
}
}voice.modeにはholdかtapを指定します。旧形式の単一ブール値voiceEnabledはv2.1.92でvoiceオブジェクトに置き換わりました。今も読み込まれますが、両方を書いた場合はvoice.enabledが優先されます。
有効化してから最初の3セッションは、入力欄が空のとき、フッターにhold space to speakのヒントが出ます。ヒントの文言はholdでもtapでも同じで、現在のvoice:pushToTalkの割り当てに合わせて変わります。カスタムステータスラインを設定している場合は表示されません。
録音キーを変える
録音キーはChatコンテキストのvoice:pushToTalkアクションで、既定はSpaceです。holdとtapは同じ割り当てを共有します。~/.claude/keybindings.jsonで変更します。
{
"bindings": [
{
"context": "Chat",
"bindings": {
"meta+k": "voice:pushToTalk",
"space": null
}
}
]
}voice:pushToTalkは1つのキーしか持てません。別のキーを割り当てるとSpaceの割り当ては置き換わるので、"space": nullの行は省いても動作は変わりません。tapモードにはウォームアップがないため、たいていのキーが使えます。
Caps Lockのように、ターミナルアプリへ届かないキーは割り当てられず、割り当てようとするとエラーになります。キーバインド全般の書式はClaude Codeの設定ファイル完全ガイドでも扱っています。
Spaceでの録音が始まるのは、そのキーが入力欄への文字入力になる場面だけです。トランスクリプトビューではSpaceがページ送りになり、vimモードのINSERT以外ではコマンドです。meta+kのような修飾キーの組み合わせは文字を入力しないので、こうした場面からも録音を始められます。
バックグラウンドセッションへ声で指示する
エージェントビューでは、ディスパッチ入力欄かpeekパネルの返信欄にフォーカスがあるとき、録音キーの長押しまたはタップで音声入力できます。フォアグラウンドのセッションだけでなく、バックグラウンドで動く別セッションにも声で返信できます。
/voice自体はスラッシュコマンドの一種です。コマンド全体の一覧はClaude Codeのスラッシュコマンド一覧にあります。
症状別のトラブルシューティング
メッセージの文言ごとに、原因と直し方を切り分けられます。
| 表示 | 原因 | 直し方 |
|---|---|---|
Voice mode requires a Claude.ai account | 原因APIキーかサードパーティのプロバイダーで認証している | 直し方/loginでClaude.aiアカウントにサインインする |
Voice mode is disabled by your organization's policy | 原因組織の管理者のポリシーで無効化されている | 直し方管理者に利用可否を確認する |
Microphone access is denied | 原因ターミナルにマイク権限が無い | 直し方OSの設定でターミナルを許可し、/voiceを再実行する |
No audio detected from microphone | 原因録音は始まったが無音だった | 直し方既定の入力デバイスと入力レベルを確認する |
Voice connection failed | 原因録音が文字起こしサービスに届かなかった | 直し方ネットワークを確認して再試行する |
No speech detected | 原因音声は届いたが単語を認識できなかった | 直し方マイクに近づけ、languageが話す言語と合っているか確認する |
マイクの許可は、macOSなら「システム設定 > プライバシーとセキュリティ > マイク」で出します。Windowsなら「設定 > プライバシーとセキュリティ > マイク」で、デスクトップアプリのマイクアクセスをオンにします。
No audio detected from microphoneが出たら、入力デバイスを選び直します。Windowsは「設定 > システム > サウンド > 入力」、macOSは「システム設定 > サウンド > 入力」です。v2.1.200より前は、無音のマイクでもVoice connection failedと出て、ネットワークの問題に見えることがありました。
Voice stream error: WebSocket upgrade rejected with HTTP <status>は、サーバーが接続を拒否したときの表示です。ステータスが400番台なら、サインインが古くなっているか、プロキシやボット対策サービスが文字起こしサービスの代わりに応答していることが多いです。/loginでサインインし直し、VPNやプロキシの有無を確認します。400番台以外では、録音中に拒否が届いた場合に1回だけ再試行します。
v2.1.229からv2.1.231のネイティブビルドでは、このメッセージが出ませんでした。録音は続き、holdモードのフッターはlistening…のままで、録音を止めてからVoice connection failedと出ていました。
Voice input is failing repeatedly and has been pausedは、10秒以内に3回失敗したときに出ます。最初の失敗から10秒たつまで、音声入力は一時停止します。ヘッドレスサーバーや、音声を通さないリモートシェルで起きやすい症状です。v2.1.202より前は、起動時の失敗だけが数えられていました。
LinuxとWSLで出るメッセージ
Linuxでネイティブモジュールが読み込めず、代わりの録音手段も無いと、Voice mode requires SoX for audio recordingと出ます。メッセージ内のコマンド(例: sudo apt-get install sox)でSoXを入れます。
SoXは入っているのにマイクが開けないと、次のメッセージが出ます。ヘッドレスサーバーやコンテナが典型です。
Voice mode requires a microphone, but SoX could not open an audio capture devicev2.1.195より前は、SoXが入っていてもインストールを促されていました。
WSLではVoice mode could not find a working audio recorder in WSLが出ることがあります。WSLgは音声をALSAデバイスでなくPulseAudio経由で扱います。そのためsudo apt install sox libsox-fmt-pulseで、PulseAudio用のバックエンドを入れます。soxだけだとALSA用のバックエンドが入りますが、WSLには/dev/sndが無いので録音できません。
holdで何も起きないときの見分け方
holdモードでSpaceを押し続けたとき、入力欄を見て切り分けます。
- 空白がどんどん増える: 音声入力がオフの可能性が高いです。
/voice holdで有効化します - 1〜2個の空白が入って止まる: 音声入力はオンですが、ホールドの検出が働いていません。OSでキーリピートが無効だと検出できないので、
/voice tapに切り替えます
tapモードでSpaceが空白を入力するだけのときは、入力欄が空でないか、tapモードになっていない可能性があります。入力欄を空にするか、/voice tapを実行します。
macOSの設定にターミナルが出てこないとき
マイクの一覧にターミナルが無いと、許可するスイッチがありません。
一覧に無いターミナルを再許可する手順
- 1
ターミナルのマイク権限をリセットする
tccutil reset Microphone <bundle-id>を実行します。バンドルIDは、標準のターミナルならcom.apple.Terminal、iTerm2ならcom.googlecode.iterm2です。ほかのターミナルはosascript -e 'id of app "AppName"'で調べます。バンドルIDを省くと、Zoomなど他のアプリのマイクアクセスもすべて取り消されます。通話中には実行しないでください。
- 2
ターミナルを終了して開き直す
実行中のプロセスには、macOSは許可プロンプトを出し直しません。ウィンドウを閉じるだけでなく、Cmd+Qで終了してから開きます。
- 3
/voiceを実行する
Claude Codeを起動して
/voiceを実行すると、macOSがマイクへのアクセスを尋ねます。許可すれば完了です。
よくある質問
/voiceと画面共有中の音声モードは同じ機能ですか
別の機能です。/voiceはClaude CodeのCLIでテキストの代わりに音声を入力する機能で、Claude.aiアプリの音声モード + 画面共有とは対応環境も用途も異なります。画面共有を伴う音声モードはClaude音声モードと画面共有の使い方にあります。