mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-13 13:18:51 +00:00
End-to-end testing on macOS + BlueBubbles + ElevenLabs walked through three CAF flavors before landing on the format Apple's Messages.app actually emits when a user records a native iMessage voice memo: - PCM int16 @ 44.1 kHz CAF: BlueBubbles' internal `afconvert -f m4af -d aac` conversion fails; the original CAF reaches iMessage but renders with 0 s duration. - AAC @ 22.05 kHz mono CAF: BlueBubbles' conversion succeeds and the server silently downgrades the delivery, sending the converted MP3 as a generic audio attachment. - **Opus @ 24 kHz mono CAF**: byte-identical to the descriptor block Apple's Messages.app produces; BlueBubbles passes it through unchanged and iMessage renders a native voice-memo bubble with proper duration and waveform UI. Adds an opt-in `tts.voice.preferAudioFileFormat` channel capability and a macOS `afconvert`-backed pre-transcode in the speech-core pipeline. BlueBubbles declares `preferAudioFileFormat: "caf"`. Other channels are unaffected. Falls back to the original buffer when the host platform, the source/target pair, or the transcoder process can't produce the preferred container — so non-Darwin hosts and unsupported provider combinations are unchanged. Also adds a `caff` magic-byte sniff in `src/media/mime.ts` so the auto-reply host-local-media validator (which uses `file-type` and didn't recognize CAF natively) accepts the buffer instead of dropping it as "⚠️ Media failed." Fixes #72506. Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| audio-tags.ts | ||
| audio-transcode.test.ts | ||
| audio-transcode.ts | ||
| audio.test.ts | ||
| audio.ts | ||
| base64.test.ts | ||
| base64.ts | ||
| channel-inbound-roots.fast-path.test.ts | ||
| channel-inbound-roots.ts | ||
| configured-max-bytes.ts | ||
| constants.ts | ||
| document-extractors.runtime.test.ts | ||
| document-extractors.runtime.ts | ||
| fetch.test.ts | ||
| fetch.ts | ||
| ffmpeg-exec.test.ts | ||
| ffmpeg-exec.ts | ||
| ffmpeg-limits.ts | ||
| file-context.test.ts | ||
| file-context.ts | ||
| host.test.ts | ||
| host.ts | ||
| image-ops.helpers.test.ts | ||
| image-ops.input-guard.test.ts | ||
| image-ops.tempdir.test.ts | ||
| image-ops.ts | ||
| inbound-path-policy.test.ts | ||
| inbound-path-policy.ts | ||
| input-files.fetch-guard.test.ts | ||
| input-files.ts | ||
| load-options.test.ts | ||
| load-options.ts | ||
| local-media-access.test.ts | ||
| local-media-access.ts | ||
| local-roots.test.ts | ||
| local-roots.ts | ||
| media-reference.test.ts | ||
| media-reference.ts | ||
| media-source-url.ts | ||
| mime.test.ts | ||
| mime.ts | ||
| outbound-attachment.test.ts | ||
| outbound-attachment.ts | ||
| parse.test.ts | ||
| parse.ts | ||
| pdf-extract.test.ts | ||
| pdf-extract.ts | ||
| png-encode.ts | ||
| prompt-image-order.ts | ||
| qr-image.test.ts | ||
| qr-image.ts | ||
| qr-runtime.ts | ||
| qr-terminal.ts | ||
| read-capability.test.ts | ||
| read-capability.ts | ||
| read-response-with-limit.test.ts | ||
| read-response-with-limit.ts | ||
| server.outside-workspace.test.ts | ||
| server.runtime.ts | ||
| server.test-support.ts | ||
| server.test.ts | ||
| server.ts | ||
| sniff-mime-from-base64.ts | ||
| store.outside-workspace.test.ts | ||
| store.redirect.test.ts | ||
| store.runtime.ts | ||
| store.test.ts | ||
| store.ts | ||
| temp-files.ts | ||
| test-helpers.ts | ||
| web-media.test.ts | ||
| web-media.ts | ||