#!/usr/bin/env node /** * 识别流水线端到端回归评测(零 npm 依赖,需先启动 server.js) * 用 macOS `say` 合成语音 → ffmpeg 转 webm → POST /stt?a=&b= → 用 index.html 里的真实判分函数打分 * * 用法: * node eval.js # 45 题 × (完整口诀 / 只说得数 / 错误答案) 全量 * QUICK=1 node eval.js # 抽样跑(约 1/5) * VOICES="Tingting,Shelley (中文(中国大陆))" node eval.js # 多音色 * (注意:Shelley/Flo 等同名有英/中两版,必须用带「(中文(中国大陆))」的全名, * 否则 `say` 会选英文版,念中文出垃圾音频,被 grammar 强扭成错误定值) * SERVER=http://localhost:8000 node eval.js * * 判定标准: * 正确说法 → 前端决策必须是 correct(retry/wrong 都算失败) * 错误说法 → 前端决策必须不是 correct(retry/wrong 都算通过,防“把答错扶正”) */ const fs = require('fs'); const os = require('os'); const path = require('path'); const vm = require('vm'); const { spawnSync } = require('child_process'); const SERVER = process.env.SERVER || 'http://localhost:8000'; const VOICES = (process.env.VOICES || 'Tingting').split(',').map(s => s.trim()).filter(Boolean); const QUICK = !!process.env.QUICK; // ---- 从 index.html 抠出纯函数(CONFIG/口诀数据/解析/判分),在 vm 里执行 ---- const html = fs.readFileSync(path.join(__dirname, 'index.html'), 'utf8'); const script = html.match(/