Fixing Discord Voice Messages (asVoice) That Fail with Generic "Error"
If you're trying to send voice messages in Discord with OpenClaw using asVoice=true and getting a cryptic "Error" with no useful information, you're not alone. This guide walks you through debugging and fixing the issue.
The Problem
You're using the message tool to send a voice message:
message(action="send", channel="discord", path="/tmp/voice.mp3", asVoice=true, target="channel:...")
But all you see in the logs is:
[tools] message failed: Error
No stack trace, no Discord API error code โ just "Error". What's going on?
Why the Error is So Unhelpful
OpenClaw only logs err.message at error level. If the underlying exception is created with an empty message (like new Error()), it prints as just "Error". The stack trace is only logged at debug level, so you won't see it unless you turn on verbose logging.
Step 1: Get the Real Error
Run the gateway in verbose mode to capture the actual stack trace:
openclaw gateway stop
openclaw gateway --verboseThen reproduce the asVoice send. With --verbose, you should get a stack trace that tells you which step failed:
- POST
/channels/<id>/attachments(getting upload URL) - PUT to
upload_url(uploading OGG) - POST
/channels/<id>/messages(sending voice message payload)
Step 2: Check Discord Permissions
Discord has a separate permission for voice messages: SEND_VOICE_MESSAGES. Having an "Admin" role doesn't automatically mean it has the Administrator permission bit set.
In your channel settings, verify your bot's role has all of these:
- View Channel
- Send Messages
- Attach Files
- Send Voice Messages โ This one is often missing!
If Discord returns "Missing Permissions" specifically for voice messages, OpenClaw's current permission-probe only checks SendMessages/AttachFiles, so it may not point at the real missing bit.
Step 3: Verify Audio Format
Discord voice messages require Opus codec, not Vorbis. Run this to check:
ffprobe -v error -select_streams a:0 -show_entries stream=codec_name -of csv=p=0 /tmp/voice.ogg
# Should print: opusIf it says vorbis, you'll need to re-encode. Try generating a test sample:
ffmpeg -y -f lavfi -i sine=frequency=1000:duration=1 -c:a libopus -b:a 64k /tmp/oc-test.oggThen send that with asVoice=true to rule out media format issues.
Common Root Cause: Carbon Library Bug
If your verbose logs show the error originating in RequestClient.executeRequest from the Carbon Discord library, the issue is likely Carbon mis-detecting the /channels/:id/attachments payload as a multipart file upload when it shouldn't be.
This is a known issue where the error has an empty message, and the cause chain isn't surfaced in logs. If you're hitting this bug, consider:
- Filing an issue on the OpenClaw GitHub with your verbose log snippet
- Checking if there's a newer OpenClaw version with a fix
Quick Checklist
- Running with
--verboseto see real errors - Bot has
SEND_VOICE_MESSAGESpermission in the target channel - Audio file is Opus codec (not Vorbis or MP3 passed through)
-
ffmpegandffprobeare installed and accessible - Not including text with voice messages (they can't have captions)
Still Stuck?
Paste your --verbose stack trace in the #help channel on Discord and someone can help narrow it down to the specific Discord API error.
Based on a resolved discussion in the OpenClaw Discord. Thanks to Qearl for the detailed bug report!
Comments (0)
No comments yet. Be the first to comment!