来自 fluent-ffmpeg 的 wav 文件如果作为流 nodejs 返回则不适用于星号

问题描述 投票:0回答:1

我正在使用 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 上播放。

发送或编码有问题吗?

ffmpeg wav asterisk fluent-ffmpeg nodejs-stream
1个回答
0
投票

您应该在任何音频编辑器中打开它并查看属性。

星号不接受

  1. 任何不是 8khz PCM 单声道的东西

  2. 任何压缩或其他不简单的方式

© www.soinside.com 2019 - 2024. All rights reserved.