現在できること
- メディア理解(音声): 音声理解が有効、または自動検出された場合、OpenClaw は次の順で処理します。
- 最初の音声添付ファイル(ローカルパスまたは URL)を見つけ、必要であればダウンロードする
- 各モデルエントリへ送る前に
maxBytes制限を適用する - 順番に、条件を満たす最初のモデルエントリ(provider または CLI)を実行する
- 失敗またはスキップ(サイズ超過 / timeout)した場合は次のエントリを試す
- 成功した場合は
Bodyを[Audio]ブロックに置き換え、{{Transcript}}を設定する
- コマンド解析: 文字起こしに成功すると、
CommandBody/RawBodyに transcript が設定されるため、slash command も引き続き機能します - 詳細ログ:
--verboseでは、文字起こしを実行したタイミングと本文を置き換えたタイミングがログに出力されます
自動検出(デフォルト)
モデルを明示設定しておらず、かつtools.media.audio.enabled が false でない 場合、OpenClaw は次の順序で自動検出を行い、最初に動作した選択肢を採用します。
- ローカル CLI(インストール済みの場合)
sherpa-onnx-offline(encoder / decoder / joiner / tokens を含むSHERPA_ONNX_MODEL_DIRが必要)whisper-cli(whisper-cpp由来。WHISPER_CPP_MODELまたは同梱 tiny model を使用)whisper(Python CLI。モデルは自動ダウンロード)
- Gemini CLI(
gemini)をread_many_files付きで使う - provider key(OpenAI → Groq → Deepgram → Google)
tools.media.audio.enabled: false を設定します。挙動をカスタマイズするには tools.media.audio.models を設定してください。
注: バイナリ検出は macOS / Linux / Windows をまたいだ best-effort 実装です。CLI が PATH 上にあること(~ は展開されます)を確認するか、完全なコマンドパスを持つ明示的な CLI model を設定してください。
設定例
provider + CLI フォールバック(OpenAI + Whisper CLI)
provider のみ + scope 制御
provider のみ(Deepgram)
provider のみ(Mistral Voxtral)
transcript をチャットへそのまま返す(opt-in)
注意点と制限
- provider 認証は、標準の model 認証順序(auth profile、環境変数、
models.providers.*.apiKey)に従います 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は 未設定 です(全文 transcript)。出力を切り詰めたい場合はtools.media.audio.maxCharsまたは各エントリのmaxCharsを設定してください - OpenAI の自動デフォルトは
gpt-4o-mini-transcribeです。精度を優先する場合はmodel: "gpt-4o-transcribe"を設定します - 複数のボイスメモを処理するには
tools.media.audio.attachmentsを使います(mode: "all"とmaxAttachments) - transcript はテンプレート内で
{{Transcript}}として参照できます tools.media.audio.echoTranscriptはデフォルトで無効です。有効にすると、エージェント処理前に transcript 確認を元のチャットへ返せますtools.media.audio.echoFormatで echo 文字列をカスタマイズできます(プレースホルダー:{transcript})- CLI の stdout には上限があります(5MB)。CLI 出力は簡潔に保ってください
プロキシ環境のサポート
provider ベースの音声文字起こしでは、標準的な outbound proxy 環境変数が利用されます。HTTPS_PROXYHTTP_PROXYhttps_proxyhttp_proxy
グループでの mention 検出
グループチャットでrequireMention: true が設定されている場合、OpenClaw は mention 判定の 前に 音声を文字起こしします。これにより、音声メモ内に mention が含まれている場合でも処理できるようになります。
動作:
- 音声メッセージにテキスト本文がなく、かつグループで mention が必須の場合、OpenClaw は preflight 文字起こしを行います
- transcript に対して mention pattern(例:
@BotName、絵文字トリガー)をチェックします - mention が見つかった場合、メッセージは通常の返信パイプラインへ進みます
- 音声メモでも mention gate を通過できるよう、mention 判定には transcript が使われます
- preflight 中の文字起こしが失敗した場合(timeout、API error など)、メッセージはテキストのみの mention 判定に基づいて処理されます
- これにより、テキスト + 音声の混在メッセージが誤って落とされることを防げます
- グループ単位で preflight transcript mention check を無効にするには
channels.telegram.groups.<chatId>.disableAudioPreflight: trueを設定します - topic 単位で上書きするには
channels.telegram.groups.<chatId>.topics.<threadId>.disableAudioPreflightを設定します(trueでスキップ、falseで強制有効) - デフォルトは
falseです(mention gate 条件に一致した場合は preflight が有効)
requireMention: true が設定された Telegram グループで、ユーザーが「Hey @Claude, what’s the weather?」と話した音声メモを送るとします。音声が文字起こしされ、mention が検出され、エージェントが返信します。
注意すべき点
- scope rule は first-match wins です。
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 パースへフォールバックします- 返信キューを詰まらせないよう、timeout は妥当な値(
timeoutSeconds、デフォルト 60 秒)に保ってください - mention 検出用の preflight 文字起こしでは、最初の 音声添付だけを処理します。追加の音声は通常の media understanding フェーズで処理されます