IBM Cloud Docs
临时结果和低延迟

临时结果和低延迟

通过 WebSocket 接口,IBM Watson® Speech to Text 服务支持中间结果,这是在最终结果之前得出的中间转录假设。 对于 WebSocket 和 HTTP 接口,大多数新一代车型还提供低延迟,以更快的速度返回结果,尽管转录的准确性可能会降低。

使用具有 WebSocket 接口的支持低延迟的下一代模型时,必须同时启用临时结果和低延迟以获取临时结果。 只有支持低延迟的下一代模型才能返回临时结果。 请注意,在某些情况下,上一代和下一代模型返回的结果略有不同。

中间结果

中间结果功能仅可用于 WebSocket 接口。 该参数不可用于大型语音模型。

中期结果是指在服务部门给出最终结果之前可能发生改变的中间转录假设。 服务一生成中间结果就会将其返回。 临时结果对于交互式应用程序和实时转录很有用,对于需要一段时间才能转录的长音频流也很有用。

随着服务对话语的处理进展,临时结果也会不断变化。 它们比最终结果更频繁、更迅速地到来。 您可以使用它们来提高应用程序响应速度或评估转录进度。 话语处理完成后,服务将发送表示该话语的音频的最佳转录的最终结果。

  • 临时结果 在包含字段 "final": false 的抄本中标识。 该服务可以在处理更多音频时,以更准确的转录更新临时结果。 服务针对每个最终结果交付一个或多个临时结果。
  • 最终结果 由字段 "final": true 标识。 服务不会对最终结果做进一步更新。

您请求临时结果的方式取决于您正在使用的模型类型:

  • 对于先前生成的模型, 在 JSON start 消息中将 interim_results 参数设置为 true。 临时结果可用于所有先前生成的模型。
  • 对于下一代模型, 在 JSON start 消息中将 interim_resultslow_latency 参数设置为 true。 临时结果仅适用于支持低延迟的下一代模型,并且仅当启用了临时结果和低延迟时才可用。 有关更多信息,请参阅 请求临时结果和低等待时间

要禁用任何模型的中间结果,请省略 interim_results 参数或将其设置为 false。 如果您正在执行脱机或批处理转录,请禁用临时结果。

中间结果示例

以下缩写的 WebSocket 示例请求临时结果。 服务发送多个响应对象。 它仅针对最终结果将 final 属性设置为 true。 该请求隐式使用缺省 previous-generation en-US_BroadbandModel

var access_token = {access_token};
var wsURI = '{ws_url}/v1/recognize'
  + '?access_token=' + access_token;
var websocket = new WebSocket(wsURI);

websocket.onopen = function(evt) { onOpen(evt) };
function onOpen(evt) {
  var message = {
    action: 'start',
    content-type: 'audio/l16;rate=22050',
    interim_results: true
  };
  websocket.send(JSON.stringify(message));
  websocket.send(blob);
}

websocket.onmessage = function(evt) { onMessage(evt) };
function onMessage(evt) {
  console.log(evt.data);
}

响应包含一个没有暂停的发声。

{
  "result_index": 0,
  "results": [
    {
      "alternatives": [
        {
          "transcript": "several to "
        }
      ],
      "final": false
    }
  ]
}{
  "result_index": 0,
  "results": [
    {
      "alternatives": [
        {
          "transcript": "several tornadoes "
        }
      ],
      "final": false
    }
  ]
}{
  "result_index": 0,
  "results": [
    {
      "alternatives": [
        {
          "transcript": "several tornadoes swept through "
        }
      ],
      "final": false
    }
  ]
}{
  . . .
}{
  "result_index": 0,
  "results": [
    {
      "alternatives": [
        {
          "confidence": 0.96,
          "transcript": "several tornadoes swept through Colorado on Sunday "
        }
      ],
      "final": true
    }
  ]
}

低延迟

low_latency 参数可用于大多数下一代模型。 此参数不可用于大型语音模型和前代模型。

下一代多媒体和电话模型的响应时间通常比上一代模型更快。 但在某些情况下,您可能希望更快地收到结果。 通过支持低延迟的下一代模型,您可以将 low_latency 参数设置为 true 以更快地接收结果。 有关支持低延迟的下一代模型的更多信息,请参阅 支持的下一代语言模型

通过低延迟,该服务可实现更快的结果,并可能牺牲转录准确性。 启用低延迟时,服务会将音频分段为较小的块,以优化速度以提高准确性。 如果您的应用程序需要的响应时间超过其尽可能高的准确性,那么此权衡可能是可以接受的。 例如,对于用例 (例如,IBM® watsonx™ Assistant 服务的语音通道中的已关闭字幕,会话式应用程序和实时客户服务),低延迟是理想选择。

省略 low_latency 参数可生成更准确的结果,是大多数用例的建议方法。 缺省情况下,low_latency 参数为 false

对包含低等待时间的请求的响应的性质取决于所使用的接口:

  • 通过 HTTP 接口,服务在发送响应之前会等待所有音频到达。 然后,它将发送单个字节流作为响应。 响应可以包含多个具有多个最终结果的转录元素,并且可以递增发送。 但它是一个单一的数据流。
  • 通过 WebSocket 接口,服务将在最终结果可用时发送这些结果。 它可以以不同字节流的形式发送多个独立响应。 连接是双向和全双工的,只要保持活动状态,请求和响应就可以在单个连接上继续来回流动。

低延迟限制

低延迟功能具有以下使用限制:

  • 低等待时间仅可用于某些下一代模型。 对于不支持低延迟的下一代模型,如果在请求中包含 low_latency 参数,那么服务将失败,状态码为 400:

    {
      "code": 400,
      "code_description": "Bad Request",
      "error": "low_latency is not a supported feature for model {model_id}"
    }
    
  • 低等待时间 不可 用于先前生成的模型。 对于先前生成的模型,如果在请求中包含 low_latency 参数,那么服务会生成警告:

    "warnings": [
      "Unknown arguments: low_latency."
    ]
    

低延迟示例

以下同步 HTTP 示例请求 en-US_Telephony 模型的低延迟。 此示例将 low_latency 查询参数设置为 true

IBM Cloud

curl -X POST -u "apikey:{apikey}" \
--header "Content-Type: audio/wav" \
--data-binary @{path}audio-file.wav \
"{url}/v1/recognize?model=en-US_Telephony&low_latency=true"

IBM Cloud Pak for Data IBM Software Hub

curl -X POST \
--header "Authorization: Bearer {token}" \
--header "Content-Type: audio/wav" \
--data-binary @{path}audio-file.wav \
"{url}/v1/recognize?model=en-US_Telephony&low_latency=true"

请求临时结果和低延迟

要使用下一代模型接收临时结果,该模型必须支持低延迟,并且必须将 interim_resultslow_latency 参数都设置为 true。 对于不支持低延迟的下一代模型,该服务不支持临时结果。

使用支持低延迟的下一代模型时,可以使用 WebSocket 接口请求临时结果和低延迟。 但是,interim_results 参数在与下一代模型配合使用时的行为有所不同。

下表描述了 interim_resultslow_latency 参数之间的交互以及根据其设置接收到的结果。 interim_resultslow_latency 参数的缺省值都是 false

临时结果和低延迟参数的交互作用
interim_results low_latency 结果
interim_results=false low_latency=false 服务仅发送最终结果。 它返回单个 JSON 对象,其中包含转录完成时所有话语的结果。 请参阅 示例 1: 临时结果和低等待时间均为 false
interim_results=false low_latency=true 服务仅发送最终结果。 它返回单个 JSON 对象,其中包含转录完成时所有话语的结果。 但是,由于 low_latencytrue,因此服务会更快地返回最终结果。 请参阅 示例 2: 临时结果为 false,低等待时间为 true
interim_results=true low_latency=false 服务仅发送最终结果。 它在执行转录时针对个别话语返回多个 JSON 对象。 将 interim_results 设置为 true 的优点是话语在完成时到达。 您不需要等待转录所有话语。 请参阅 示例 3: 临时结果为 true,低等待时间为 false
interim_results=true low_latency=true 该服务在开发转录假设时返回临时结果,并在发声完成时发送最终结果。 服务针对每个最终结果交付一个或多个临时结果。 临时结果的质量与您使用上一代模型获得的结果相同。 但是,由于 low_latencytrue,因此服务会更快地返回临时结果和最终结果。 请参阅 示例 4: 临时结果和低等待时间均为 true

临时结果和低延迟示例

以下缩写的 WebSocket 代码显示了如何使用 WebSocket 接口请求临时结果和/或低延迟结果。 它规定了以下参数:

  • /v1/recognize 请求的 model 查询参数传递下一代 en-US_Telephony 模型,这支持低延迟。
  • JSON start 消息的 inactivity_timeout 参数将不活动超时设置为 -1 (无穷大),这将阻止请求超时。
  • interim_resultslow_latency 参数都与请求的 JSON start 消息一起指定。

要显示具有所有可能的参数组合的结果示例,请在以下部分中的示例中将 interim_resultslow_latency 的自变量设置为 truefalse

var access_token = {access_token};
var wsURI = '{ws_url}/v1/recognize'
  + '?access_token=' + access_token
  + '&model=en-US_Telephony';
var websocket = new WebSocket(wsURI);

websocket.onopen = function(evt) { onOpen(evt) };
function onOpen(evt) {
  var message = {
    action: 'start',
    content-type: 'audio/wav',
    inactivity_timeout: -1,
    interim_results: {true | false},
    low_latency: {true | false}
  };
  websocket.send(JSON.stringify(message));
  websocket.send(blob);
}

websocket.onmessage = function(evt) { onMessage(evt) };
function onMessage(evt) {
  console.log(evt.data);
}

传递到服务的 WAV 文件包含单个句子,其中包含两个嵌入式多秒暂停:“雷暴可能产生 ...pause... large hail...pause... 和大雨。” 暂停时间足够长,可以表示单独的话语,从而生成多个最终结果。 由于每个响应都包含多个最终结果 (每个发声一个),因此您必须将最终结果组合成单个字符串以查看完整的文字记录。

示例 1: 临时结果和低等待时间均为 false

此示例将 interim_resultslow_latency 都设置为 false。 服务仅将最终结果作为单个 JSON 对象返回。

  var message = {
    action: 'start',
    content-type: 'audio/wav',
    inactivity_timeout: -1,
    interim_results: false,
    low_latency: false
  };
{
  "result_index": 0,
  "results": [
    {
      "final": true,
      "alternatives": [
        {
          "transcript": "thunderstorms could produce ",
          "confidence": 0.94
        }
      ]
    },
    {
      "final": true,
      "alternatives": [
        {
          "transcript": "large hail ",
          "confidence": 0.91
        }
      ]
    },
    {
      "final": true,
      "alternatives": [
        {
          "transcript": "and heavy rain ",
          "confidence": 0.86
        }
      ]
    }
  ]
}

示例 2: 临时结果为 false,低等待时间为 true

此示例将 interim_results 设置为 false,将 low_latency 设置为 true。 服务仅将最终结果作为单个 JSON 对象返回。

  var message = {
    action: 'start',
    content-type: 'audio/wav',
    inactivity_timeout: -1,
    interim_results: false,
    low_latency: true
  };
{
  "result_index": 0,
  "results": [
    {
      "final": true,
      "alternatives": [
        {
          "transcript": "thunderstorms could produce ",
          "confidence": 0.94
        }
      ]
    },
    {
      "final": true,
      "alternatives": [
        {
          "transcript": "large hail ",
          "confidence": 0.91
        }
      ]
    },
    {
      "final": true,
      "alternatives": [
        {
          "transcript": "and heavy rain ",
          "confidence": 0.86
        }
      ]
    }
  ]
}

示例 3: 临时结果为 true,低等待时间为 false

此示例将 interim_results 设置为 true,将 low_latency 设置为 false。 该服务仅返回最终结果,但它会将每个结果作为单独的 JSON 对象返回。

  var message = {
    action: 'start',
    content-type: 'audio/wav',
    inactivity_timeout: -1,
    interim_results: true,
    low_latency: false
  };
{
  "result_index": 0,
  "results": [
    {
      "final": true,
      "alternatives": [
        {
          "transcript": "thunderstorms could produce ",
          "confidence": 0.94
        }
      ]
    }
  ]
}{
  "result_index": 1,
  "results": [
    {
      "final": true,
      "alternatives": [
        {
          "transcript": "large hail ",
          "confidence": 0.91
        }
      ]
    }
  ]
}{
  "result_index": 2,
  "results": [
    {
      "final": true,
      "alternatives": [
        {
          "transcript": "and heavy rain ",
          "confidence": 0.86
        }
      ]
    }
  ]
}

示例 4: 临时结果和低等待时间均为 true

此示例将 interim_resultslow_latency 都设置为 true。 此服务将返回临时结果和最终结果,并将每个结果作为单独的 JSON 对象返回。

  var message = {
    action: 'start',
    content-type: 'audio/wav',
    inactivity_timeout: -1,
    interim_results: true,
    low_latency: true
  };
{
  "result_index": 0,
  "results": [
    {
      "final": false,
      "alternatives": [
        {
          "transcript": "th "
        }
      ]
    }
  ]
}{
  "result_index": 0,
  "results": [
    {
      "final": false,
      "alternatives": [
        {
          "transcript": "thunderstorms "
        }
      ]
    }
  ]
}{
  "result_index": 0,
  "results": [
    {
      "final": false,
      "alternatives": [
        {
          "transcript": "thunderstorms could produc "
        }
      ]
    }
  ]
}{
  "result_index": 0,
  "results": [
    {
      "final": true,
      "alternatives": [
        {
          "transcript": "thunderstorms could produce ",
          "confidence": 0.94
        }
      ]
    }
  ]
}{
  "result_index": 1,
  "results": [
    {
      "final": false,
      "alternatives": [
        {
          "transcript": "large "
        }
      ]
    }
  ]
}{
  "result_index": 1,
  "results": [
    {
      "final": true,
      "alternatives": [
        {
          "transcript": "large hail ",
          "confidence": 0.91
        }
      ]
    }
  ]
}{
  "result_index": 2,
  "results": [
    {
      "final": false,
      "alternatives": [
        {
          "transcript": "and hea "
        }
      ]
    }
  ]
}{
  "result_index": 2,
  "results": [
    {
      "final": true,
      "alternatives": [
        {
          "transcript": "and heavy rain ",
          "confidence": 0.86
        }
      ]
    }
  ]
}