Node.js中调用@speechify/api-sdk的speechify.audioGenerate()接口时遭遇400 Bad Request错误
Node.js中调用@speechify/api-sdk的speechify.audioGenerate()接口时遭遇400 Bad Request错误
我看到你在调用Speechify的audioGenerate接口时遇到了400 Bad Request错误,结合你的代码和报错信息,咱们来一步步排查并解决问题:
1. 核心问题:硬编码的Voice ID与可用列表不匹配
你的代码里有一个明显的矛盾点:虽然你通过pickVoice函数获取了当前可用的Voice ID(比如报错里的oliver),但在实际调用audioGenerate时,却硬编码写死了voiceId: "george",而不是使用动态获取到的voiceId变量。
这大概率是触发400错误的原因:如果你的API密钥没有权限使用george这个声音,或者该声音ID不在当前可用的声音列表中,Speechify的API就会返回Bad Request。
修复代码
把audioGenerate的参数改成使用动态获取的voiceId变量:
// 原错误代码 // const response = await speechify.audioGenerate({ // input: textContent, // voiceId: "george", // audioFormat: "mp3", // }); // 修复后的代码 const response = await speechify.audioGenerate({ input: textContent, voiceId: voiceId, // 使用前面获取到的可用Voice ID audioFormat: "mp3", });
2. 验证可用Voice ID的有效性
为了避免后续再踩类似的坑,建议你在pickVoice函数中打印出所有可用的声音信息,确认哪些Voice ID是当前API密钥可以访问的:
async function pickVoice(speechify) { try { const voices = await speechify.voicesList(); // 打印所有可用声音的名称和ID,方便排查 console.log('=== 可用声音列表 ==='); voices.forEach(v => console.log(`${v.name} (ID: ${v.id})`)); // 返回第一个可用声音,或者 fallback 到你确认有权限的ID return voices[0]?.id || 'oliver'; } catch (err) { throw new Error(`获取声音列表失败: ${err.message}`); } }
3. 其他可能的排查方向
如果修复上述问题后仍然报错,可以检查以下两点:
- 输入文本合法性:确认输入的文本内容没有超出API的长度限制,也不包含特殊格式/编码问题(比如空文本你已经做了检查,但可以再确认下是否有超长段落)。
- API密钥权限:确保你的API密钥是有效的,并且拥有访问Speechify文本转语音服务的权限。可以尝试用该密钥直接调用
voicesList接口,确认能正常返回结果。
内容来源于stack exchange
相关产品推荐
相关产品推荐

