を使用して一度に複数のリクエストを実行すると、最後の解決リクエストのPromise.all
のみを取得するようです。audioContent
大きなテキストを合成していて、API の文字制限を使用して分割する必要があります。
以前はこれが機能していたので、機能するはずですが、最近機能しなくなりました。
私は Amazon の Polly でもまったく同じことをしていますが、うまくいきます。これはまったく同じコードですが、クライアントと要求オプションが異なります。
それで、それはおそらく図書館のことだと思いましたか?それともGoogleサービスの問題?
私は最新バージョンを使用しています: https://github.com/googleapis/nodejs-text-to-speech
export const googleSsmlToSpeech = async (
index: number,
ssmlPart: string,
type: SynthesizerType,
identifier: string,
synthesizerOptions: GoogleSynthesizerOptions,
storageUploadPath: string
) => {
let extension = 'mp3';
if (synthesizerOptions.audioConfig.audioEncoding === 'OGG_OPUS') {
extension = 'opus';
}
if (synthesizerOptions.audioConfig.audioEncoding === 'LINEAR16') {
extension = 'wav';
}
synthesizerOptions.input.ssml = ssmlPart;
const tempLocalAudiofilePath = `${appRootPath}/temp/${storageUploadPath}-${index}.${extension}`;
try {
// Make sure the path exists, if not, we create it
await fsExtra.ensureFile(tempLocalAudiofilePath);
// Performs the Text-to-Speech request
const [response] = await client.synthesizeSpeech(synthesizerOptions);
// Write the binary audio content to a local file
await fsExtra.writeFile(tempLocalAudiofilePath, response.audioContent, 'binary');
return tempLocalAudiofilePath;
} catch (err) {
throw err;
}
};
/**
* Synthesizes the SSML parts into seperate audiofiles
*/
export const googleSsmlPartsToSpeech = async (
ssmlParts: string[],
type: SynthesizerType,
identifier: string,
synthesizerOptions: GoogleSynthesizerOptions,
storageUploadPath: string
) => {
const promises: Promise<string>[] = [];
ssmlParts.forEach((ssmlPart: string, index: number) => {
promises.push(googleSsmlToSpeech(index, ssmlPart, type, identifier, synthesizerOptions, storageUploadPath));
});
const tempAudioFiles = await Promise.all(promises);
tempAudioFiles.sort((a: any, b: any) => b - a); // Sort: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 etc...
return tempAudioFiles;
};
上記のコードは、正しい名前とインデックス番号を持つ複数のファイルを作成しますが、それらにはすべて同じオーディオが含まれています。あれは; 最も速く解決した音声応答。
824163ed-b4d9-4830-99da-6e6f985727e2-0.mp3
824163ed-b4d9-4830-99da-6e6f985727e2-1.mp3
824163ed-b4d9-4830-99da-6e6f985727e2-2.mp3
Promise.all
を単純なfor
ループに置き換えると、機能します。ただし、すべてのリクエストが解決されるまで待機するため、これには時間がかかります。Promise.all
以前は機能していたので、機能することはわかっていますが、再び機能することを望んでいます。
const tempAudioFiles = [];
for (var i = 0; i < ssmlParts.length; i++) {
tempAudioFiles[i] = await googleSsmlToSpeech(i, ssmlParts[i], type, identifier, synthesizerOptions, storageUploadPath);
}
私はそれをもう動作させることができないようですPromise.all
.