Watson Speech to Text: ответное сообщение слишком длинное - отрезано

У меня есть полнофункциональный клиент для IBM Watson Speech To Text. Я хотел начать записывать больше метаданных (достоверность слов, время начала / окончания и т. Д.), Поэтому я добавил соответствующие поля в свой первоначальный запрос.

Все работало гладко, пока я не столкнулся с исключением, десериализующим ответ текстового сообщения Уотсона в объект 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 - Ограничение в 1 КБ, наложенное Уотсоном, или это ограничение библиотеки.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 это локальный тип для десериализации.

1 ответ

Оказалось, что сообщение отправлялось несколькими частями. Решение было это исправить:

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();
}
Другие вопросы по тегам