2016-02-25 113 views
3

我嘗試使用ws包通過websocket使用基本的語音到文本服務。但是,在成功打開連接併發送初始消息後,我永遠不會獲得listening狀態。 我也嘗試發送音頻和空的二進制文件(表示上傳過程已完成),但服務器始終返回close,代碼爲1000IBM Watson語音到文本Websocket結束(帶代碼1000)沒有結果

以下是我的代碼

'use strict'; 

var fs = require('fs'); 
var request = require('request'); 
var WS = require('ws'); 

var wsURI = 'wss://stream.watsonplatform.net/speech-to-text/api/v1/recognize?watson-token=[TOKEN]&model=en-UK_NarrowbandModell&x-watson-learning-opt-out=1'; 
var getTokenForm = { 
    method: 'GET', 
    uri: 'https://[USER_ID]:[PASSWORD]@stream.watsonplatform.net/authorization/api/v1/token?url=https://stream.watsonplatform.net/speech-to-text/api', 
}; 
var filepath = 'C:/Temp/test1.wav'; 

request(getTokenForm, function(error, response, body) { 
    wsURI = wsURI.replace('[TOKEN]', body); 
    var message = { 
    'action': 'start', 
    'content-type': 'audio/wav', 
    'continuous': true, 
    'inactivity_timeout': -1 
    }; 
    var ws = new WS(wsURI); 

    ['message', 'error', 'close', 'open', 'connection'].forEach(function(eventName) { 
    ws.on(eventName, console.log.bind(console, eventName + ' event: ')); 
    }); 

    ws.on('open', function(evt) { 
    ws.send(JSON.stringify(message)); 
    setTimeout(function timeout() { 
     var readStream = fs.createReadStream(filepath); 
     readStream.on('data', function(data) { 
     ws.send(data, { 
      binary: true, 
      mask: false, 
     }); 
     }); 

     readStream.on('end', function() { 
     ws.send(new Buffer(0), { 
      binary: true, 
      mask: false, 
     }); 
     }); 
    }, 1000); 
    }); 

    ws.on('close', function(data) { 
    console.log(data) 
    }); 
}); 

還嘗試將文件直接發送(不流)。

var sound = fs.readFileSync(filepath); 
ws.send(sound, { binary: true, mask: false}); 

,並嘗試添加自定義標題Authorization

var authorization = 'Basic ' + new Buffer('USER_ID:PASSWORD').toString('base64'); 
var ws = new WS(wsURI, { 
    headers: { 
     'Authorization': authorization, 
    } 
}); 

但到目前爲止沒有運氣。

+1

我可以用[代碼示例節點sdk](https://github.com/watson-developer-cloud/node-sdk/blob/dev/examples/speech_to_text.v1.js),但我希望看到它的工作沒有官方的SDK。 – ucin

+1

畢竟有SDK的原因 –

+0

如果你想在瀏覽器中使用語音到文本,還有另一個SDK。 https://github.com/watson-developer-cloud/speech-javascript-sdk –

回答

1

這裏有幾件事。主要問題是querystring中的模型有一個錯字 - 最後只能有一個'l'。 (雖然沒有回覆錯誤消息是我要報告給該團隊的服務中的一個錯誤。)

所以,解決這個問題,你會得到一個框架應該被屏蔽的錯誤。這是一個簡單的解決方法,只需在兩個地方切換mask: falsetrue

然後,一旦你完成發送你的音頻&結束消息,該服務將發送你的最終結果,然後發送另一個{"state": "listening"}消息。第二個state: listening應該是您關閉連接的觸發器。否則最終會自動超時並關閉(inactivity_timeout適用於發送沒有語音的音頻,而不是當您根本沒有發送任何數據時。)

+0

更新:團隊意識到無效型號名稱的問題,目前正在進行解決。 –

相關問題