parakeet.ts 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +286 -0
- package/dist/alignment.d.ts +36 -0
- package/dist/alignment.d.ts.map +1 -0
- package/dist/alignment.js +202 -0
- package/dist/alignment.js.map +1 -0
- package/dist/audio.d.ts +59 -0
- package/dist/audio.d.ts.map +1 -0
- package/dist/audio.js +324 -0
- package/dist/audio.js.map +1 -0
- package/dist/backend.d.ts +61 -0
- package/dist/backend.d.ts.map +1 -0
- package/dist/backend.js +14 -0
- package/dist/backend.js.map +1 -0
- package/dist/decode.d.ts +38 -0
- package/dist/decode.d.ts.map +1 -0
- package/dist/decode.js +124 -0
- package/dist/decode.js.map +1 -0
- package/dist/hub.d.ts +18 -0
- package/dist/hub.d.ts.map +1 -0
- package/dist/hub.js +86 -0
- package/dist/hub.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/load.d.ts +51 -0
- package/dist/load.d.ts.map +1 -0
- package/dist/load.js +34 -0
- package/dist/load.js.map +1 -0
- package/dist/mlx/attention.d.ts +61 -0
- package/dist/mlx/attention.d.ts.map +1 -0
- package/dist/mlx/attention.js +330 -0
- package/dist/mlx/attention.js.map +1 -0
- package/dist/mlx/audio.d.ts +46 -0
- package/dist/mlx/audio.d.ts.map +1 -0
- package/dist/mlx/audio.js +309 -0
- package/dist/mlx/audio.js.map +1 -0
- package/dist/mlx/backend.d.ts +22 -0
- package/dist/mlx/backend.d.ts.map +1 -0
- package/dist/mlx/backend.js +67 -0
- package/dist/mlx/backend.js.map +1 -0
- package/dist/mlx/cache.d.ts +23 -0
- package/dist/mlx/cache.d.ts.map +1 -0
- package/dist/mlx/cache.js +98 -0
- package/dist/mlx/cache.js.map +1 -0
- package/dist/mlx/cli.d.ts +12 -0
- package/dist/mlx/cli.d.ts.map +1 -0
- package/dist/mlx/cli.js +145 -0
- package/dist/mlx/cli.js.map +1 -0
- package/dist/mlx/conformer.d.ts +81 -0
- package/dist/mlx/conformer.d.ts.map +1 -0
- package/dist/mlx/conformer.js +315 -0
- package/dist/mlx/conformer.js.map +1 -0
- package/dist/mlx/index.d.ts +6 -0
- package/dist/mlx/index.d.ts.map +1 -0
- package/dist/mlx/index.js +9 -0
- package/dist/mlx/index.js.map +1 -0
- package/dist/mlx/load.d.ts +27 -0
- package/dist/mlx/load.d.ts.map +1 -0
- package/dist/mlx/load.js +161 -0
- package/dist/mlx/load.js.map +1 -0
- package/dist/mlx/nn.d.ts +121 -0
- package/dist/mlx/nn.d.ts.map +1 -0
- package/dist/mlx/nn.js +511 -0
- package/dist/mlx/nn.js.map +1 -0
- package/dist/mlx/rnnt.d.ts +59 -0
- package/dist/mlx/rnnt.d.ts.map +1 -0
- package/dist/mlx/rnnt.js +233 -0
- package/dist/mlx/rnnt.js.map +1 -0
- package/dist/mlx/server.d.ts +34 -0
- package/dist/mlx/server.d.ts.map +1 -0
- package/dist/mlx/server.js +115 -0
- package/dist/mlx/server.js.map +1 -0
- package/dist/mlx/utils.d.ts +19 -0
- package/dist/mlx/utils.d.ts.map +1 -0
- package/dist/mlx/utils.js +103 -0
- package/dist/mlx/utils.js.map +1 -0
- package/dist/model.d.ts +112 -0
- package/dist/model.d.ts.map +1 -0
- package/dist/model.js +196 -0
- package/dist/model.js.map +1 -0
- package/dist/onnx/backend.d.ts +55 -0
- package/dist/onnx/backend.d.ts.map +1 -0
- package/dist/onnx/backend.js +111 -0
- package/dist/onnx/backend.js.map +1 -0
- package/dist/onnx/index.d.ts +7 -0
- package/dist/onnx/index.d.ts.map +1 -0
- package/dist/onnx/index.js +6 -0
- package/dist/onnx/index.js.map +1 -0
- package/dist/onnx/parakeet.d.ts +44 -0
- package/dist/onnx/parakeet.d.ts.map +1 -0
- package/dist/onnx/parakeet.js +135 -0
- package/dist/onnx/parakeet.js.map +1 -0
- package/dist/tokenizer.d.ts +6 -0
- package/dist/tokenizer.d.ts.map +1 -0
- package/dist/tokenizer.js +8 -0
- package/dist/tokenizer.js.map +1 -0
- package/package.json +85 -0
package/dist/audio.js
ADDED
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Backend-agnostic audio front-end — pure TypeScript, no tensor library.
|
|
3
|
+
*
|
|
4
|
+
* This is a port of the MLX front-end in `src/mlx/audio.ts`, with the MxArray
|
|
5
|
+
* tail (filterbank matmul, log, per-feature normalize) rewritten over plain
|
|
6
|
+
* typed arrays so it runs identically under the MLX and ONNX backends.
|
|
7
|
+
*
|
|
8
|
+
* It intentionally reproduces parakeet-mlx's magnitude convention
|
|
9
|
+
* (`|re| + |im|`, not `sqrt(re^2 + im^2)`) so both backends see the same
|
|
10
|
+
* features. See docs/cuda.md for the parity analysis.
|
|
11
|
+
*/
|
|
12
|
+
import { spawnSync } from 'node:child_process';
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
// Audio loading
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
/** Decode any ffmpeg-readable file to mono float32 PCM in [-1, 1]. */
|
|
17
|
+
export function loadAudioRaw(filename, samplingRate) {
|
|
18
|
+
const result = spawnSync('ffmpeg', [
|
|
19
|
+
'-nostdin', '-i', filename,
|
|
20
|
+
'-threads', '0',
|
|
21
|
+
'-f', 's16le',
|
|
22
|
+
'-ac', '1',
|
|
23
|
+
'-acodec', 'pcm_s16le',
|
|
24
|
+
'-ar', String(samplingRate),
|
|
25
|
+
'-',
|
|
26
|
+
], { maxBuffer: 512 * 1024 * 1024 });
|
|
27
|
+
if (result.error)
|
|
28
|
+
throw new Error(`FFmpeg not found: ${result.error.message}`);
|
|
29
|
+
if (result.status !== 0) {
|
|
30
|
+
throw new Error(`FFmpeg failed: ${result.stderr?.toString() ?? 'unknown error'}`);
|
|
31
|
+
}
|
|
32
|
+
const buf = result.stdout;
|
|
33
|
+
const int16 = new Int16Array(buf.buffer, buf.byteOffset, buf.byteLength / 2);
|
|
34
|
+
const float32 = new Float32Array(int16.length);
|
|
35
|
+
for (let i = 0; i < int16.length; i++)
|
|
36
|
+
float32[i] = int16[i] / 32768.0;
|
|
37
|
+
return float32;
|
|
38
|
+
}
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
// Windows
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
function hanningWindow(size) {
|
|
43
|
+
const w = new Float32Array(size);
|
|
44
|
+
for (let i = 0; i < size; i++)
|
|
45
|
+
w[i] = 0.5 - 0.5 * Math.cos((2 * Math.PI * i) / size);
|
|
46
|
+
return w;
|
|
47
|
+
}
|
|
48
|
+
function hammingWindow(size) {
|
|
49
|
+
const w = new Float32Array(size);
|
|
50
|
+
for (let i = 0; i < size; i++)
|
|
51
|
+
w[i] = 0.54 - 0.46 * Math.cos((2 * Math.PI * i) / size);
|
|
52
|
+
return w;
|
|
53
|
+
}
|
|
54
|
+
function blackmanWindow(size) {
|
|
55
|
+
const w = new Float32Array(size);
|
|
56
|
+
for (let i = 0; i < size; i++) {
|
|
57
|
+
w[i] = 0.42 - 0.5 * Math.cos((2 * Math.PI * i) / size) + 0.08 * Math.cos((4 * Math.PI * i) / size);
|
|
58
|
+
}
|
|
59
|
+
return w;
|
|
60
|
+
}
|
|
61
|
+
function bartlettWindow(size) {
|
|
62
|
+
const w = new Float32Array(size);
|
|
63
|
+
for (let i = 0; i < size; i++)
|
|
64
|
+
w[i] = 1.0 - Math.abs((2 * i - size) / size);
|
|
65
|
+
return w;
|
|
66
|
+
}
|
|
67
|
+
export function getWindow(name, size) {
|
|
68
|
+
switch (name.toLowerCase()) {
|
|
69
|
+
case 'hann':
|
|
70
|
+
case 'hanning': return hanningWindow(size);
|
|
71
|
+
case 'hamming': return hammingWindow(size);
|
|
72
|
+
case 'blackman': return blackmanWindow(size);
|
|
73
|
+
case 'bartlett': return bartlettWindow(size);
|
|
74
|
+
default: return hanningWindow(size);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// ---------------------------------------------------------------------------
|
|
78
|
+
// FFT / STFT
|
|
79
|
+
// ---------------------------------------------------------------------------
|
|
80
|
+
/** Radix-2 Cooley-Tukey FFT. Returns interleaved [re, im] for the first nFft/2+1 bins. */
|
|
81
|
+
function rfft(input, nFft, re, im, out) {
|
|
82
|
+
const N = nFft;
|
|
83
|
+
re.set(input.subarray(0, Math.min(input.length, N)));
|
|
84
|
+
if (input.length < N)
|
|
85
|
+
re.fill(0, input.length);
|
|
86
|
+
im.fill(0);
|
|
87
|
+
let j = 0;
|
|
88
|
+
for (let i = 1; i < N; i++) {
|
|
89
|
+
let bit = N >> 1;
|
|
90
|
+
for (; j & bit; bit >>= 1)
|
|
91
|
+
j ^= bit;
|
|
92
|
+
j ^= bit;
|
|
93
|
+
if (i < j) {
|
|
94
|
+
const tr = re[i];
|
|
95
|
+
re[i] = re[j];
|
|
96
|
+
re[j] = tr;
|
|
97
|
+
const ti = im[i];
|
|
98
|
+
im[i] = im[j];
|
|
99
|
+
im[j] = ti;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
for (let len = 2; len <= N; len <<= 1) {
|
|
103
|
+
const ang = (-2 * Math.PI) / len;
|
|
104
|
+
const wRe = Math.cos(ang), wIm = Math.sin(ang);
|
|
105
|
+
const half = len >> 1;
|
|
106
|
+
for (let i = 0; i < N; i += len) {
|
|
107
|
+
let curRe = 1.0, curIm = 0.0;
|
|
108
|
+
for (let k = 0; k < half; k++) {
|
|
109
|
+
const uRe = re[i + k], uIm = im[i + k];
|
|
110
|
+
const aRe = re[i + k + half], aIm = im[i + k + half];
|
|
111
|
+
const vRe = aRe * curRe - aIm * curIm;
|
|
112
|
+
const vIm = aRe * curIm + aIm * curRe;
|
|
113
|
+
re[i + k] = uRe + vRe;
|
|
114
|
+
im[i + k] = uIm + vIm;
|
|
115
|
+
re[i + k + half] = uRe - vRe;
|
|
116
|
+
im[i + k + half] = uIm - vIm;
|
|
117
|
+
const n = curRe * wRe - curIm * wIm;
|
|
118
|
+
curIm = curRe * wIm + curIm * wRe;
|
|
119
|
+
curRe = n;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
const numBins = (N >> 1) + 1;
|
|
124
|
+
for (let i = 0; i < numBins; i++) {
|
|
125
|
+
out[i * 2] = re[i];
|
|
126
|
+
out[i * 2 + 1] = im[i];
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/** STFT magnitude, [numFrames, nFft/2+1]. */
|
|
130
|
+
function computeStft(signal, nFft, hopLength, winLength, window, magPower) {
|
|
131
|
+
const padding = Math.floor(nFft / 2);
|
|
132
|
+
const padded = new Float32Array(signal.length + 2 * padding);
|
|
133
|
+
for (let i = 0; i < padding; i++)
|
|
134
|
+
padded[padding - 1 - i] = signal[i + 1] ?? 0;
|
|
135
|
+
padded.set(signal, padding);
|
|
136
|
+
for (let i = 0; i < padding; i++) {
|
|
137
|
+
const srcIdx = signal.length - 2 - i;
|
|
138
|
+
padded[padding + signal.length + i] = signal[Math.max(0, srcIdx)] ?? 0;
|
|
139
|
+
}
|
|
140
|
+
const numBins = Math.floor(nFft / 2) + 1;
|
|
141
|
+
const numFrames = Math.max(0, Math.floor((padded.length - winLength) / hopLength) + 1);
|
|
142
|
+
// window is zero-padded to nFft at the END (matches parakeet-mlx)
|
|
143
|
+
const win = new Float32Array(nFft);
|
|
144
|
+
win.set(window.subarray(0, Math.min(winLength, nFft)));
|
|
145
|
+
const magnitude = new Float32Array(numFrames * numBins);
|
|
146
|
+
const frame = new Float32Array(nFft);
|
|
147
|
+
const re = new Float32Array(nFft);
|
|
148
|
+
const im = new Float32Array(nFft);
|
|
149
|
+
const spectrum = new Float32Array(numBins * 2);
|
|
150
|
+
for (let t = 0; t < numFrames; t++) {
|
|
151
|
+
const start = t * hopLength;
|
|
152
|
+
for (let i = 0; i < nFft; i++)
|
|
153
|
+
frame[i] = (padded[start + i] ?? 0) * win[i];
|
|
154
|
+
rfft(frame, nFft, re, im, spectrum);
|
|
155
|
+
const base = t * numBins;
|
|
156
|
+
if (magPower === 1.0) {
|
|
157
|
+
for (let k = 0; k < numBins; k++) {
|
|
158
|
+
magnitude[base + k] = Math.abs(spectrum[k * 2]) + Math.abs(spectrum[k * 2 + 1]);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
for (let k = 0; k < numBins; k++) {
|
|
163
|
+
const mag = Math.abs(spectrum[k * 2]) + Math.abs(spectrum[k * 2 + 1]);
|
|
164
|
+
magnitude[base + k] = Math.pow(mag, magPower);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return { magnitude, numFrames, numBins };
|
|
169
|
+
}
|
|
170
|
+
// ---------------------------------------------------------------------------
|
|
171
|
+
// Mel filterbanks
|
|
172
|
+
// ---------------------------------------------------------------------------
|
|
173
|
+
/**
|
|
174
|
+
* Filterbank as parakeet-mlx builds it: mel points snapped to FFT bins with
|
|
175
|
+
* `floor`. NOTE: at 16 kHz / nFft 512 / 128 mels this collapses 13 rows to all
|
|
176
|
+
* zero — see docs/cuda.md. Kept as the default for bit-compatibility with the
|
|
177
|
+
* existing MLX path and the current test fixtures.
|
|
178
|
+
*/
|
|
179
|
+
export function computeMelFilterbanks(sr, nFft, nMels, fMin, fMax) {
|
|
180
|
+
const numBins = Math.floor(nFft / 2) + 1;
|
|
181
|
+
const hzToMel = (hz) => 2595 * Math.log10(1 + hz / 700);
|
|
182
|
+
const melToHz = (mel) => 700 * (Math.pow(10, mel / 2595) - 1);
|
|
183
|
+
const melMin = hzToMel(fMin), melMax = hzToMel(fMax);
|
|
184
|
+
const melPoints = new Float32Array(nMels + 2);
|
|
185
|
+
for (let i = 0; i < nMels + 2; i++)
|
|
186
|
+
melPoints[i] = melMin + (i / (nMels + 1)) * (melMax - melMin);
|
|
187
|
+
const hzPoints = melPoints.map(m => melToHz(m));
|
|
188
|
+
const binPoints = hzPoints.map(hz => Math.floor((hz * (nFft + 1)) / sr));
|
|
189
|
+
const fb = new Float32Array(nMels * numBins);
|
|
190
|
+
for (let m = 0; m < nMels; m++) {
|
|
191
|
+
const fLeft = binPoints[m], fCenter = binPoints[m + 1], fRight = binPoints[m + 2];
|
|
192
|
+
for (let k = fLeft; k < fCenter; k++) {
|
|
193
|
+
if (k >= 0 && k < numBins)
|
|
194
|
+
fb[m * numBins + k] = (k - fLeft) / Math.max(1, fCenter - fLeft);
|
|
195
|
+
}
|
|
196
|
+
for (let k = fCenter; k <= fRight; k++) {
|
|
197
|
+
if (k >= 0 && k < numBins)
|
|
198
|
+
fb[m * numBins + k] = (fRight - k) / Math.max(1, fRight - fCenter);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
for (let m = 0; m < nMels; m++) {
|
|
202
|
+
const norm = 2.0 / Math.max(1e-8, hzPoints[m + 2] - hzPoints[m]);
|
|
203
|
+
for (let k = 0; k < numBins; k++)
|
|
204
|
+
fb[m * numBins + k] *= norm;
|
|
205
|
+
}
|
|
206
|
+
return fb;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* librosa/NeMo-style filterbank: triangles evaluated on continuous frequencies,
|
|
210
|
+
* so no rows collapse. Matches NVIDIA's reference preprocessor. Opt in via
|
|
211
|
+
* `makePreprocessArgs({ filterbank: 'interpolated' })`.
|
|
212
|
+
*/
|
|
213
|
+
export function computeMelFilterbanksInterpolated(sr, nFft, nMels, fMin, fMax) {
|
|
214
|
+
const numBins = Math.floor(nFft / 2) + 1;
|
|
215
|
+
const hzToMel = (hz) => 2595 * Math.log10(1 + hz / 700);
|
|
216
|
+
const melToHz = (mel) => 700 * (Math.pow(10, mel / 2595) - 1);
|
|
217
|
+
const melMin = hzToMel(fMin), melMax = hzToMel(fMax);
|
|
218
|
+
const hzPoints = new Float64Array(nMels + 2);
|
|
219
|
+
for (let i = 0; i < nMels + 2; i++) {
|
|
220
|
+
hzPoints[i] = melToHz(melMin + (i / (nMels + 1)) * (melMax - melMin));
|
|
221
|
+
}
|
|
222
|
+
const fftFreqs = new Float64Array(numBins);
|
|
223
|
+
for (let k = 0; k < numBins; k++)
|
|
224
|
+
fftFreqs[k] = (k * sr) / nFft;
|
|
225
|
+
const fb = new Float32Array(nMels * numBins);
|
|
226
|
+
for (let m = 0; m < nMels; m++) {
|
|
227
|
+
const l = hzPoints[m], c = hzPoints[m + 1], r = hzPoints[m + 2];
|
|
228
|
+
const norm = 2.0 / Math.max(1e-8, r - l);
|
|
229
|
+
for (let k = 0; k < numBins; k++) {
|
|
230
|
+
const f = fftFreqs[k];
|
|
231
|
+
const up = (f - l) / Math.max(1e-8, c - l);
|
|
232
|
+
const dn = (r - f) / Math.max(1e-8, r - c);
|
|
233
|
+
fb[m * numBins + k] = Math.max(0, Math.min(up, dn)) * norm;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
return fb;
|
|
237
|
+
}
|
|
238
|
+
// ---------------------------------------------------------------------------
|
|
239
|
+
// Log-mel
|
|
240
|
+
// ---------------------------------------------------------------------------
|
|
241
|
+
export function makePreprocessArgs(args) {
|
|
242
|
+
const winLength = Math.round(args.windowSize * args.sampleRate);
|
|
243
|
+
const hopLength = Math.round(args.windowStride * args.sampleRate);
|
|
244
|
+
const build = args.filterbank === 'interpolated'
|
|
245
|
+
? computeMelFilterbanksInterpolated
|
|
246
|
+
: computeMelFilterbanks;
|
|
247
|
+
const filterbanks = build(args.sampleRate, args.nFft, args.features, 0, args.sampleRate / 2);
|
|
248
|
+
return {
|
|
249
|
+
...args,
|
|
250
|
+
padTo: args.padTo ?? 0,
|
|
251
|
+
padValue: args.padValue ?? 0,
|
|
252
|
+
preemph: args.preemph !== undefined ? args.preemph : 0.97,
|
|
253
|
+
magPower: args.magPower ?? 2.0,
|
|
254
|
+
winLength,
|
|
255
|
+
hopLength,
|
|
256
|
+
filterbanks,
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
/** Log-mel spectrogram from mono PCM. Output is [nMels, numFrames]. */
|
|
260
|
+
export function getLogMel(signalIn, args) {
|
|
261
|
+
let signal = signalIn;
|
|
262
|
+
if (args.padTo > 0 && signal.length < args.padTo) {
|
|
263
|
+
const padded = new Float32Array(args.padTo).fill(args.padValue);
|
|
264
|
+
padded.set(signal);
|
|
265
|
+
signal = padded;
|
|
266
|
+
}
|
|
267
|
+
if (args.preemph !== null) {
|
|
268
|
+
const p = new Float32Array(signal.length);
|
|
269
|
+
p[0] = signal[0];
|
|
270
|
+
for (let i = 1; i < signal.length; i++)
|
|
271
|
+
p[i] = signal[i] - args.preemph * signal[i - 1];
|
|
272
|
+
signal = p;
|
|
273
|
+
}
|
|
274
|
+
const win = getWindow(args.window, args.winLength);
|
|
275
|
+
const { magnitude, numFrames, numBins } = computeStft(signal, args.nFft, args.hopLength, args.winLength, win, args.magPower);
|
|
276
|
+
const nMels = args.features;
|
|
277
|
+
const fb = args.filterbanks;
|
|
278
|
+
// mel[m, t] = log(sum_k fb[m, k] * mag[t, k] + 1e-5)
|
|
279
|
+
const out = new Float32Array(nMels * numFrames);
|
|
280
|
+
for (let m = 0; m < nMels; m++) {
|
|
281
|
+
const fbRow = m * numBins;
|
|
282
|
+
const outRow = m * numFrames;
|
|
283
|
+
for (let t = 0; t < numFrames; t++) {
|
|
284
|
+
let acc = 0;
|
|
285
|
+
const magRow = t * numBins;
|
|
286
|
+
for (let k = 0; k < numBins; k++)
|
|
287
|
+
acc += fb[fbRow + k] * magnitude[magRow + k];
|
|
288
|
+
out[outRow + t] = Math.log(acc + 1e-5);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
if (args.normalize === 'per_feature') {
|
|
292
|
+
for (let m = 0; m < nMels; m++) {
|
|
293
|
+
const base = m * numFrames;
|
|
294
|
+
let mean = 0;
|
|
295
|
+
for (let t = 0; t < numFrames; t++)
|
|
296
|
+
mean += out[base + t];
|
|
297
|
+
mean /= numFrames;
|
|
298
|
+
let varr = 0;
|
|
299
|
+
for (let t = 0; t < numFrames; t++) {
|
|
300
|
+
const d = out[base + t] - mean;
|
|
301
|
+
varr += d * d;
|
|
302
|
+
}
|
|
303
|
+
const inv = 1 / (Math.sqrt(varr / numFrames) + 1e-5);
|
|
304
|
+
for (let t = 0; t < numFrames; t++)
|
|
305
|
+
out[base + t] = (out[base + t] - mean) * inv;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
else {
|
|
309
|
+
let mean = 0;
|
|
310
|
+
for (let i = 0; i < out.length; i++)
|
|
311
|
+
mean += out[i];
|
|
312
|
+
mean /= out.length;
|
|
313
|
+
let varr = 0;
|
|
314
|
+
for (let i = 0; i < out.length; i++) {
|
|
315
|
+
const d = out[i] - mean;
|
|
316
|
+
varr += d * d;
|
|
317
|
+
}
|
|
318
|
+
const inv = 1 / (Math.sqrt(varr / out.length) + 1e-5);
|
|
319
|
+
for (let i = 0; i < out.length; i++)
|
|
320
|
+
out[i] = (out[i] - mean) * inv;
|
|
321
|
+
}
|
|
322
|
+
return { data: out, nMels, numFrames };
|
|
323
|
+
}
|
|
324
|
+
//# sourceMappingURL=audio.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audio.js","sourceRoot":"","sources":["../src/audio.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The backend boundary.
|
|
3
|
+
*
|
|
4
|
+
* The library is abstracted at the *model* boundary, not the tensor boundary:
|
|
5
|
+
* everything except the encoder forward and the prediction+joint step is plain
|
|
6
|
+
* TypeScript and shared by all backends.
|
|
7
|
+
*
|
|
8
|
+
* Two calls are enough. The ONNX export fuses the prediction network and the
|
|
9
|
+
* joint network into a single `decoder_joint` graph that cannot be split, so
|
|
10
|
+
* `decodeStep` is the unit of work — the MLX backend simply calls its own
|
|
11
|
+
* `predict` and `joint` back to back behind it.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Which axis is contiguous in `EncoderOutput.data`.
|
|
15
|
+
* ONNX emits [1, dim, time] ("dim-major"); the MLX encoder emits
|
|
16
|
+
* [1, time, dim] ("time-major"). Declaring it avoids a transpose copy.
|
|
17
|
+
*/
|
|
18
|
+
export type EncoderLayout = 'dim-major' | 'time-major';
|
|
19
|
+
/** Encoder output for a single utterance, flattened row-major. */
|
|
20
|
+
export interface EncoderOutput {
|
|
21
|
+
/** length dim * timeStride */
|
|
22
|
+
data: Float32Array;
|
|
23
|
+
/** encoder hidden size */
|
|
24
|
+
dim: number;
|
|
25
|
+
/** number of valid time frames */
|
|
26
|
+
frames: number;
|
|
27
|
+
/**
|
|
28
|
+
* Allocated extent of the time axis, which can exceed `frames` when the graph
|
|
29
|
+
* pads. Used as the row stride for 'dim-major'.
|
|
30
|
+
*/
|
|
31
|
+
stride: number;
|
|
32
|
+
layout: EncoderLayout;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Opaque, backend-owned decoder state (the prediction network's LSTM state).
|
|
36
|
+
* The decode loop only threads it through; it never inspects it.
|
|
37
|
+
*/
|
|
38
|
+
export type DecoderStateHandle = unknown;
|
|
39
|
+
export interface DecodeStepResult {
|
|
40
|
+
/** joint logits: vocab + blank + durations */
|
|
41
|
+
logits: Float32Array;
|
|
42
|
+
state: DecoderStateHandle;
|
|
43
|
+
}
|
|
44
|
+
export interface ParakeetBackend {
|
|
45
|
+
/** Human-readable backend id, e.g. "mlx" or "onnx-cuda". */
|
|
46
|
+
readonly name: string;
|
|
47
|
+
/** Encoder hidden size. */
|
|
48
|
+
readonly encoderDim: number;
|
|
49
|
+
/** Run the conformer encoder over a log-mel spectrogram laid out [nMels, numFrames]. */
|
|
50
|
+
encode(mel: Float32Array, nMels: number, numFrames: number): Promise<EncoderOutput>;
|
|
51
|
+
/**
|
|
52
|
+
* One autoregressive decode step.
|
|
53
|
+
* @param encFrame a single encoder frame, length `encoderDim`
|
|
54
|
+
* @param token previously emitted token id, or `null` at sequence start
|
|
55
|
+
* @param state previous decoder state, or `null` at sequence start
|
|
56
|
+
*/
|
|
57
|
+
decodeStep(encFrame: Float32Array, token: number | null, state: DecoderStateHandle | null): Promise<DecodeStepResult>;
|
|
58
|
+
/** Release any native resources. */
|
|
59
|
+
dispose?(): void | Promise<void>;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=backend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,YAAY,CAAC;AAEvD,kEAAkE;AAClE,MAAM,WAAW,aAAa;IAC5B,8BAA8B;IAC9B,IAAI,EAAE,YAAY,CAAC;IACnB,0BAA0B;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,kCAAkC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,aAAa,CAAC;CACvB;AAED;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG,OAAO,CAAC;AAEzC,MAAM,WAAW,gBAAgB;IAC/B,8CAA8C;IAC9C,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,EAAE,kBAAkB,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,4DAA4D;IAC5D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,2BAA2B;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAE5B,wFAAwF;IACxF,MAAM,CAAC,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IAEpF;;;;;OAKG;IACH,UAAU,CACR,QAAQ,EAAE,YAAY,EACtB,KAAK,EAAE,MAAM,GAAG,IAAI,EACpB,KAAK,EAAE,kBAAkB,GAAG,IAAI,GAC/B,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAE7B,oCAAoC;IACpC,OAAO,CAAC,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClC"}
|
package/dist/backend.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The backend boundary.
|
|
3
|
+
*
|
|
4
|
+
* The library is abstracted at the *model* boundary, not the tensor boundary:
|
|
5
|
+
* everything except the encoder forward and the prediction+joint step is plain
|
|
6
|
+
* TypeScript and shared by all backends.
|
|
7
|
+
*
|
|
8
|
+
* Two calls are enough. The ONNX export fuses the prediction network and the
|
|
9
|
+
* joint network into a single `decoder_joint` graph that cannot be split, so
|
|
10
|
+
* `decodeStep` is the unit of work — the MLX backend simply calls its own
|
|
11
|
+
* `predict` and `joint` back to back behind it.
|
|
12
|
+
*/
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=backend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend.js","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
|
package/dist/decode.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Backend-agnostic greedy decoding.
|
|
3
|
+
*
|
|
4
|
+
* These loops previously lived inside the MLX backend and operated on MxArray.
|
|
5
|
+
* They are plain TypeScript over typed arrays now, and drive any
|
|
6
|
+
* `ParakeetBackend`. Semantics (blank handling, duration stepping, maxSymbols
|
|
7
|
+
* guard, entropy confidence, timestamps) are unchanged from the MLX versions in
|
|
8
|
+
* `src/mlx/rnnt.ts`.
|
|
9
|
+
*/
|
|
10
|
+
import type { ParakeetBackend, EncoderOutput, DecoderStateHandle } from './backend.js';
|
|
11
|
+
import { AlignedToken } from './alignment.js';
|
|
12
|
+
export interface DecoderState {
|
|
13
|
+
lastToken: number | null;
|
|
14
|
+
hiddenState: DecoderStateHandle | null;
|
|
15
|
+
}
|
|
16
|
+
export interface GreedyOptions {
|
|
17
|
+
vocabulary: string[];
|
|
18
|
+
maxSymbols: number | null;
|
|
19
|
+
timeRatio: number;
|
|
20
|
+
/** Absolute time offset (seconds) added to emitted token starts. */
|
|
21
|
+
timeOffset?: number;
|
|
22
|
+
/** Decode only frames in [from, to). Defaults to the whole encoder output. */
|
|
23
|
+
from?: number;
|
|
24
|
+
to?: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Greedy TDT decoding. `durations` is the TDT duration table, e.g. [0,1,2,3,4].
|
|
28
|
+
*/
|
|
29
|
+
export declare function decodeTDTGreedy(backend: ParakeetBackend, enc: EncoderOutput, durations: number[], state: DecoderState, opts: GreedyOptions): Promise<{
|
|
30
|
+
tokens: AlignedToken[];
|
|
31
|
+
state: DecoderState;
|
|
32
|
+
}>;
|
|
33
|
+
/** Greedy RNN-T decoding (no duration head). */
|
|
34
|
+
export declare function decodeRNNTGreedy(backend: ParakeetBackend, enc: EncoderOutput, state: DecoderState, opts: GreedyOptions): Promise<{
|
|
35
|
+
tokens: AlignedToken[];
|
|
36
|
+
state: DecoderState;
|
|
37
|
+
}>;
|
|
38
|
+
//# sourceMappingURL=decode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decode.d.ts","sourceRoot":"","sources":["../src/decode.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACvF,OAAO,EAAoB,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAGhE,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,kBAAkB,GAAG,IAAI,CAAC;CACxC;AAwCD,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8EAA8E;IAC9E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,eAAe,EACxB,GAAG,EAAE,aAAa,EAClB,SAAS,EAAE,MAAM,EAAE,EACnB,KAAK,EAAE,YAAY,EACnB,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC;IAAE,MAAM,EAAE,YAAY,EAAE,CAAC;IAAC,KAAK,EAAE,YAAY,CAAA;CAAE,CAAC,CA+C1D;AAED,gDAAgD;AAChD,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,eAAe,EACxB,GAAG,EAAE,aAAa,EAClB,KAAK,EAAE,YAAY,EACnB,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC;IAAE,MAAM,EAAE,YAAY,EAAE,CAAC;IAAC,KAAK,EAAE,YAAY,CAAA;CAAE,CAAC,CAyC1D"}
|
package/dist/decode.js
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { makeAlignedToken } from './alignment.js';
|
|
2
|
+
import { decode as decodeTokens } from './tokenizer.js';
|
|
3
|
+
/** Copy encoder frame `t` into `out`, honouring the backend's layout. */
|
|
4
|
+
function readFrame(enc, t, out) {
|
|
5
|
+
if (enc.layout === 'time-major') {
|
|
6
|
+
const base = t * enc.dim;
|
|
7
|
+
for (let d = 0; d < enc.dim; d++)
|
|
8
|
+
out[d] = enc.data[base + d];
|
|
9
|
+
}
|
|
10
|
+
else {
|
|
11
|
+
for (let d = 0; d < enc.dim; d++)
|
|
12
|
+
out[d] = enc.data[d * enc.stride + t];
|
|
13
|
+
}
|
|
14
|
+
return out;
|
|
15
|
+
}
|
|
16
|
+
/** Softmax in place over `n` values starting at `offset`, returning the array. */
|
|
17
|
+
function softmax(src, offset, n) {
|
|
18
|
+
const out = new Float32Array(n);
|
|
19
|
+
let max = -Infinity;
|
|
20
|
+
for (let i = 0; i < n; i++) {
|
|
21
|
+
const v = src[offset + i];
|
|
22
|
+
if (v > max)
|
|
23
|
+
max = v;
|
|
24
|
+
}
|
|
25
|
+
let sum = 0;
|
|
26
|
+
for (let i = 0; i < n; i++) {
|
|
27
|
+
const e = Math.exp(src[offset + i] - max);
|
|
28
|
+
out[i] = e;
|
|
29
|
+
sum += e;
|
|
30
|
+
}
|
|
31
|
+
for (let i = 0; i < n; i++)
|
|
32
|
+
out[i] /= sum;
|
|
33
|
+
return out;
|
|
34
|
+
}
|
|
35
|
+
function argmax(a) {
|
|
36
|
+
let best = 0, bv = a[0];
|
|
37
|
+
for (let i = 1; i < a.length; i++)
|
|
38
|
+
if (a[i] > bv) {
|
|
39
|
+
bv = a[i];
|
|
40
|
+
best = i;
|
|
41
|
+
}
|
|
42
|
+
return best;
|
|
43
|
+
}
|
|
44
|
+
/** Normalized-entropy confidence, matching the MLX implementation. */
|
|
45
|
+
function confidenceOf(probs) {
|
|
46
|
+
let entropy = 0;
|
|
47
|
+
for (let i = 0; i < probs.length; i++) {
|
|
48
|
+
const p = probs[i] + 1e-10;
|
|
49
|
+
entropy -= p * Math.log(p);
|
|
50
|
+
}
|
|
51
|
+
return 1.0 - entropy / Math.log(probs.length);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Greedy TDT decoding. `durations` is the TDT duration table, e.g. [0,1,2,3,4].
|
|
55
|
+
*/
|
|
56
|
+
export async function decodeTDTGreedy(backend, enc, durations, state, opts) {
|
|
57
|
+
const { vocabulary, maxSymbols, timeRatio, timeOffset = 0 } = opts;
|
|
58
|
+
const from = opts.from ?? 0;
|
|
59
|
+
const to = Math.min(opts.to ?? enc.frames, enc.frames);
|
|
60
|
+
const vocabSize = vocabulary.length;
|
|
61
|
+
const tokens = [];
|
|
62
|
+
const frame = new Float32Array(enc.dim);
|
|
63
|
+
let { lastToken, hiddenState } = state;
|
|
64
|
+
let step = from;
|
|
65
|
+
let newSymbols = 0;
|
|
66
|
+
while (step < to) {
|
|
67
|
+
readFrame(enc, step, frame);
|
|
68
|
+
const { logits, state: nextState } = await backend.decodeStep(frame, lastToken, hiddenState);
|
|
69
|
+
const tokenProbs = softmax(logits, 0, vocabSize + 1);
|
|
70
|
+
const durationProbs = softmax(logits, vocabSize + 1, durations.length);
|
|
71
|
+
const predToken = argmax(tokenProbs);
|
|
72
|
+
const decision = argmax(durationProbs);
|
|
73
|
+
const isBlank = predToken === vocabSize;
|
|
74
|
+
if (!isBlank) {
|
|
75
|
+
tokens.push(makeAlignedToken(predToken, decodeTokens([predToken], vocabulary), timeOffset + step * timeRatio, durations[decision] * timeRatio, confidenceOf(tokenProbs)));
|
|
76
|
+
lastToken = predToken;
|
|
77
|
+
hiddenState = nextState;
|
|
78
|
+
}
|
|
79
|
+
step += durations[decision];
|
|
80
|
+
newSymbols += 1;
|
|
81
|
+
if (durations[decision] !== 0) {
|
|
82
|
+
newSymbols = 0;
|
|
83
|
+
}
|
|
84
|
+
else if (maxSymbols !== null && newSymbols >= maxSymbols) {
|
|
85
|
+
step += 1;
|
|
86
|
+
newSymbols = 0;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return { tokens, state: { lastToken, hiddenState } };
|
|
90
|
+
}
|
|
91
|
+
/** Greedy RNN-T decoding (no duration head). */
|
|
92
|
+
export async function decodeRNNTGreedy(backend, enc, state, opts) {
|
|
93
|
+
const { vocabulary, maxSymbols, timeRatio, timeOffset = 0 } = opts;
|
|
94
|
+
const from = opts.from ?? 0;
|
|
95
|
+
const to = Math.min(opts.to ?? enc.frames, enc.frames);
|
|
96
|
+
const vocabSize = vocabulary.length;
|
|
97
|
+
const tokens = [];
|
|
98
|
+
const frame = new Float32Array(enc.dim);
|
|
99
|
+
let { lastToken, hiddenState } = state;
|
|
100
|
+
let step = from;
|
|
101
|
+
let newSymbols = 0;
|
|
102
|
+
while (step < to) {
|
|
103
|
+
readFrame(enc, step, frame);
|
|
104
|
+
const { logits, state: nextState } = await backend.decodeStep(frame, lastToken, hiddenState);
|
|
105
|
+
const tokenProbs = softmax(logits, 0, vocabSize + 1);
|
|
106
|
+
const predToken = argmax(tokenProbs);
|
|
107
|
+
if (predToken !== vocabSize) {
|
|
108
|
+
tokens.push(makeAlignedToken(predToken, decodeTokens([predToken], vocabulary), timeOffset + step * timeRatio, timeRatio, confidenceOf(tokenProbs)));
|
|
109
|
+
lastToken = predToken;
|
|
110
|
+
hiddenState = nextState;
|
|
111
|
+
newSymbols += 1;
|
|
112
|
+
if (maxSymbols !== null && newSymbols >= maxSymbols) {
|
|
113
|
+
step += 1;
|
|
114
|
+
newSymbols = 0;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
step += 1;
|
|
119
|
+
newSymbols = 0;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return { tokens, state: { lastToken, hiddenState } };
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=decode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decode.js","sourceRoot":"","sources":["../src/decode.ts"],"names":[],"mappings":"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"}
|
package/dist/hub.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export type ProgressFn = (downloaded: number, total: number) => void;
|
|
2
|
+
/** Default HF cache root, honouring HF_HOME / HF_HUB_CACHE like huggingface_hub. */
|
|
3
|
+
export declare function defaultCacheDir(): string;
|
|
4
|
+
/** Local directory a repo's files are cached in. */
|
|
5
|
+
export declare function repoDir(repoId: string, cacheDir?: string): string;
|
|
6
|
+
/**
|
|
7
|
+
* Fetch one file from a repo, returning its local path. No-op if already cached.
|
|
8
|
+
*/
|
|
9
|
+
export declare function downloadFromHub(repoId: string, filename: string, cacheDir?: string, onProgress?: ProgressFn): Promise<string>;
|
|
10
|
+
/**
|
|
11
|
+
* Fetch several files, skipping any marked optional that 404.
|
|
12
|
+
* Returns the repo's local directory.
|
|
13
|
+
*/
|
|
14
|
+
export declare function downloadRepoFiles(repoId: string, files: Array<{
|
|
15
|
+
name: string;
|
|
16
|
+
optional?: boolean;
|
|
17
|
+
}>, cacheDir?: string, onProgress?: (file: string, downloaded: number, total: number) => void): Promise<string>;
|
|
18
|
+
//# sourceMappingURL=hub.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hub.d.ts","sourceRoot":"","sources":["../src/hub.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,UAAU,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;AAErE,oFAAoF;AACpF,wBAAgB,eAAe,IAAI,MAAM,CAOxC;AAED,oDAAoD;AACpD,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,MAAM,CAAC,CA8CjB;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,EAClD,QAAQ,CAAC,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GACrE,OAAO,CAAC,MAAM,CAAC,CAUjB"}
|