Batch workspace
Batch audio converter
Add as many files as your device can handle, mix formats freely, set the output once or per file, and convert the whole queue locally. Nothing is uploaded and no result leaves your device unless you download it.
…or drag files and folders here. Add as many as you like — everything is processed on this device.
.3g2 .3gp .aac .aif .aifc .aiff .amr .caf .flac .m4a .m4r .m4v .mkv .mov .mp3 .mp4 .oga .ogg .opus .qt .wav .wave .weba .webm
In one paragraph
This is the full workspace: every input format the engine reads, every output format it writes, and every control the individual tool pages expose in their focused form. It is the right page when your folder is heterogeneous — a few WAVs from a recorder, some M4A voice memos, a handful of MP3s and an OGG someone sent you — and you want them all to come out the same.
Batch is the part most browser converters get wrong, so it is worth being specific about what is here: reorderable queue, per-file and apply-to-all settings, a concurrency scheduler that reads your device’s CPU count and memory and picks a safe number of parallel jobs, real per-file and aggregate progress driven by decoded position rather than a timer, cancel and retry-failed, pause before the next file starts, individual downloads the moment each file is ready, sequential download mode so results never accumulate in memory, and a deterministic ZIP with a manifest recording every setting used.
Does this change the audio quality?
Quality depends entirely on the conversion you choose, and each file reports its own case: first-generation encodes from lossless sources, second-generation transcodes between lossy formats, and genuinely lossless paths are labelled differently in the queue.
- Budgets are enforced, not aspirational: 400 MB per file, 4 GB per batch, and a decoded-memory check before each job starts. Files that would exceed them are rejected up front rather than crashing the tab.
- Results live in memory until you download them. Closing or reloading the tab discards everything — that is the trade-off for never uploading.
- On iOS and Safari the engine runs single-threaded and one file at a time. Large batches are slower there and that is a platform limit, not a setting.
A worked example
A field-recording session with mixed sources
- Drag the folder in. Every file is probed locally: container, codec, duration, sample rate, channels and bitrate appear per row.
- Set MP3 at 192 kbps with Apply to all, then override the two interview files to mono 96 kbps with −16 LUFS normalisation.
- Reorder the queue so the files you need first are processed first, then press Convert all.
- Download each file as it turns green, or wait and take the ZIP — the manifest lists source name, output name, format, settings, bytes, duration and any warnings.
Set the common case with Apply to all, then override the exceptions
The fastest way through a mixed folder is to configure the majority once and fix the outliers individually — the queue keeps per-file overrides separate from the shared settings, and shows a marker on any row that differs. For batches above about fifty files, switch on sequential download mode: each output is saved as it completes and then released from memory, which keeps a long run stable. If your device gets warm or the page feels sluggish, lower the concurrency in the batch toolbar; the scheduler’s default is conservative but device conditions vary.
Supported formats, limits and browser notes
Sonic Batch decodes with the browser when it can (faster, no engine download) and falls back to the self-hosted WebAssembly engine when it cannot. Every combination below works in every listed browser; the column only tells you which decoder does the work.
| Input | What it is | Chrome | Firefox | Safari | iOS |
|---|---|---|---|---|---|
| MP3 | The universal lossy format. Plays on essentially every device made since 1998. | Native | Native | Native | Native |
| WAV | Raw PCM samples with a small header. Perfect fidelity, roughly 10 MB per stereo minute. | Native | Native | Native | Native |
| M4A | Apple’s default AAC container. Better quality than MP3 at the same bitrate. | Native | Native | Native | Native |
| AAC | Bare AAC frames with no MP4 wrapper — used by broadcast streams and some hardware. | Native | Partial | Native | Native |
| OGG | Royalty-free lossy codec. Standard in game engines, Godot, Unity and Wikimedia. | Native | Native | Engine | Engine |
| Opus | The best-sounding lossy codec below 128 kbps. Used by WhatsApp, Discord and YouTube. | Native | Native | Partial | Partial |
| FLAC | Lossless compression, typically 50–60% of WAV size, bit-identical when decoded. | Native | Native | Native | Native |
| AIFF | Apple’s uncompressed PCM format — the WAV equivalent for Logic and Pro Tools. | Partial | Partial | Native | Native |
| M4R | An M4A file with a .m4r extension. iOS only lists it as a ringtone if it is ≤ 40 seconds. | Partial | Partial | Native | Native |
| AMR | Phone-call speech codec: 8 kHz mono, 4.75–12.2 kbps. Decode only — nothing should be created in it. | Engine | Engine | Engine | Engine |
| CAF | Apple container used by older iOS Voice Memos. Usually holds ALAC, IMA4 or raw PCM. | Engine | Engine | Partial | Partial |
| 3GP | Legacy phone recording container, normally AMR-NB or low-bitrate AAC audio. | Engine | Engine | Partial | Partial |
| MOV | QuickTime video from iPhone and DSLR cameras. Audio is normally AAC or PCM. | Partial | Engine | Native | Native |
| MP4 | The standard video container. Its audio track is almost always AAC. | Native | Partial | Native | Native |
| WebM | Open container used by browser recorders and YouTube downloads. Audio is Opus or Vorbis. | Native | Native | Partial | Partial |
| Output | Encoder | Bitrates / depth | Sample rates | Tags |
|---|---|---|---|---|
| MP3 | libmp3lame | 32–320 kbps | 8–48 kHz | Yes + artwork |
| WAV | pcm_s16le | 16, 24, 32-bit | 8–96 kHz | Yes |
| FLAC | flac | 16, 24-bit | 8–96 kHz | Yes + artwork |
| M4A | aac | 32–320 kbps | 8–48 kHz | Yes + artwork |
| AAC | aac | 32–320 kbps | 8–48 kHz | No |
| OGG | libvorbis | 32–320 kbps | 8–96 kHz | Yes |
| Opus | libopus | 16–256 kbps | 8–48 kHz | Yes |
| AIFF | pcm_s16be | 16, 24-bit | 8–96 kHz | Yes |
| M4R | aac | 32–320 kbps | 8–48 kHz | Yes |
- Max per file
- 400.0 MB
- Max per queue
- 4.00 GB
- Max duration
- 4:00:00
- Max archive
- 1.50 GB
These are enforced ceilings, checked before any decoding starts, not measured maximums — a file over the limit is rejected rather than allowed to exhaust the tab’s memory. Real-world capacity is lower on older phones, which is why the scheduler runs one file at a time on iOS and Safari.
Where your audio goes
Nowhere. Your file is read from disk into this browser tab with the File API, decoded and encoded by code running in that same tab, and handed back to you as a download. It is never transmitted.
That is a structural property of the application, not a policy promise: there are no API routes, no server actions and no third-party processing services in this project, so there is nothing capable of receiving a file. The page’s Content-Security-Policy also restricts connections to this origin, and the automated test suite includes a browser test that fails if any network request during import, preview, conversion or download carries media bytes.
The trade-off, stated plainly:results live in your tab’s memory until you download them. Closing or reloading the page discards them. There is nothing on a server to recover, because nothing was ever put there.
Troubleshooting
The tab became unresponsive or reloaded during a big batch.
That is memory pressure — most likely on iOS, or with several very long files running in parallel. Lower the concurrency to 1, switch on sequential downloads, and convert long files in smaller groups.
Two source files have the same name.
Output names are de-duplicated automatically with a numeric suffix, and the manifest records both the original and the final name so nothing is silently overwritten in the ZIP.
Some files failed and some succeeded.
Retry failed re-runs only the failures, keeping the completed results. Each failure names its cause — unsupported codec, DRM, truncated file or an exceeded budget.
Progress sat at 99% for a while.
The last step is validation: the output container, duration, sample rate and channel count are checked, and where the browser can decode the result it is test-decoded. The job is not reported as complete until that passes.
Frequently asked questions
How many files can I convert at once?
There is no fixed count — the limit is memory. The enforced budgets are 400 MB per file and 4 GB per batch. Several hundred small files is routine on a desktop; on a phone, work in smaller groups.
Can I use different settings for different files?
Yes. Select one file, a group, or all of them, and change the output settings for just that selection. Rows with overrides are marked.
Is my audio uploaded to a server?
No, and there is no server-side code that could receive it: no API routes, no server actions, no third-party processing. The page’s Content-Security-Policy restricts connections to this origin, and a browser test in the project verifies that no request carries media during import, preview, conversion or download.
What is in the ZIP manifest?
For every job: source filename, output filename, output format, the full settings used, output size in bytes, duration, the processing path taken and any warnings raised. It is written deterministically so the same batch produces the same archive.
Do I need to install anything?
No. The engine is WebAssembly served from this site and cached by your browser. After the first load, conversion works without a network connection.