音声 / ボイスノート(2026-01-17)
動作する内容
- メディア理解(音声): 音声理解が有効になっている場合(または自動検出される場合)、OpenClawは次の処理を行います:
- 最初の音声添付ファイル(ローカルパスまたはURL)を見つけ、必要に応じてダウンロードします。
- 各モデルエントリーに送信する前に
maxBytesを適用します。 - 対象となる最初のモデルエントリーを順番に実行します(providerまたはCLI)。
- 失敗またはスキップした場合(サイズ超過/タイムアウト)、次のエントリーを試します。
- 成功すると、
Bodyを[Audio]ブロックに置き換え、{{Transcript}}を設定します。
- コマンド解析: 文字起こしに成功すると、スラッシュコマンドが引き続き動作するように
CommandBody/RawBodyが文字起こし内容に設定されます。 - 詳細ログ:
--verboseでは、文字起こしが実行されたときと、本文が置き換えられたときをログに記録します。
自動検出(デフォルト)
モデルを設定しておらず、かつtools.media.audio.enabled が false に設定されていない場合、
OpenClawは次の順序で自動検出し、最初に動作したオプションで停止します:
- アクティブな返信モデル(そのproviderが音声理解をサポートしている場合)。
- ローカルCLI(インストールされている場合)
sherpa-onnx-offline(SHERPA_ONNX_MODEL_DIRに encoder/decoder/joiner/tokens が必要)whisper-cli(whisper-cpp由来。WHISPER_CPP_MODELまたは同梱のtinyモデルを使用)whisper(Python CLI。モデルを自動ダウンロード)
- Gemini CLI(
gemini)のread_many_filesを使用 - プロバイダー認証
- 音声をサポートする設定済みの
models.providers.*エントリーを先に試します - 同梱のフォールバック順: OpenAI → Groq → Deepgram → Google → Mistral
- 音声をサポートする設定済みの
tools.media.audio.enabled: false を設定してください。
カスタマイズするには、tools.media.audio.models を設定してください。
注: バイナリ検出は macOS/Linux/Windows でベストエフォートです。CLIが PATH 上にあることを確認し(~ は展開されます)、または完全なコマンドパスを持つ明示的なCLIモデルを設定してください。
設定例
Provider + CLI フォールバック(OpenAI + Whisper CLI)
スコープ制御付きのproviderのみ
providerのみ(Deepgram)
providerのみ(Mistral Voxtral)
文字起こしをチャットにエコーする(opt-in)
注記と制限
- provider認証は標準のモデル認証順序に従います(auth profile、env var、
models.providers.*.apiKey)。 - Groqのセットアップ詳細: Groq。
provider: "deepgram"を使用すると、DeepgramはDEEPGRAM_API_KEYを取得します。- Deepgramのセットアップ詳細: Deepgram (audio transcription)。
- Mistralのセットアップ詳細: Mistral。
- 音声providerは、
tools.media.audio経由でbaseUrl、headers、providerOptionsを上書きできます。 - デフォルトのサイズ上限は20MB(
tools.media.audio.maxBytes)です。サイズ超過の音声はそのモデルではスキップされ、次のエントリーが試されます。 - 1024バイト未満の小さすぎる/空の音声ファイルは、provider/CLI文字起こしの前にスキップされます。
- 音声のデフォルト
maxCharsは未設定です(全文字起こし)。出力を切り詰めるにはtools.media.audio.maxCharsまたはエントリーごとのmaxCharsを設定してください。 - OpenAIの自動デフォルトは
gpt-4o-mini-transcribeです。より高い精度が必要ならmodel: "gpt-4o-transcribe"を設定してください。 - 複数のボイスノートを処理するには
tools.media.audio.attachmentsを使います(mode: "all"+maxAttachments)。 - 文字起こしはテンプレート内で
{{Transcript}}として利用できます。 tools.media.audio.echoTranscriptはデフォルトでオフです。agent処理前に元のチャットへ文字起こし確認を返すには有効にしてください。tools.media.audio.echoFormatはエコーテキストをカスタマイズします(プレースホルダー:{transcript})。- CLIのstdoutには上限があります(5MB)。CLI出力は簡潔に保ってください。
プロキシ環境のサポート
providerベースの音声文字起こしは、標準の外向きプロキシenv varを尊重します:HTTPS_PROXYHTTP_PROXYhttps_proxyhttp_proxy
グループでのメンション検出
グループチャットでrequireMention: true が設定されている場合、OpenClawはメンションを確認する前に音声を文字起こしするようになりました。これにより、メンションを含むボイスノートも処理できるようになります。
仕組み:
- ボイスメッセージにテキスト本文がなく、かつグループでメンションが必須の場合、OpenClawは「事前」文字起こしを行います。
- 文字起こし内容に対してメンションパターン(例:
@BotName、絵文字トリガー)を確認します。 - メンションが見つかると、メッセージは完全な返信パイプラインへ進みます。
- ボイスノートがメンションゲートを通過できるよう、文字起こし内容がメンション検出に使われます。
- 事前文字起こし中に失敗した場合(タイムアウト、APIエラーなど)、メッセージはテキストのみのメンション検出に基づいて処理されます。
- これにより、混在メッセージ(テキスト + 音声)が誤ってドロップされることはありません。
- そのグループで事前文字起こしのメンション確認をスキップするには、
channels.telegram.groups.<chatId>.disableAudioPreflight: trueを設定します。 - トピックごとに上書きするには
channels.telegram.groups.<chatId>.topics.<threadId>.disableAudioPreflightを設定します(trueでスキップ、falseで強制有効化)。 - デフォルトは
falseです(メンションゲート条件に一致する場合、事前処理が有効)。
requireMention: true のTelegramグループで、ユーザーが「Hey @Claude, what’s the weather?」というボイスノートを送信します。ボイスノートは文字起こしされ、メンションが検出され、agentが返信します。
注意点
- スコープルールは最初に一致したものが優先されます。
chatTypeはdirect、group、roomに正規化されます。 - CLIが終了コード0で終了し、プレーンテキストを出力することを確認してください。JSONは
jq -r .textで整形する必要があります。 parakeet-mlxでは、--output-dirを渡した場合、--output-formatがtxt(または省略)のときは OpenClaw が<output-dir>/<media-basename>.txtを読み取ります。txt以外の出力形式では stdout 解析にフォールバックします。- 返信キューのブロックを避けるため、タイムアウト(
timeoutSeconds、デフォルト60秒)は適切な値に保ってください。 - メンション検出のための事前文字起こしでは、最初の音声添付ファイルのみを処理します。追加の音声はメインのメディア理解フェーズで処理されます。