Introduce support for external compute worker mode (`COMPUTE_MODE=worker`) using a new `WorkerComputeBackend`. This enables offloading heavy ONNX Whisper alignment and PDF layout parsing to a standalone worker service (Redis + BullMQ), improving scalability and compatibility with serverless/limited environments. - Add `@openreader/compute-core` as a shared package for ONNX inference and PDF parsing logic. - Implement `WorkerComputeBackend` and worker contract/types for remote job execution. - Update compute backend selection logic and remove previous worker mode guards. - Extend `WhisperAlignInput` and `PdfLayoutInput` types to support object keys for remote data access. - Refactor local compute backend to use `@openreader/compute-core` and support both buffer and object key inputs. - Update job runner, TTS segment alignment, and PDF layout parsing flows to use new compute backend APIs. - Add scripts, Docker workflow, and documentation for deploying and running the compute worker. - Update environment variable docs and examples for worker mode, including storage requirements and configuration. - Document published images and stack changes to reflect the new compute worker architecture. BREAKING CHANGE: `COMPUTE_MODE=worker` now requires an external compute worker service and S3-compatible object storage. Embedded SeaweedFS (`weed mini`) is not supported in worker mode. See the new documentation for deployment and configuration details.
21 lines
626 B
TypeScript
21 lines
626 B
TypeScript
export function buildGoertzelCoefficients(freqBins: number, fftSize: number): Float64Array {
|
|
const coeffs = new Float64Array(freqBins);
|
|
for (let k = 0; k < freqBins; k += 1) {
|
|
coeffs[k] = 2 * Math.cos((2 * Math.PI * k) / fftSize);
|
|
}
|
|
return coeffs;
|
|
}
|
|
|
|
export function goertzelPower(samples: Float32Array, coeff: number): number {
|
|
let s1 = 0;
|
|
let s2 = 0;
|
|
for (let i = 0; i < samples.length; i += 1) {
|
|
const s0 = samples[i] + (coeff * s1) - s2;
|
|
s2 = s1;
|
|
s1 = s0;
|
|
}
|
|
|
|
const power = (s1 * s1) + (s2 * s2) - (coeff * s1 * s2);
|
|
if (!Number.isFinite(power) || power < 0) return 0;
|
|
return power;
|
|
}
|