Summary
On-device transcription is dead in the packaged macOS build of v1.11.0-rc.1, on a machine where it should work perfectly. The whisper helper is healthy — it boots, loads the model on Metal, and listens — but every stt:transcribe dies one step earlier, in audio extraction:
Error occurred in handler for 'stt:transcribe': FfmpegUnavailableError:
stt:native-extraction-unavailable: no ffmpeg binary for native audio extraction
at rCe (app.asar/dist-electron/main-FolZ9gtb.js:79865:17)
at SCe.extract (…:80567:20)
at SCe.transcribe (…:80574:61)
The .app bundles the ffmpeg shared libraries but no ffmpeg executable.
$ find /Applications/Openscreen.app -type f \( -name 'ffmpeg*' -o -name 'ffprobe*' \)
$ # nothing
$ ls Contents/Resources/electron/native/bin/darwin-arm64/ | grep -E '^lib(av|sw)'
libavcodec.62.dylib libavfilter.11.dylib libavformat.62.dylib
libavutil.60.dylib libswresample.6.dylib libswscale.9.dylib
The machine has no system ffmpeg either, which is the normal user's situation.
This is not #538 (helper never loads on macOS 13/14, fixed by #527). Here the helper loads fine on macOS 26.5 — but note both surface as the same misleading "Failed to fetch", so reports will be easy to conflate.
What the user sees
Just "Failed to fetch" in the transcript pane. It reads as a network failure and sends you hunting an STT server that was never involved.
There is a second, nastier half: a cached transcript masks the failure. The transcript is stored on the asset, so once any successful run has happened, the Source Transcript panel keeps showing "Transcript ready" + "Detected language: French" with the full text, while "Failed to fetch" appears underneath — two contradictory states at once. A tester who has ever had a working run will conclude transcription is fine. A real user, with no cached transcript, only ever sees "Failed to fetch".
Expected behavior
Transcription completes, or — if extraction genuinely cannot run — the UI says why (missing component), not "Failed to fetch".
To Reproduce
- Install the CI-built
v1.11.0-rc.1 Apple Silicon DMG on a Mac with no system ffmpeg.
- Record anything with audible speech (system audio is enough).
- Media panel → select the asset → Source Transcript → Regenerate.
- "Failed to fetch". Main-process log carries the
FfmpegUnavailableError above.
Evidence — A/B on one variable
Same build, same file, same machine; the only difference is OPENSCREEN_FFMPEG_PATH pointed at an ffmpeg wrapper:
| instance |
OPENSCREEN_FFMPEG_PATH |
[stt] done |
result |
| with |
wrapper |
1 |
full French transcript, 112 words with word-level timings |
| without |
unset |
0 |
FfmpegUnavailableError ×2, UI "Failed to fetch" |
With the variable set, on the unmodified build:
[whisper-stt] boot: model=…/whisper-ggml/ggml-small-q8_0.bin host=127.0.0.1 port=56280 threads=8
[whisper-stt] model loaded; backend=whispercpp-metal
[whisper-stt] §4.1 guardrail: PASS (non_special_tokens=147)
[stt] done on whispercpp-metal: 1 chunk(s), 65.5s audio in 19.3s (0.29 rtf, 3.4x real-time)
The source had real speech — AAC 48 kHz stereo, −9.7 dB across the first 32 s — and the transcript it produced maps to that exact asset (transcript.assetId == primaryAssetId == asset_7b85b649…, originalPath = recording-1788635693618.mp4), starting 0.37–0.64 "que", 0.94–1.22 "micro", 2.88–3.70 "OpenScreen".
Note for whoever fixes it
The bundle already contains a fallback for this exact error string at a different call site — it catches stt:native-extraction-unavailable, decodes samples and transcribes from those. The failing call site (SCe.extract → SCe.transcribe) has none. So the fix is probably either packaging the binary or routing this path through the existing fallback. OPENSCREEN_FFMPEG_PATH is already honoured and is a usable stopgap.
Environment
- OpenScreen 1.11.0-rc.1 (dmg), CI build run 33958219380,
openscreen-mac-arm64, Developer ID signed + notarized, DMG stapled
- Electron 41.2.1 · Chromium 146.0.7680.188 · Node 24.14.1
- macOS 26.5 (25F71), Apple M1
- Native payload otherwise complete and uniformly stamped (33 files, all
Sep 5 11:36)
Found during the macOS computer-use e2e pass for this RC; the full row is on claude/e2e-results-v1-11-0-rc1.
Summary
On-device transcription is dead in the packaged macOS build of
v1.11.0-rc.1, on a machine where it should work perfectly. The whisper helper is healthy — it boots, loads the model on Metal, and listens — but everystt:transcribedies one step earlier, in audio extraction:The
.appbundles the ffmpeg shared libraries but no ffmpeg executable.The machine has no system
ffmpegeither, which is the normal user's situation.This is not #538 (helper never loads on macOS 13/14, fixed by #527). Here the helper loads fine on macOS 26.5 — but note both surface as the same misleading "Failed to fetch", so reports will be easy to conflate.
What the user sees
Just "Failed to fetch" in the transcript pane. It reads as a network failure and sends you hunting an STT server that was never involved.
There is a second, nastier half: a cached transcript masks the failure. The transcript is stored on the asset, so once any successful run has happened, the Source Transcript panel keeps showing "Transcript ready" + "Detected language: French" with the full text, while "Failed to fetch" appears underneath — two contradictory states at once. A tester who has ever had a working run will conclude transcription is fine. A real user, with no cached transcript, only ever sees "Failed to fetch".
Expected behavior
Transcription completes, or — if extraction genuinely cannot run — the UI says why (missing component), not "Failed to fetch".
To Reproduce
v1.11.0-rc.1Apple Silicon DMG on a Mac with no system ffmpeg.FfmpegUnavailableErrorabove.Evidence — A/B on one variable
Same build, same file, same machine; the only difference is
OPENSCREEN_FFMPEG_PATHpointed at an ffmpeg wrapper:OPENSCREEN_FFMPEG_PATH[stt] doneFfmpegUnavailableError×2, UI "Failed to fetch"With the variable set, on the unmodified build:
The source had real speech — AAC 48 kHz stereo, −9.7 dB across the first 32 s — and the transcript it produced maps to that exact asset (
transcript.assetId == primaryAssetId == asset_7b85b649…,originalPath=recording-1788635693618.mp4), starting0.37–0.64 "que",0.94–1.22 "micro",2.88–3.70 "OpenScreen".Note for whoever fixes it
The bundle already contains a fallback for this exact error string at a different call site — it catches
stt:native-extraction-unavailable, decodes samples and transcribes from those. The failing call site (SCe.extract→SCe.transcribe) has none. So the fix is probably either packaging the binary or routing this path through the existing fallback.OPENSCREEN_FFMPEG_PATHis already honoured and is a usable stopgap.Environment
openscreen-mac-arm64, Developer ID signed + notarized, DMG stapledSep 5 11:36)Found during the macOS computer-use e2e pass for this RC; the full row is on
claude/e2e-results-v1-11-0-rc1.