English | 日本語
A browser extension that automatically speeds up silent parts of videos and audio. Forked from vantezzen/skip-silence.
When a video or audio has silent pauses, Quick Skip Silence detects them and speeds up playback (default: 3x) so you don't have to wait. When speech or sound resumes, it returns to normal speed.
Normal audio: |████████████░░░░░░░░|████████████████|
1x playing silent pause 1x playing
With extension: |████████████░░░░|████████████████|
1x playing 3x (skipped!) 1x playing
- Tab Capture audio analysis — captures tab audio via
chrome.tabCaptureAPI (Chrome MV3 + offscreen document) - Configurable silence threshold — set the volume level below which audio is considered silent (default: 30%)
- Dynamic threshold — automatically adjusts the silence threshold based on the audio content
- Adjustable speeds — set custom playback speed for normal parts (default: 1x) and silent parts (default: 3x)
- Mute silence — optionally mute audio during sped-up sections
- Audio sync fix — periodically resyncs audio/video to work around a Chromium bug
- Language selector — English and Japanese UI (toggle in the header)
- Command bar — quick-access overlay with keyboard shortcuts
- VU meter — visual volume indicator in the popup
- Download or clone this repository
- Build the extension:
pnpm install pnpm run build:mv3
- Open
chrome://extensions - Enable Developer mode
- Click Load unpacked and select the
build/chrome-mv3-prodfolder
# Install dependencies
pnpm install
# Build for Chrome MV3
pnpm run build:mv3
# The output will be at build/chrome-mv3-prod/- Open any page with video/audio (e.g. YouTube)
- Click the extension icon in the toolbar
- Toggle Enable Quick Skip Silence on
- The VU meter shows the current volume:
- Blue = normal playback
- Orange = sped up (silent section detected)
- Adjust the silence threshold slider to fine-tune detection sensitivity
- Set your preferred playback and silence speeds
| Shortcut | Action |
|---|---|
Ctrl+Shift+S |
Toggle enable/disable |
Alt+Shift+S |
Show/hide command bar |
- When enabled, the background service worker calls
chrome.tabCapture.getMediaStreamId()to get a stream ID for the active tab - An offscreen document is created and receives the stream ID
- The offscreen document calls
getUserMedia()with the tab audio stream, creates anAudioContext+AnalyserNode - Every 25ms, the RMS volume is calculated from the audio waveform
- The volume is sent back to the background via
chrome.runtime.sendMessage() TabCaptureControllercompares the volume against the threshold- When volume stays below threshold for N samples → speeds up (
state.media_speed = 3) - When volume rises above threshold → slows down (
state.media_speed = 1) - The content script detects the state change and applies
element.playbackRate
┌─────────────┐ streamId ┌──────────────────┐
│ Background │ ────────────────> │ Offscreen Doc │
│ (Service │ <──────────────── │ (AudioContext + │
│ Worker) │ tab-capture- │ AnalyserNode) │
│ │ volume │ │
│ TabCapture │ └──────────────────┘
│ Controller │
│ │ media_speed change
│ │ ────────────────> ┌──────────────────┐
└─────────────┘ │ Content Script │
│ (SpeedController) │
│ → playbackRate │
└──────────────────┘
| Setting | Default | Description |
|---|---|---|
| Playback Speed | 1x | Speed during normal (non-silent) audio |
| Silence Speed | 3x | Speed during silent sections |
| Silence Threshold | 30% | Volume level below which audio is considered silent |
| Dynamic Threshold | off | Auto-adjusts threshold based on audio content |
| Sample Threshold | 10 | Number of consecutive silent samples before speeding up |
| Mute Silence | off | Mute audio during sped-up sections |
| Keep Audio in Sync | off | Periodically resync to fix Chromium desync bug |
- Does not work on sites that use non-standard audio playback (e.g. Spotify Web Player)
- On Firefox, tab capture is not supported — only element-based analysis works
- Chromium has a bug where audio/video desync when repeatedly changing speed (workaround: "Keep Audio in Sync" setting)
Built with Plasmo framework.
# Install
pnpm install
# Dev server (Chrome MV3)
pnpm run dev:mv3
# Build
pnpm run build:mv3src/
├── background/
│ ├── BackgroundManager.ts # Tab management + TabCaptureController
│ └── index.ts # Entry point
├── contents/
│ ├── index.tsx # Content script entry
│ └── lib/
│ ├── SpeedController.ts # Applies playbackRate to media elements
│ ├── AudioSync.ts # Audio/video resync workaround
│ └── command-bar/ # Command bar overlay
├── shared/
│ ├── i18n.ts # Internationalization (EN/JA)
│ ├── state.ts # Extension state definition
│ ├── analytics.ts # Analytics (disabled)
│ ├── components/
│ │ ├── switch.tsx # Toggle switch component
│ │ └── speedSetting.tsx # Speed selector component
│ └── lib/
│ ├── SilenceSkipper.ts # Element-based silence detection
│ └── DynamicThresholdCalculator.ts
├── popup/
│ ├── index.tsx # Popup entry
│ └── components/
│ ├── header.tsx # Header with language toggle
│ ├── SettingsForm.tsx # Settings UI
│ └── Footer.tsx # Fork credit
├── assets/
│ ├── offscreen.html # Offscreen document for tab capture
│ └── offscreen.js # Audio analysis in offscreen context
locales/
├── en/messages.json # English strings
└── ja/messages.json # Japanese strings
This project is forked from vantezzen/skip-silence by vantezzen.
Original work inspired by CaryKH's automatic on-the-fly video editing tool.
MIT License — Copyright (c) 2019 Michael Xieyang Liu