2017-10-09 72 views
0

我嘗試使用node.js服務器上的websocket連接從二進制數據創建WAV。我使用BluemixTTS創建語音。這裏是我當前的代碼:帶websocket的TTS:通過二進制數據創建WAV失敗

'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) { 

} 

我得到的令牌,觸發TTS指定音頻/ WAV,建立我的緩衝區onMessage方法,然後將其寫入.wav文件。一切似乎都很好。

但是該文件在某種程度上被破壞,無法用任何音樂播放器打開。我錯過一些特殊的編碼嗎?

任何幫助表示讚賞 問候, Rambazamba

回答

0

由於數據包含一個緩衝區一個人寫的每一個你得到一個消息,然後在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) { 

}