A minimal, elegant audio splicing tool for MP3 files. Load an MP3, place markers at split points, and download lossless audio segments with a single click.
β¨ Core Functionality
- π Upload single MP3 or bulk upload entire folders
- π Visual waveform with click-to-place markers
- βοΈ Editable marker timestamps for precise control
- π΅ Real-time preview of audio segments
- βοΈ Lossless audio splitting using FFmpeg
- π¦ Auto-packaged segments in ZIP format
- π¨ Modern, professional UI with smooth interactions
I built this tool to solve a specific need for my another project Murajah. I use this primarily for splitting long Qurβanic recitations of full Juzβ and Surahs into clean, verseβbyβverse segments. I wanted a workflow that was precise, and lossless. Since, Murajah focuses on structured memorization and review, it is important to make the split accurate.
Project link: https://github.com/wasi0013/murajah
Initially tried with AI models, however the output was clumsy, and sometime with awkward marker placement due to reciter's repition or subtle recitation styles.
This project aims to keep things simple: load an MP3, place markers, fineβtune timestamps down to milliseconds, preview segments, and export without reβencoding. It preserves the original audio quality from my favorite reciters.
- Node.js 18+
- FFmpeg installed:
brew install ffmpeg
- Install dependencies:
npm installThis installs dependencies for both frontend and backend via npm workspaces.
cd backend
npm run devcd frontend
npm run devFrontend runs on http://localhost:5174
Backend runs on http://localhost:3001
Frontend:
cd frontend && npm run buildBackend doesn't need building (ES modules).
- Click the "π Single File" button to upload a single MP3 file
- OR click "π Bulk Folder" to bulk upload multiple MP3s from a folder
- The waveform will display once the file loads
- Audio player controls appear below the waveform
You have two ways to add markers:
- Click anywhere on the waveform to place a marker at that position
- Markers appear as numbered points on the timeline.
- I usually mark the places where the wave has drop of energy. This placement are almost accurate for most cases.
- If the placements are slightly off, I modify the markers using the marker fields.
- Play the audio, listen attentively.
- Press the "+ Add Marker" button to mark the desired playback position realtime.
- Useful while listening to recitation to mark points in real-time with minimal effort.
- Look at the "Markers" section below the waveform
- Each marker shows a number and an editable timestamp field
- Click on the numbers of the timestamp to select the numbers and then replace it
- Accepted formats:
H:MM:SS.ms(e.g.,0:01:23.456) - Full precision with milliseconds- to replace
23select and highlight23then type your preferred value.
- The audio automatically seeks to the new position
- Markers auto-sort by time
- Click "Remove" to delete a marker
- The "Segments" section shows how your audio will be split:
- Segment 1: From start (0:00) to first marker
- Segment 2+: Between consecutive markers
- Last Segment: From last marker to end
- Hover over any segment to see its time range
- Click on a segment number to preview it (audio plays just that portion)
- The preview status shows:
Playing: Segment X (start β end)
- Click the "Split (X)" button (shows the number of segments that will be created)
- Processing starts - button shows "Processing..." state
- Once complete, a ZIP file automatically downloads containing:
- Numbered audio files:
originalfilename000.mp3,originalfilename001.mp3, etc. - Folder structure matching your input (for bulk uploads)
- Lossless quality preserved (codec copy, no re-encoding)
- Numbered audio files:
- All segments are automatically downloaded as
audio-segments.zip - Extract the ZIP to access individual MP3 files
- Each segment file is named:
[originalname][3-digit-number].mp3- Example:
podcast000.mp3,podcast001.mp3,podcast002.mp3
- Example:
- Each segment is lossless (no quality loss from the original)
- Files are numbered sequentially starting from 000
- Use the editable timestamp fields for frame-accurate control
- Copy-paste timestamps if you need to match multiple markers
- Use preview to verify segment boundaries before splitting
- Upload entire folders to process multiple files at once
- Select which file to edit using the dropdown
- All settings reset when you switch files
- The waveform may take a moment to render for large audio files
- Marker placement is instant once waveform loads
- Processing time depends on file size (large files take longer)
- Use Tab to move between marker timestamp fields
- Click outside the input or press Enter to confirm changes
- React 18
- Vite 5 (lightning-fast dev server)
- WaveSurfer.js 7.7 (waveform visualization)
- Modern CSS with gradients and smooth animations
- Node.js
- Express 4.18.2
- Multer (file upload handling)
- FFmpeg (audio processing)
- Archiver (ZIP packaging)
- Monorepo with npm workspaces
- Separate frontend and backend
- Lossless audio processing (codec copy)
- RESTful API
audio-splitter/
βββ frontend/ # React app (Vite)
β βββ src/
β β βββ App.jsx # Main component
β β βββ App.css # Modern styling
β β βββ Waveform.jsx # WaveSurfer wrapper
β β βββ main.jsx # Entry point
β βββ package.json
βββ backend/ # Express server
β βββ src/
β β βββ index.js # API server
β βββ package.json
βββ package.json # Workspace config
βββ README.md- Ensure file is a valid MP3
- Check browser console for errors
- Try a different MP3 file
- Ensure timestamp format is correct
- Clear browser cache and reload
- Ensure FFmpeg is installed:
brew install ffmpeg - Check that backend is running on port 3001
- Try with a smaller file first
- Check browser download settings
- Try a different browser if stuck
