You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: CHANGELOG.md
+10Lines changed: 10 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,5 +1,15 @@
1
1
# Changelog
2
2
3
+
## Unreleased
4
+
5
+
### Highlights
6
+
7
+
- Added an optional inbound audio transcription preprocessor so bound conversations can convert staged voice/audio attachments into normal text turn input before forwarding the turn into Codex. The plugin stays transport-agnostic by delegating transcription to a configurable local command that prints transcript text to stdout.
8
+
9
+
### Docs
10
+
11
+
- Documented the new `inboundAudioTranscription` plugin config and clarified the media bridge notes around staged inbound audio handling.
Copy file name to clipboardExpand all lines: README.md
+33Lines changed: 33 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -212,6 +212,39 @@ The plugin schema in [`openclaw.plugin.json`](./openclaw.plugin.json) supports:
212
212
-`defaultWorkspaceDir`: fallback workspace for unbound actions
213
213
-`defaultModel`: model used when a new thread starts without an explicit selection
214
214
-`defaultServiceTier`: default service tier for new turns
215
+
-`inboundAudioTranscription`: optional preprocessor for inbound audio/voice attachments before they are forwarded into Codex
216
+
217
+
### Optional inbound audio transcription
218
+
219
+
If your chat surface provides inbound audio files as local paths or media metadata, this plugin can transcribe them before forwarding the turn to Codex. This keeps the plugin transport-agnostic: Codex still receives normal text input, while transcription is delegated to any local command you choose.
Copy file name to clipboardExpand all lines: docs/specs/MEDIA.md
+38-2Lines changed: 38 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -5,7 +5,8 @@ This document captures the current state of media handling relevant to this plug
5
5
- how Codex app-server accepts image input
6
6
- what this plugin currently sends
7
7
- what OpenClaw currently exposes to plugins
8
-
- the gap for inbound media
8
+
- the remaining gap for richer inbound media
9
+
- the staged-audio transcription bridge this plugin now supports
9
10
- a recommended bridge design for future implementation
10
11
11
12
This is a spec/notes document only. It does not imply that inbound media support has already been implemented here.
@@ -15,9 +16,11 @@ This is a spec/notes document only. It does not imply that inbound media support
15
16
- Codex app-server already supports multimodal turn input via `UserInput`.
16
17
- The supported image-shaped input items are remote/data URL images and local filesystem images.
17
18
- This plugin now supports mixed text + image turn input and forwards inbound image media into Codex when OpenClaw provides a staged media path or URL.
19
+
- This plugin can also transcribe staged inbound audio/voice attachments into plain text turn input when a local transcription command is configured.
18
20
- OpenClaw’s plugin SDK already supports outbound attachments from a plugin via `mediaUrl` and `mediaUrls`.
19
21
- OpenClaw’s plugin SDK still does not model inbound attachments as a first-class typed field on command or `inbound_claim` events.
20
22
- In practice, current `inbound_claim` hook metadata already carries `mediaPath` / `mediaType`, which is enough for this plugin to forward a staged inbound image.
23
+
- The same staged inbound path is also enough to transcribe audio before Codex sees the turn, as long as the plugin can execute an external transcription command against the staged file.
21
24
- The cleanest future bridge is: OpenClaw stages inbound files locally, then this plugin maps image paths to Codex `localImage` items.
22
25
23
26
## Codex App-Server Input Model
@@ -177,8 +180,41 @@ That means:
177
180
- text-only turns still work as before
178
181
- mixed text + image turns can be forwarded into Codex
179
182
- image-only inbound turns can be forwarded into Codex
183
+
- audio-only inbound turns can be converted into transcript text before the turn starts when `inboundAudioTranscription` is configured
184
+
- mixed caption + audio inbound turns can keep the original text and append a labeled transcript block
180
185
- staged text attachments such as `.txt`, `.md`, `.json`, `.yaml`, and `.yml` can be read and forwarded as additional `text` items
181
-
- unsupported binary non-image inbound media is still ignored for now
186
+
- unsupported binary non-image inbound media is still ignored for now unless a future bridge teaches the plugin how to reinterpret it
187
+
188
+
## Inbound Audio Transcription Bridge
189
+
190
+
The plugin does not send raw audio into Codex. Instead, it can optionally reinterpret staged audio files as text by invoking a configurable local command.
191
+
192
+
Configuration shape:
193
+
194
+
```json
195
+
{
196
+
"inboundAudioTranscription": {
197
+
"enabled": true,
198
+
"command": "/path/to/transcribe",
199
+
"args": ["{path}"],
200
+
"timeoutMs": 20000
201
+
}
202
+
}
203
+
```
204
+
205
+
Behavior:
206
+
207
+
- The command receives the staged media path either through an explicit `{path}` placeholder or as an appended trailing argument.
208
+
- Optional placeholders `{mimeType}` and `{fileName}` are available for wrappers that need them.
209
+
- The command should print the transcript to stdout.
210
+
- If stdout is JSON, the plugin uses `.text` first and then `.transcript`.
211
+
- On transcription failure or timeout, the plugin logs the failure and falls back to the previous behavior instead of crashing the inbound turn.
212
+
213
+
This keeps the bridge generic:
214
+
215
+
- no hard dependency on a specific speech-to-text engine
216
+
- no plugin-side audio decoding logic
217
+
- no transport-specific behavior baked into the Codex turn layer
Copy file name to clipboardExpand all lines: openclaw.plugin.json
+27Lines changed: 27 additions & 0 deletions
Original file line number
Diff line number
Diff line change
@@ -53,6 +53,28 @@
53
53
},
54
54
"defaultServiceTier": {
55
55
"type": "string"
56
+
},
57
+
"inboundAudioTranscription": {
58
+
"type": "object",
59
+
"additionalProperties": false,
60
+
"properties": {
61
+
"enabled": {
62
+
"type": "boolean"
63
+
},
64
+
"command": {
65
+
"type": "string"
66
+
},
67
+
"args": {
68
+
"type": "array",
69
+
"items": {
70
+
"type": "string"
71
+
}
72
+
},
73
+
"timeoutMs": {
74
+
"type": "number",
75
+
"minimum": 100
76
+
}
77
+
}
56
78
}
57
79
}
58
80
},
@@ -100,6 +122,11 @@
100
122
"defaultServiceTier": {
101
123
"label": "Default Service Tier",
102
124
"advanced": true
125
+
},
126
+
"inboundAudioTranscription": {
127
+
"label": "Inbound Audio Transcription",
128
+
"advanced": true,
129
+
"help": "Optional preprocessor for inbound audio/voice attachments. The command should print the transcript to stdout. Use {path}, {mimeType}, and {fileName} placeholders in args when needed."
0 commit comments