0

我正在嘗試在我的node.js應用程序中使用AWS Polly進行語音合成。當我運行speak(text)功能的第一次,如果我再次運行一切正常,但罰款我得到這個錯誤:node.js錯誤:結束後寫入 - AWS Polly

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) 
+0

的可能的複製[節點流寫入完成之前被管道(http://stackoverflow.com/questions/36948276/node-stream-being-piped-before-寫完成) –

+0

您需要重新排序,第一個管道,然後結束。 –

+0

另一個錯誤,有點不同@NikolayShmyrev –

回答

1

正如前面提到的答案,嘗試每次在synthesizeSpeech處理程序中創建Player對象。它應該解決問題。

改變這一行,

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