Native G.711 µ-law decoder for Node.js. Optimized C++/N‑API binding for minimal overhead and maximum throughput.
npm install node-ulawnode-gyp with a single command; works across Linux, macOS, and Windows (with build tools).
bash
npm install node-ulaw
`
Prerequisites
This package includes a native addon built with node-gyp. You’ll need a C/C++ toolchain and Python installed:
$3
`bash
sudo apt update
sudo apt install build-essential python3
`
$3
`bash
xcode-select --install
brew install python
`
On install, the addon will compile automatically via the install script.
Usage
`js
const { decodeUlaw, encodeUlaw } = require('node-ulaw');
`
decodeUlaw(buffer: Buffer
- Input: Buffer of 8‑bit G.711 µ‑law samples
- Output: Buffer of little‑endian 16‑bit signed PCM samples
`js
const fs = require('fs');
const { decodeUlaw } = require('node-ulaw');
const ulaw = fs.readFileSync('input.ulaw');
const pcm = decodeUlaw(ulaw);
console.log(Decoded ${pcm.length/2} samples);
fs.writeFileSync('output.pcm', pcm);
`
#
encodeUlaw(buffer: Buffer
- Input: Buffer of little‑endian 16‑bit signed PCM samples
- Output: Buffer of 8‑bit G.711 µ‑law samples
`js
const fs = require('fs');
const { encodeUlaw } = require('node-ulaw');
const pcm = fs.readFileSync('output.pcm');
const ulaw = encodeUlaw(pcm);
fs.writeFileSync('reencoded.ulaw', ulaw);
`
Streaming Usage
For large files or real‑time streams, wrap in a Transform:
`js
const { Transform } = require('stream');
const { decodeUlaw } = require('node-ulaw');
class UlawDecoder extends Transform {
_transform(chunk, _, cb) {
try {
this.push(decodeUlaw(Buffer.from(chunk)));
cb();
} catch (err) {
cb(err);
}
}
}
// Usage:
fs.createReadStream('input.ulaw')
.pipe(new UlawDecoder())
.pipe(fs.createWriteStream('output.pcm'));
`
WAV Output Example
Wrap raw PCM in a playable WAV:
`js
const fs = require('fs');
const wav = require('wav-encoder');
const { decodeUlaw } = require('node-ulaw');
async function ulawToWav(inPath, outPath) {
const ulawBuf = fs.readFileSync(inPath);
const pcmBuf = decodeUlaw(ulawBuf);
const samples = new Int16Array(pcmBuf.buffer);
const wavData = await wav.encode({
sampleRate: 8000,
channelData: [samples]
});
fs.writeFileSync(outPath, Buffer.from(wavData));
}
ulawToWav('input.ulaw', 'output.wav');
`
Building From Source
If you clone the repo and want to rebuild:
`bash
npm install
npx node-gyp clean
npx node-gyp configure build
``