2017-10-09 5 views
0

Je tente de créer un fichier WAV à partir de données binaires à l'aide de la connexion websocket sur un serveur node.js. J'utilise le BluemixTTS pour créer le discours. Voici mon code actuel:TTS avec un socket Web: Création d'un WAV à partir de données binaires échouées

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

} 

Je reçois le jeton, déclenchez le TTS spécifiant audio/wav, construire mon tampon dans la méthode onMessage puis écrire dans un fichier .wav. Tout semble bien.

Toutefois, le fichier est en quelque sorte cassé et ne peut pas être ouvert avec un lecteur de musique. Est-ce que je manque un encodage spécial?

Toute aide est appréciée Cordialement, RambaZamba

Répondre

0

Comme les données contiennent un tampon on doit écrire le tampon dans le fichier directement chaque fois que vous obtenez un message, puis fermez le flux de fichiers en cas onClose. Comme ceci:

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

}