[英]Watson Speech to Text: Response Message too Long - cut off
我有IBM Watson Speech To Text的全功能客戶端。 我想開始記錄更多的元數據(詞的置信度,開始/結束時間等),因此我在初始請求中添加了適當的字段。
一切工作順利,直到遇到將Watson文本消息響應反序列化為JSON對象的異常。 當我打印字符串時,這就是結果。 請注意,它已被切斷,這說明了反序列化錯誤:
{
"results": [
{
"word_alternatives": [
{
"start_time": 3.71,
"alternatives": [
{
"confidence": 1.0,
"word": "Hey"
}
],
"end_time": 3.97
},
{
"start_time": 3.97,
"alternatives": [
{
"confidence": 1.0,
"word": "what's"
}
],
"end_time": 4.54
},
{
"start_time": 4.54,
"alternatives": [
{
"confidence": 1.0,
看來我要求的信息太多。 所述System.Net.WebSockets.WebSocketReceiveResult
從返回的對象ClientWebSocket.ReceiveAsync()
具有屬性result.Count
描述發送的信息的字節數。 在調試中,我發現了result.Count = 1024.
我的問題是:
1-Watson施加了1kB限制還是.NET WebSocket庫的限制?
2-如何解除該限制以接收完整消息?
編輯:最小示例
有很多代碼可以解決這個問題,但是希望可以提供足夠的上下文來幫助您:
// Set up connection
ClientWebSocket socket = new ClientWebSocket();
// Works:
//string headerInfo = "{ \"content-type\":\"audio/l16;rate=8000\",\"interim_results\":true,\"smart_formatting\":true,\"timestamps\":false,\"inactivity_timeout\":-1,\"word_confidence\":false,\"profanity_filter\":false,\"action\":\"start\"}";
// Doesn't:
string headerInfo = "{ \"content-type\":\"audio/l16;rate=8000\",\"interim_results\":true,\"smart_formatting\":true,\"timestamps\":true,\"inactivity_timeout\":-1,\"word_confidence\":true,\"profanity_filter\":false,\"action\":\"start\"}";
var startMsg = new ArraySegment<byte>(Encoding.UTF8.GetBytes(headerInfo));
var endOfMsg = true;
await socket.SendAsync(startMsg, WebSocketMessageType.Text, endOfMsg, default(CancellationToken));
// Send Audio bytes
// Receive response
var msgBuffer = new byte[8 * 1024];
var receiver = new ArraySegment<byte>(msgBuffer);
var result = await socket.ReceiveAsync(receiver, CancellationToken.None);
var message = Encoding.UTF8.GetString(receiver.Array.Take(result.Count).ToArray());
var result = JsonConvert.DeserializeObject<ResultsObject>(watsonMsg);
ResultsObject
是要反序列化為的本地類型。
原來,一條消息正在分幾塊發送。 解決方法是此修復程序:
var ResultMsg = new List<byte>();
if (receiver.Array.Length > 0)
{
ResultMsg.AddRange(receiver.Array.Take(result.Count));
}
if (result.EndOfMessage)
{
var msgBytes = ResultMsg.ToArray();
var message = Encoding.UTF8.GetString(msgBytes);
TextMessageHandler(message);
ResultMsg.Clear();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.