Add Verbatim transcription mode to keep filler words - #8
Closed
wassgha wants to merge 3 commits into
Closed
Conversation
- Transcript selection: continuous dimmed highlight that includes the spaces between words (native ::selection made transparent over words, selected spans marked imperatively with data-sel) - Timeline word labels: bordered, background-filled pills sized to each word's duration with ellipsis truncation, red styling for cut words - Remove the gradient R logo from the top bar and upload screen; the Rescript wordmark is the logo - Progress reporting is now monotonic: model download percentage no longer drops when new files are discovered mid-download, and transcription progress is clamped to only move forward
- Drop the 'runs locally / models are cached' note from the progress card - Hide the decorative right-hand tool rail until its tools are functional - Only show the project title in the top bar once a file is loaded
wassgha
added a commit
that referenced
this pull request
Sep 3, 2026
Sentry has been collecting `RuntimeError: Aborted(CompileError: WebAssembly.instantiate(): Compiling function #93 failed: Wasm SIMD unsupported)`. Function #93 is `ffmpeg-core.wasm`: the module has 85 function imports and the reported offset lands in defined function #8. The core simply will not compile on these machines, so the editor cannot start at all. `build.win` shipped x64 only, so Windows on Arm users run it under emulation — where V8 turns Wasm SIMD off unless the emulated CPU reports SSE4.1, which the older x64 emulators do not. Target arm64 as well. Verified by packing one: the output is a PE32+ Aarch64 binary, cross-built from an x64 host, which is what the release runner is. Both arches go into one Rescript-Setup.exe — electron-builder's default for NSIS with more than one arch. That leaves the download URL, artifact name and update manifests untouched, at the cost of installer size; splitting them would need `${arch}` in `nsis.artifactName` to avoid an output-path collision, renaming the file every download link points at. The probe is the part that holds either way. Every wasm binary the app ships is a SIMD build — both ffmpeg cores list `+simd128` in `target_features`, and onnxruntime is only distributed as `ort-wasm-simd-threaded` — so there is nothing to fall back to, and the honest thing is to say so. SharedArrayBuffer and SIMD are now one gate: `useCrossOriginIsolated` becomes `useMediaEngineSupport`, which distinguishes the two so each can give its own advice. Previously a missing-SIMD machine got "Failed to process this file." Also moves the last hardcoded English string in `lib/ffmpeg.ts` into the catalog, so both engine-unavailable messages localize. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Whisper is trained to emit "clean" transcripts and usually drops disfluencies ("um", "uh", …), which is why Remove fillers often has nothing to act on. This PR adds a Verbatim transcription mode that biases Whisper toward keeping them.
Why not CrisperWhisper?
unsloth/CrisperWhisper/nyralabs/CrisperWhisperis exactly the right model (verbatim large-v3 fine-tune), and there is a browser ONNX export atonnx-community/CrisperWhisper-ONNX(~1 GB q4). In practice that export was compiled withoutoutput_attentions=True, so transformers.js cannot produce word-level timestamps (Model outputs must contain cross attentions to extract timestamps). Without those timestamps the editor's cut/timeline/export pipeline doesn't work, so it isn't usable here today.Approach
lib/models.ts).onnx-community/whisper-base_timestampedweights (shared cache, same ~80 MB download and speed).decoder_input_ids:<|startofprev|> Umm, let me think like, hmm… <|startoftranscript|> <|en|> <|transcribe|>Conditioning on a filler-rich prompt is a known trick that biases the decoder toward emitting fillers instead of cleaning them up. (transformers.js documents
prompt_idsbut doesn't implement it, so the tokens are constructed manually.)Testing
Headless Chromium against a production build, same espeak filler video ("Um, so today… uh… Hmm… um…"):
Um,(1)uh,Um,um,(3)Verbatim transcript: "So today we are going to talk about, uh, editing videos with text. Um, I think, um, this is going to be really useful."
npm run lintandnpm run buildpass.Follow-ups