Fast MP3 encoder written in TypeScript. Encode PCM audio to MP3 in the browser or Node.js — no native dependencies, no WebAssembly, just pure TypeScript.
lamets is an AI-assisted TypeScript port of jump3r (Java Unofficial MP3 EncodeR) by Ken Handel, which is a Java port of libmp3lame. Inspired by zhuker's lamejs.
- Works in browsers and Node.js
- ES modules and CommonJS
- TypeScript types included
- Mono and stereo encoding
- CBR encoding at 32-320 kbps
- Real-time encoding from microphone via Web Audio API
- Client-side WAV to MP3 conversion
| Package | Description |
|---|---|
| lamets | Core MP3 encoder |
| lamets-recorder | Record MP3 from the microphone in the browser |
npm install lametsimport{Mp3Encoder}from'lamets';constencoder=newMp3Encoder(1,44100,128);// mono, 44.1khz, 128kbpsconstsamples=newInt16Array(44100);// your PCM samples hereconstmp3Data=[];for(leti=0;i<samples.length;i+=1152){constchunk=samples.subarray(i,i+1152);constmp3buf=encoder.encodeBuffer(chunk);if(mp3buf.length>0)mp3Data.push(mp3buf);}constend=encoder.flush();if(end.length>0)mp3Data.push(end);constblob=newBlob(mp3Data,{type: 'audio/mp3'});npm install lamets-recorderimport{Recorder}from'lamets-recorder';constrecorder=newRecorder({kbps: 128});awaitrecorder.start();// ... user clicks stop ...constmp3Blob=recorder.stop();// returns a BlobWith level meter and timer callbacks:
constrecorder=newRecorder({kbps: 128,onLevel(rms){/* 0-1 RMS level, fires on each audio frame */},onTime(seconds){/* elapsed time, fires every second */},});constencoder=newMp3Encoder(2,44100,128);constleft=newInt16Array(44100);constright=newInt16Array(44100);for(leti=0;i<left.length;i+=1152){constmp3buf=encoder.encodeBuffer(left.subarray(i,i+1152),right.subarray(i,i+1152),);if(mp3buf.length>0)mp3Data.push(mp3buf);}LGPL-2.1-or-later