Local-only dark-themed A/B audio looper for language learning and close listening.
The app runs entirely in the browser. There is no backend, no uploads, and no cloud dependency. Open a local audio file, inspect its waveform, set or drag loop boundaries, and jump through detected speech sections.
- Open local audio files such as
mp3,wav,ogg,m4a, andaacwhen the browser can decode them - Dark waveform view with draggable loop region and visible section dividers
- Playback rate controls with pitch preservation
- Silence-based sentence/section detection with tunable sensitivity sliders
- Manual section editing by splitting at the playhead, dragging dividers, or deleting dividers to merge sections
- Per-file persistence for loop region, zoom, playback rate, detection settings, and custom sections
- Install dependencies:
npm install- Start the dev server:
npm run dev- Open:
http://127.0.0.1:5173/index.html
Build the app:
npm run buildServe the built files locally:
python3 -m http.server 4173 --directory distThen open:
http://127.0.0.1:4173/index.html
The production build emits dist/index.html as the primary entry point.
Space: Play / pauseLeft Arrow: Skip back 2 secondsRight Arrow: Skip forward 2 secondsDeleteorBackspace: Delete the selected divider and merge neighboring sections- Double-click the waveform: Split the current section at that point
- Drag the loop overlay: Adjust loop start/end directly on the waveform
- Drag a divider: Retime a section boundary
- Use a local HTTP server or Vite during development. Opening module files directly via
file://is not recommended. - MP3 timing can vary slightly depending on browser decoding behavior, so testing in your target browser is still a good idea.
npm run dev: Start the Vite dev servernpm run build: Type-check and build the production bundlenpm run preview: Preview the production build through Vitenpm test -- --run: Run the test suite once