javascript - Node.js错误: write after end - AWS Polly

标签 javascript node.js amazon-web-services text-to-speech amazon-polly

我正在尝试在我的 node.js 应用程序中使用 AWS Polly 进行语音合成。当我第一次运行 speak(text) 函数时,一切正常,但是如果我再次运行它,我会收到此错误:

events.js:160
  throw er; // Unhandled 'error' event
  ^

Error: write after end
at writeAfterEnd (/Users/noahchalifour/Desktop/HomeServer/Jarvis-Node/node_modules/readable-stream/lib/_stream_writable.js:229:12)
at Speaker.Writable.write (/Users/noahchalifour/Desktop/HomeServer/Jarvis-Node/node_modules/readable-stream/lib/_stream_writable.js:269:20)
at PassThrough.ondata (_stream_readable.js:555:20)
at emitOne (events.js:96:13)
at PassThrough.emit (events.js:188:7)
at PassThrough.Readable.read (_stream_readable.js:381:10)
at flow (_stream_readable.js:761:34)
at resume_ (_stream_readable.js:743:3)
at _combinedTickCallback (internal/process/next_tick.js:80:11)
at process._tickDomainCallback (internal/process/next_tick.js:128:9)

这是我尝试运行的代码:

// AWS Polly
// Load the SDK
const AWS = require('aws-sdk')
const Stream = require('stream')
const Speaker = require('speaker')

// Create an Polly client
const Polly = new AWS.Polly({
    signatureVersion: 'v4',
    region: 'us-east-1'
})

// Create the Speaker instance
const Player = new Speaker({
  channels: 1,
  bitDepth: 16,
  sampleRate: 16000
})

function speak(text) {
    let params = {
        'Text': text,
        'OutputFormat': 'pcm',
        'VoiceId': 'Brian'
    }
    Polly.synthesizeSpeech(params, (err, data) => {
        if (err) {
            console.log(err.code)
            console.log('error');
        } else if (data) {
            if (data.AudioStream instanceof Buffer) {
                // Initiate the source
                var bufferStream = new Stream.PassThrough()
                // convert AudioStream into a readable stream
                bufferStream.end(data.AudioStream)
                // Pipe into Player
                bufferStream.pipe(Player)
            }
        }
    })
}

speak("Hello World!")

setTimeout(function() {
    speak("This is so cool!")  // error is here
}, 10000)

编辑

重新排序 .pipe().end() 后,出现新错误:

request.js:31
        throw err;
        ^

Error: write after end
at writeAfterEnd (/Users/noahchalifour/Desktop/HomeServer/Jarvis-
Node/node_modules/readable-stream/lib/_stream_writable.js:229:12)
at Speaker.Writable.write (/Users/noahchalifour/Desktop/HomeServer/Jarvis-Node/node_modules/readable-stream/lib/_stream_writable.js:269:20)
at PassThrough.ondata (_stream_readable.js:555:20)
at emitOne (events.js:96:13)
at PassThrough.emit (events.js:188:7)
at readableAddChunk (_stream_readable.js:176:18)
at PassThrough.Readable.push (_stream_readable.js:134:10)
at PassThrough.Transform.push (_stream_transform.js:128:32)
at afterTransform (_stream_transform.js:77:12)
at TransformState.afterTransform (_stream_transform.js:54:12)

最佳答案

正如前面提到的答案,尝试每次在synthesizeSpeech处理程序中创建Player对象。应该可以解决问题。

更改此行,

// Pipe into Player
bufferStream.pipe(new Speaker({
  channels: 1,
  bitDepth: 16,
  sampleRate: 16000
}))

关于javascript - Node.js错误: write after end - AWS Polly,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43297657/

相关文章:

javascript - 如何在 $http.post 上追加文件?

http - 只有 AWS ELB 支持在堆栈中支持 http/2 是否足够

javascript - D3图上的显示区域

JavaScript 正则表达式捕获和替换

javascript - VSCode 中的多个文件关联用于混合 PHP 和 JS 语法突出显示

node.js - 如何从 Express 服务器传递数据以响应 View ?

javascript - 寻找多级继承中的构造函数

Node.js Express 应用程序在负载测试下花费太多时间来处理出站 HTTP 请求

amazon-web-services - 使用 CloudFormation 创建 Secrets Manager 但保持值不可见

amazon-web-services - lambda :InvokeFunction Not Working with All Resources Set