【问题标题】:Watson Speech to Text: Response Message too Long - cut offWatson Speech to Text:响应消息太长 - 被切断
【发布时间】:2018-07-21 22:13:27
【问题描述】:

我有一个功能齐全的 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,

看来我要求的信息太多了。从ClientWebSocket.ReceiveAsync() 返回的System.Net.WebSockets.WebSocketReceiveResult 对象有一个属性result.Count,描述了发送的信息字节数。在调试中我发现result.Count = 1024.

我的问题是:

1 - 1kB 限制是由 Watson 强加的,还是 .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 是要反序列化的本地类型。

【问题讨论】:

  • 没用过.NET,但是用过Python和Node.js SDKs和WebSockets,已经成功接收到超过1024字节的数据。所以我猜你正在达到其他限制。可能是应用于您的网络流量的防火墙/代理限制
  • Websockets 接口的 Watson STT 限制为 100MB

标签: c# websocket speech-to-text ibm-watson system.net.websockets


【解决方案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();
}

【讨论】:

    猜你喜欢
    • 2015-11-28
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多