2017-10-09 8 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) { 

} 

私はonMessageメソッドで私のバッファを構築し、オーディオ/ wavファイルを指定するTTSをトリガー、トークンを取得し、.wavファイルに書き込みます。すべてがうまく見えます。

ただし、ファイルが何らかの形で破損しているため、音楽プレーヤーで開くことができません。私は特別なエンコーディングを見逃していますか?

すべてのヘルプは よろしく、 Rambazambaデータが1つのファイルに直接メッセージを取得し、OnCloseのイベントにファイルストリームを閉じるたびにバッファを書き込むことがあるバッファが含まれていたよう

答えて

0

を高く評価しています。このように:

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

} 
関連する問題