check-word-audio-live.mjs 2.0 KB

123456789101112131415161718192021222324
  1. #!/usr/bin/env node
  2. // Explicit, small real-provider smoke test. Never changes production vocabulary.
  3. import {readFileSync,mkdirSync,writeFileSync,existsSync,statSync} from 'node:fs';
  4. import {homedir} from 'node:os';
  5. import {resolve} from 'node:path';
  6. import {createHash,webcrypto} from 'node:crypto';
  7. import vm from 'node:vm';
  8. const file=resolve(process.argv.find(x=>x.startsWith('--file='))?.slice(7)||homedir()+'/.config/xiaoshu/xfyun-word-audio.json');
  9. if(statSync(file).mode&0o077)throw Error('请将配置文件权限设置为600');
  10. const settings=JSON.parse(readFileSync(file,'utf8'));
  11. const ctx=vm.createContext({crypto:webcrypto,WebSocket,TextEncoder,URL,URLSearchParams,Uint8Array,btoa,atob,AbortSignal,setTimeout,clearTimeout,fetch,Parse:{Config:{get:async()=>({get:key=>settings[key]})}},fail:(_code,message)=>{throw Error(message);}});
  12. vm.runInContext(readFileSync(new URL('./cloud/word-audio.js',import.meta.url),'utf8'),ctx);
  13. const config=await ctx.wordAudioConfig();
  14. if(!config.appId||!config.apiKey||!config.apiSecret||!config.voice)throw Error('讯飞配置不完整');
  15. if(!process.argv.includes('--generate')){console.log(JSON.stringify({configured:true,voice:config.voice,generated:false,message:'--generate 生成 apple 样音;--extended 追加四个代表性词句。'}));process.exit(0);}
  16. const output=resolve('tmp/word-audio-qa');mkdirSync(output,{recursive:true});
  17. const words=process.argv.includes('--extended')?['apple','comfortable','read','NASA','Good morning']:['apple'];
  18. for(const word of words){
  19. const key=createHash('sha256').update(JSON.stringify([word,config.voice,config.speed])).digest('hex').slice(0,16),path=output+'/'+key+'.mp3';
  20. let cached=existsSync(path);
  21. if(!cached){const audio=await ctx.wordAudioSynthesize(word,config);writeFileSync(path,Buffer.from(audio,'base64'),{mode:0o600});}
  22. const bytes=readFileSync(path);
  23. console.log(JSON.stringify({word,voice:config.voice,path,bytes:bytes.length,cached,sha256:createHash('sha256').update(bytes).digest('hex')}));
  24. }