node.jsstreamwavamazon-pollynode.js-fs

0xc00d36c4 while saving file to wav format nodejs amazon polly text to speech


I am using Amazon polly for text to speech.

Here is the code

static async _ttsUsingPolly(text, gender, destPath, speed) {
    let params = {
        'Text': 'Hi, my name is @anaptfox.',
        'OutputFormat': 'pcm',
        'VoiceId': 'Kimberly',
        SampleRate: "8000"
    }
    const data = await this.Polly.synthesizeSpeech(params).promise();

    if (data.AudioStream instanceof Buffer) {
        console.log("buffer", data);
        // Initiate the source
        const bufferStream = new Stream.PassThrough();
        // convert AudioStream into a readable stream
        bufferStream.end(data.AudioStream);
        // Pipe into Player
        bufferStream.pipe(fs.createWriteStream(destPath));
    }
}

this saves the file to .wav format. destPath is public\audio\abc\1212_1660649369899.wav.

But when i play this file it says

This file isn’t playable. That might be because the file type is unsupported, the file extension is incorrect, or the file is corrupt.

0xc00d36c4

what is the issue (if someone can explain)? and how can i fix this?

Update1

actually this generates the pcm format file, so i tried wav converter

var pcmData = fs.readFileSync(path.join(__dirname, './audios/audio_wav', fileName))
        var wavData = wavConverter.encodeWav(pcmData, {
            numChannels: 1,
            sampleRate: 8000,
            byteRate: 16
        })

        fs.writeFileSync(path.resolve(__dirname, './audios/audio_wav', './16k.wav'), wavData)

pcm generated file is of almost 67KB but converted wav file is of 1KB.

if i change pcm to mp3 in polly params it works.

Any help?


Solution

  • I directly passed the stream to wav-converter

    ._convertPcmToWav(data.AudioStream, fileName);
    

    and

    static _convertPcmToWav(stream, fileName) {
            const wavData = wavConverter.encodeWav(stream, {
                numChannels: 1,
                sampleRate: 8000,
                byteRate: 2
            });
            const wavFileName = path.parse(fileName).name;
            fs.writeFileSync(path.resolve(__dirname, './audios/audio_wav', `./${wavFileName}.wav`), wavData)
        }
    

    now the file is generated correctly and playable.