我目前正在使用 amazon polly 从数据中生成声音文件,但是当我运行我的脚本时,我不断收到错误消息:
ThrottlingException:超出速率。
我目前拥有的
这是我使用的功能
function createAudioFiles(data, outputDir) {
console.log('in createAudioFiles with data: ' , data);
return new Promise((resolve, reject) => {
let successessfullyCompletedAmount = 0;
for ({ audioText, filename } of data) {
createAudio(audioText, filename, outputDir)
.then(({ status, message }) => {
if (status == "success") {
successessfullyCompletedAmount++;
console.log(message);
}
// if all audio files have been created
if (successessfullyCompletedAmount == data.length) {
resolve({
status: 'success',
message: "successfully created audioFiles"
})
}
})
}
});
}
该函数中的 createAudio 函数是:
function createAudio(text, filename, outputDir) {
let params = {
'Text': text,
'OutputFormat': 'mp3',
'VoiceId': 'Amy'
};
return new Promise((resolve, reject) => {
Polly.synthesizeSpeech(params, (err, data) => {
if (err) {
console.log("errors found");
console.log(err);
} else if (data) {
if (data.AudioStream instanceof Buffer) {
fs.writeFile(`${outputDir}/${filename}`, data.AudioStream, function (err) {
if (err) {
return reject({
status: "error",
message: err
})
}
resolve({
status: "success",
message: filename + " saved"
});
})
}
}
});
})
}.
我试过了。
我尝试在循环中添加一个setTimeout()包装器,如下所示:for
setTimeout(function() {
for ({ audioText, filename } of data) {
createAudio(audioText, filename, outputDir)
.then(({ status, message }) => {
if (status == "success") {
successessfullyCompletedAmount++;
console.log(message);
}
// if all audio files have been created
if (successessfullyCompletedAmount == data.length) {
resolve({
status: 'success',
message: "successfully created audioFiles"
})
}
})
}
}, 2000);
但这似乎并没有改变任何东西。我认为正在发生的是所有数据似乎都是一次收集和发送的。
我想要发生的事情。
我想在亚马逊的每个“获取”之间添加一个小延迟以减慢速度。