Skip to content

[Bug]: packaged macOS build ships ffmpeg libraries but no ffmpeg binary, so on-device transcription always fails #616

Description

@EtienneLescot

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

  1. Install the CI-built v1.11.0-rc.1 Apple Silicon DMG on a Mac with no system ffmpeg.
  2. Record anything with audible speech (system audio is enough).
  3. Media panel → select the asset → Source TranscriptRegenerate.
  4. "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.extractSCe.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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingstatus: fixed in mainWork is merged into main but may not be in a downloadable release yet.status: pending releaseMerged change is waiting for a packaged desktop release.

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions