我正在使用 aws polly 进行文本转语音并从中生成 mp3,以获取特定的 wav,因为星号需要具有特定参数的 wav,我正在使用
fluent-ffmpeg
npm 包。
我通过提供目标路径生成文件,并在
sendFile
上使用 response
方法从 api 返回。这是代码
_convertMp3ToWav(mp3Buffer, destPath) {
const { options } = this;
return new Promise((resolve, reject) => {
ffmpeg(mp3Buffer)
.audioFilter(`highpass=f=300, lowpass=f=3400`)
.outputOptions([`-ar 8000`, `-ac 1`]
.output(destPath)
.on('error', (err) => {
log.error(`An error occured: ${err?.message || err?.stack}`);
reject({ err: 'Failed to convert from mp3 to wav' });
})
.on('end', async () => {
log.info(`successfully converted mp3 to wav at ${destPath}`);
resolve({ msg: "voice file generated" });
}).run();
});
}
res.status(200).sendFile(wavFilePath)
文件可以在本地机器上播放,也可以在 asterisk 服务器上运行。
但我试图避免生成中间文件,生成流并使用
res.send(buffer)
返回该流
这是代码
_convertMp3ToWav(mp3Buffer) {
return new Promise((resolve, reject) => {
// create a writable output stream to store wav stream
const outputStream = new Stream.Writable();
const buffer = [];
// redefining _write function to write wav stream
outputStream._write = function (chunk, encoding, done) {
buffer.push(chunk);
done();
};
// convert mp3 buffer to wav buffer
ffmpeg(mp3Buffer)
.audioFilter(`highpass=f=300, lowpass=f=3400`)
.outputOptions([`-ar 8000`, `-ac 1`])
.output(outputStream)
.format('wav')
.on('error', (err) => {
log.error(`An error occured: ${err?.message || err?.stack}`);
reject({ err: 'Failed to convert from mp3 to wav' });
})
.on('end', async () => {
try {
// create wav buffer
const wavBuffer = Buffer.concat(buffer);
log.info(`successfully converted mp3 to wav buffer`);
resolve({ wavBuffer });
}
catch (err) {
log.error(`failed to create wav buffer : ${err?.message || err?.stack}`);
reject({ err: 'Failed to create wav buffer' });
}
}).run();
});
}
const buffer = await this._convertMp3ToWav(bufferStream);
res.send(buffer.wavBuffer);
我也试过使用
// set content type to audio/wav
res.set('Content-Type', 'audio/wav');
文件可以在本地播放,但不能在 asterisk 上播放。
发送或编码有问题吗?
您应该在任何音频编辑器中打开它并查看属性。
星号不接受
任何不是 8khz PCM 单声道的东西
任何压缩或其他不简单的方式