Node.js 带websocket的TTS:从二进制数据创建WAV失败

Node.js 带websocket的TTS:从二进制数据创建WAV失败,node.js,ibm-cloud,ibm-watson,Node.js,Ibm Cloud,Ibm Watson,我尝试使用node.js服务器上的websocket连接从二进制数据创建WAV。我使用bluemixts创建演讲。这是我目前的代码: 'use strict'; const WebSocket = require('ws'); var express = require('express'); var watson = require('watson-developer-cloud'); var vcapServices = require('vcap_services'); var exten

我尝试使用node.js服务器上的websocket连接从二进制数据创建WAV。我使用bluemixts创建演讲。这是我目前的代码:

'use strict';
const WebSocket = require('ws');
var express = require('express');
var watson = require('watson-developer-cloud');
var vcapServices = require('vcap_services');
var extend = (extend = require('util')._extend);
var fs = require('fs');


var ttsConfig = extend(
    {
        version: 'v1',
        url: 'https://stream.watsonplatform.net/text-to-speech/api',
        username: 'myusernamehere',
        password: "mypasswordhere"
    },
    vcapServices.getCredentials('text_to_speech')
);

var ttsAuthService = watson.authorization(ttsConfig);


var  websocket;
ttsAuthService.getToken({ url: ttsConfig.url }, function(err, token) {
    if (err) {
        console.log('Error retrieving token: ', err);

        return;
    }

    var voice = 'en-US_AllisonVoice';
    var wsURI = 'wss://stream.watsonplatform.net/text-to-speech/api/v1/synthesize?voice=' +
        voice + '&watson-token=' + token;


    websocket = new WebSocket(wsURI);
    websocket.onopen = function(evt) { onOpen(evt) };
    websocket.onclose = function(evt) { onClose(evt) };
    websocket.onmessage = function(evt) { onMessage(evt) };
    websocket.onerror = function(evt) { onError(evt) };

});

function onOpen(evt) {

    var message = {
        text: 'Hello world',
        accept: 'audio/wav',
        timings: ['words']
    };
    websocket.send(JSON.stringify(message));
}
var messages;
var audioStream = null;

function onMessage(evt) {
    if (typeof evt.data === 'string') {
        messages += evt.data;
    } else {

        if(audioStream == null){
            audioStream = evt.data;
        }else{
            audioStream += evt.data;
        }
    }

}

function onClose(evt) {

    console.log(messages);
    var wstream = fs.createWriteStream('test.wav');
    wstream.write((audioStream));
    wstream.end();

}

function  onError(evt) {

}
我获取令牌,触发指定audio/wav的TTS,在onMessage方法中构建缓冲区,然后将其写入.wav文件。一切似乎都很好

但是,该文件不知何故已损坏,无法使用任何音乐播放器打开。我会错过一些特殊的编码吗

谢谢你的帮助 当做
Rambazamba

由于数据包含缓冲区,因此每次收到消息时,必须直接在文件中写入缓冲区,然后在onClose事件中关闭文件流。像这样:

var messages;
var wstream = fs.createWriteStream('test.wav');
function onMessage(evt) {
    if (typeof evt.data === 'string') {
        messages += evt.data;
    } else {
        wstream.write(evt.data)
    }

}

function onClose(evt) {
    console.log(messages);
    wstream.end();
}

function  onError(evt) {

}

由于数据包含一个缓冲区,因此每次收到消息时必须直接将缓冲区写入文件,然后在onClose事件中关闭文件流。像这样:

var messages;
var wstream = fs.createWriteStream('test.wav');
function onMessage(evt) {
    if (typeof evt.data === 'string') {
        messages += evt.data;
    } else {
        wstream.write(evt.data)
    }

}

function onClose(evt) {
    console.log(messages);
    wstream.end();
}

function  onError(evt) {

}

我按照你的建议做了尝试,等了几分钟也没有收到过关闭事件回复。我按照你的建议做了尝试,等了几分钟也没有收到关闭事件回复