簡體   English   中英

沃森語音對文本:響應消息太長-中斷

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM