Imsg Media
by @tankyhsu
Fetch iMessage/Messages.app attachments (voice memos and images) and process them — transcribe audio via Silicon Flow ASR (SenseVoiceSmall), and analyze imag...
clawhub install imsg-media📖 About This Skill
name: imsg-media description: Fetch iMessage/Messages.app attachments (voice memos and images) and process them — transcribe audio via Silicon Flow ASR (SenseVoiceSmall), and analyze images via the agent's vision model. Handles the full pipeline from locating the attachment to delivering results. Use when a user sends a voice message or image and you see the placeholder character "", or when they say "语音转文字", "看图", "识别图片", "transcribe this". version: 1.0.1 metadata: openclaw: emoji: "🎙️" requires: bins: - imsg env: - SILICON_FLOW_KEY platform: - darwin
imsg-media
Full iMessage multimedia pipeline:
Requirements
macOS permissions
imsg cannot read ~/Library/Messages/chat.db and will return permissionDeniedAPI key (audio only)
~/.openclaw/.env: SILICON_FLOW_KEY=sk-...--api-key sk-... directly to the scriptCLI dependency
imsg CLI: npm install -g imsgTrigger conditions
Activate this skill when:
Decision flow
Attachment detected?
├── Audio (.m4a / .caf / .wav / .mp3) → transcribe via Silicon Flow ASR
├── Image (.jpg / .png / .heic / .gif) → read with vision model
└── Unknown / not downloaded → increase --limit or ask user to resend
Workflow
Step 1 — Get the sender identifier
Always read from the message envelope:[iMessage sender@example.com ...] → use sender@example.com[SMS +1234567890 ...] → use +1234567890Step 2 — Fetch the attachment
# Run from the skill directory
cd ~/.openclaw/skills/imsg-voice-transcribepython3 scripts/imsg_voice_transcribe.py fetch \
--identifier "sender@example.com" \
--limit 50
Returns JSON with file, type (audio or image), and metadata.
If nothing found, try --limit 100.
Step 3a — Audio: transcribe
# One-liner (fetch + transcribe)
python3 scripts/imsg_voice_transcribe.py auto \
--identifier "sender@example.com" \
--limit 50 --rawOr transcribe a specific file
python3 scripts/imsg_voice_transcribe.py transcribe \
--file /path/to/audio.m4a --rawQuick test with explicit API key (no env setup needed)
python3 scripts/imsg_voice_transcribe.py transcribe \
--file /path/to/audio.m4a --api-key sk-... --raw
Step 3b — Image: analyze
After fetch returns an image path (e.g. {"file": "/path/to/photo.jpg", "type": "image"}):
# Example: fetch image from a sender
python3 scripts/imsg_voice_transcribe.py fetch \
--identifier "sender@example.com" --type image --limit 50
→ {"file": "/Users/.../Messages/Attachments/photo.jpg", "type": "image", ...}
Then in the agent:
1. If HEIC/HEIF: convert first → sips -s format png "input.heic" --out "output.png"
2. Open with the read tool → agent vision model processes it
3. Respond with: what it is, main subject, any text/OCR, notable details
Default image response format:
Supported formats
| Format | Type | Notes |
|--------|------|-------|
| .m4a | Audio | Standard iMessage voice memo |
| .caf | Audio | Older iOS voice memo (AAC in CAF) |
| .wav .mp3 | Audio | Other sources |
| .jpg .jpeg .png | Image | Standard photos |
| .heic .heif | Image | iPhone default — convert to PNG first |
| .gif | Image | Animated or static |
Troubleshooting
| Error | Cause | Fix |
|-------|-------|-----|
| permissionDenied | No Full Disk Access | Grant FDA in System Settings |
| SILICON_FLOW_KEY not set | Missing API key | Add to ~/.openclaw/.env |
| No attachments found | Low limit or iCloud not synced | Increase --limit; ask user to resend |
| Request timed out | Network or large file | Retry; check file < 25MB |
| HEIC not displaying | Format not supported by read | Convert with sips first |
📋 Tips & Best Practices
| Error | Cause | Fix |
|-------|-------|-----|
| permissionDenied | No Full Disk Access | Grant FDA in System Settings |
| SILICON_FLOW_KEY not set | Missing API key | Add to ~/.openclaw/.env |
| No attachments found | Low limit or iCloud not synced | Increase --limit; ask user to resend |
| Request timed out | Network or large file | Retry; check file < 25MB |
| HEIC not displaying | Format not supported by read | Convert with sips first |