// 一次性探针:本地直连 DashScope 复现 TTS 合成,定位“合成中”卡住/失败的真实原因 // 用法:node dev_test_scripts/debug/debug_tts_live_probe.js const fs = require('fs') const path = require('path') // 与 src/server/index.js 一致的 creds 加载(只读 key 名不含值打印) const userProfile = process.env.USERPROFILE || process.env.HOME || require('os').homedir() const credsPath = path.join(userProfile, 'Toolbox_local_creds.env.local') if (fs.existsSync(credsPath)) { fs.readFileSync(credsPath, 'utf-8').split(/\r?\n/).forEach(line => { const trimmed = line.trim() if (!trimmed || trimmed.startsWith('#')) return const idx = trimmed.indexOf('=') if (idx <= 0) return const key = trimmed.slice(0, idx).trim() const val = trimmed.slice(idx + 1).trim() if (key && !Object.prototype.hasOwnProperty.call(process.env, key)) process.env[key] = val }) } console.log('[probe] DASHSCOPE_API_KEY 已加载:', !!process.env.DASHSCOPE_API_KEY, process.env.DASHSCOPE_API_KEY ? '(len=' + process.env.DASHSCOPE_API_KEY.length + ')' : '') const tts = require('../../src/server/mp_rep_clock/tts.js') const text = process.argv[2] || '下一组' const voice = process.argv[3] || 'female_01' const timer = setTimeout(() => { console.log('[probe] 超时 60s 强制退出'); process.exit(2) }, 60000) ;(async () => { const t0 = Date.now() const r = await tts.synthesize(text, voice) console.log('[probe] synthesize(', JSON.stringify(text), ',', voice, ') 结果=', JSON.stringify(r), '耗时', Date.now() - t0, 'ms') if (r && r.url) { const abs = path.join(process.cwd(), String(r.url).replace(/^\/+/, '').replace(/\//g, path.sep)) if (fs.existsSync(abs)) console.log('[probe] 文件存在:', abs, fs.statSync(abs).size, 'bytes') } clearTimeout(timer) process.exit(r && r.ok ? 0 : 1) })().catch(e => { console.error('[probe] 异常:', e); clearTimeout(timer); process.exit(1) })