/** * 指纹生成子进程脚本(被 Python 通过 subprocess 调用) * * 协议: * stdin: base64 编码的 16-bit PCM s16le 数据(8kHz 单声道,3秒) * stdout: base64 编码的指纹 FP 字符串 * stderr: 日志/错误 * * 退出码: * 0 成功;1 失败 */ const path = require('path') const { GenerateFP } = require(path.join(__dirname, 'afp.js')) async function main() { const chunks = [] process.stdin.on('data', (c) => chunks.push(c)) process.stdin.on('end', async () => { try { const b64 = Buffer.concat(chunks).toString('utf8').trim() const pcmBytes = Buffer.from(b64, 'base64') // s16le -> Float32Array const samples = pcmBytes.length / 2 const pcm = new Float32Array(samples) const dv = new DataView(pcmBytes.buffer, pcmBytes.byteOffset, pcmBytes.byteLength) for (let i = 0; i < samples; i++) { pcm[i] = dv.getInt16(i * 2, true) / 32768 } const t0 = Date.now() const fp = await GenerateFP(pcm) const t1 = Date.now() process.stderr.write(`[afp-runner] samples=${samples} fp_len=${fp.length} took=${t1 - t0}ms\n`) process.stdout.write(fp) process.exit(0) } catch (e) { process.stderr.write('[afp-runner] ERROR: ' + (e.stack || e.message) + '\n') process.exit(1) } }) process.stdin.on('error', (e) => { process.stderr.write('[afp-runner] stdin error: ' + e.message + '\n') process.exit(1) }) } main()