AWS Polly v3:SynthesizeSpeech‘mp3’,AudioStream Not instanceOf Buffer

ttcibm8c  于 2022-09-21  发布在  iOS
关注(0)|答案(2)|浏览(139)

我正在将AWS Polly代码从v2转换为v3

在使用AWS Polly v3synthesizeSpeech()时,如何将返回的data.AudioStream转换为Buffer的示例?

以下JavaScript代码使用v2运行,返回的audio.AudioStreamBuffer的一个示例:

const { Polly } = require('aws-sdk');

// Create an Polly client
const polly = new Polly({
    signatureVersion: 'v4',
    region: process.env.AWS_DEFAULT_REGION
});

const params = {
    OutputFormat: 'mp3',
    VoiceId: voiceId,
    TextType: 'ssml',
    Text: '<speak><prosody rate="85%">Hello World</prosody></speak>'
};

//***

return await polly
    .synthesizeSpeech(params)
    .promise()
    .then(data => {
         if (data.AudioStream instanceof Buffer) {
             return data.AudioStream
         } else {
             console.error('AudioStream not instanceof Buffer');
             return null;
         }
     })

以下使用v3的JavaScript代码,其来自synthesizeSpeech()的响应包含audio.AudioStream不是Buffer的示例,而是以IncomingMessage开头:

const {
    Polly
} = require("@aws-sdk/client-polly");

// Create an Polly client
const polly = new Polly({
    signatureVersion: 'v4',
    region: process.env.AWS_DEFAULT_REGION
});

//***

const params = {
    OutputFormat: 'mp3',
    VoiceId: voiceId,
    TextType: 'ssml',
    Text: '<speak><prosody rate="85%">Hello World</prosody></speak>'
};

return await polly
    .synthesizeSpeech(params)
    .then(data => {
         if (data.AudioStream instanceof Buffer) {
             return data.AudioStream
         } else {
             console.error('AudioStream not instanceof Buffer');
             return null;
         }
     })

我使用PollyClientSynthesizeSpeechCommand都尝试了以下v3,结果相同

const {
    PollyClient,
    SynthesizeSpeechCommand
} = require("@aws-sdk/client-polly");

const client = new PollyClient({
    region: process.env.AWS_DEFAULT_REGION
});

//***

const command = new SynthesizeSpeechCommand({
    OutputFormat: 'mp3',
    Text:'hello world, this is alex',
    VoiceId: 'Kimberly',
    TextType: 'text'
});

return client
    .send(command)
    .then((data) => {
        if (data.AudioStream instanceof Buffer) {
            return data.AudioStream
        } else {
            console.error('AudioStream not instanceof Buffer');
            console.log('data.AudioStream:', data.AudioStream);
            return null;
        }
    })
    .catch((error) => {
        console.error(error);
    });

v3data.AudioStream的内容如下:

IncomingMessage {
  _readableState:
   ReadableState {
     objectMode: false,
     highWaterMark: 16384,
     buffer: BufferList { head: null, tail: null, length: 0 },
     length: 0,
     pipes: null,
   ***

感谢您的阅读,感谢您的反馈。

j9per5c4

j9per5c41#

现在是一个ReadableStream对象。

import { Readable } from "stream";
    //...
    if (data.AudioStream instanceof Readable) {
      console.log("Readable");
      data.AudioStream.pipe(fs.createWriteStream("fileName.mp3"));
    } else {
      console.log("no Readable");
    }
    //...

您可以在此处找到有关这一变化的详细信息:https://github.com/aws/aws-sdk-js-v3/issues/1096#issuecomment-620900466

xytpbqjk

xytpbqjk2#

就我个人而言,我发现使用异步/等待而不是流回调要容易得多。

import { PollyClient, SynthesizeSpeechCommand, SynthesizeSpeechInput } from "@aws-sdk/client-polly";
import fs from 'fs';

async function go() {
    const client = new PollyClient(yourClientOptions)
    const command = new SynthesizeSpeechCommand(yourCommandOptions)
    try {
        let data = await client.send(command)
        if (!data || !data.AudioStream) throw Error(`bad response`);
        await saveStream(data.AudioStream, "output.mp3")
    }
    catch(err) {
        console.log(err)
    }
}

function saveStream(fromStream, filename) {
    return new Promise((resolve, reject) => {
        let toStream = fs.createWriteStream(filename)
        toStream.on('finish', resolve);
        toStream.on('error', reject);
        fromStream.pipe(toStream)
    })
}

go()

注意:我使用的是node14,因此可以在顶部使用import,但您也可以轻松地使用require

相关问题