IBM Cloud Docs
语音音频解析

语音音频解析

IBM Watson® Speech to Text 服务提供了多个功能,用于确定服务如何解析音频以生成最终转录结果。

  • 句尾静默时间指定了服务将文本拆分为多个最终结果的暂停间隔时间。
  • 在短语末尾分割文本,将文本分割为多个最终结果,用于语义特征,如句子。
  • 字符插入偏差指示服务在开发具有下一代模型的转录假设时,支持长度较短或更大的字符序列。

短语结束静默时间

end_of_phrase_silence_time 参数指定服务用于将文字记录拆分为多个最终结果的停顿时间间隔的持续时间。 如果服务在到达音频流末尾之前检测到停顿或长时间静默,那么其响应可能包含多个最终结果。 静默指示说话者在所说的词或短语之间停顿的点。 对于大多数语言,缺省停顿时间间隔为 0.8 秒;对于中文,缺省时间间隔为 0.6 秒。 有关更多信息,请参阅停顿和静默

通过使用 end_of_phrase_silence_time 参数,可以指定介于 0.0 到 120.0 秒之间的双精度值,以指示不同的停顿时间间隔:

  • 大于 0 的值指定服务将用于语音识别的时间间隔。
  • 值 0 表示服务将使用缺省时间间隔。 值 0 等同于省略此参数。

可以使用此参数在生成最终结果的频率与转录准确性之间达成平衡:

  • 停顿时间间隔越长,生成的最终结果越少,每个结果涵盖的音频段越大。 音频段越大越准确,因为服务有更多上下文可用于转录音频。

    但是,延长停顿时间间隔会直接影响最终结果的等待时间。 在播放完输入音频的最后一个词后,服务必须等待指示的时间间隔到期,然后再返回其响应。 服务等待是为了确保输入音频不会在延长时间间隔到期后继续。 (使用 WebSocket 接口时,设置此参数可能会影响最终结果的等待时间和准确性,而不管您是否请求中间结果。)

  • 停顿时间间隔越短,生成的最终结果越多,但由于每个音频段更小,因此转录准确性可能没那么好。 在等待时间至关重要,并且预期转录准确性不会降级,或者任何降级可接受时,较小的分段是可接受的。

    此外,多短语语法仅在单个最终结果中识别或匹配响应。 如果使用语法来识别多个字符串,那么可以增大停顿时间间隔,以避免收到多个最终结果。

准确性的重要性高于等待时间时,请增大时间间隔。 预期说话者会说较短的短语或单个词的响应时,请减小时间间隔。

对于先前生成的模型, 当话语达到最大 2 分钟时,服务会生成音频的最终结果。 服务会在连续处理两分钟后将抄本拆分为多个最终结果。

短语结束静默时间示例

以下示例请求显示了使用 end_of_phrase_silence_time 参数的影响。 音频读的是短语“one two three four five six”,在词“three”和“four”之间有 1 秒停顿。 例如,说话者可能读的是身份证中的六位数字,停顿是为了确认号码。

第一个示例使用默认的暂停间隔 0.8 秒:

IBM Cloud

curl -X POST -u "apikey:{apikey}" \
--header "Content-Type: audio/wav" \
--data-binary @{path}audio-file.wav \
"{url}/v1/recognize"

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"

由于停顿时间长于缺省时间间隔,因此服务会在停顿处拆分文字记录。 两个结果的 confidence 均为 0.99,因此虽然有停顿,但转录准确性仍非常好。

{
  "result_index": 0,
  "results": [
    {
      "alternatives": [
        {
          "confidence": 0.99,
          "transcript": "one two three "
        }
      ],
      "final": true
    },
    {
      "alternatives": [
        {
          "confidence": 0.99,
          "transcript": "four five six "
        }
      ],
      "final": true
    }
  ]
}

但是,假定执行语音识别时使用的语法期望用户在单个短语响应中说出六位数字。 因为服务会在一秒停顿处拆分文字记录,所以结果为空。 该语法将应用于每个最终结果,但“one two three”和“four five six”这两个结果均不包含六位数字。

第二个示例使用相同的音频,但将 end_of_phrase_silence_time 设置为 1.5 秒:

IBM Cloud

curl -X POST -u "apikey:{apikey}" \
--header "Content-Type: audio/wav" \
--data-binary @{path}audio-file.wav \
"{url}/v1/recognize?end_of_phrase_silence_time=1.5"

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?end_of_phrase_silence_time=1.5"

由于此值大于说话者停顿的时间长度,因此服务将返回包含整个所说短语的单个最终结果。 期望找到六位数字的语法会识别到此文字记录。

{
  "result_index": 0,
  "results": [
    {
      "alternatives": [
        {
          "confidence": 1.0,
          "transcript": "one two three four five six "
        }
      ],
      "final": true
    }
  ]
}

在短语结束位置拆分文字记录

split_transcript_at_phrase_end 参数指示服务基于输入的语义特征,将文字记录拆分为多个最终结果。 将此参数设置为 true 会使服务在有意义的短语(例如,句子)结束位置拆分文字记录。 服务对语义特征的理解基于您用于请求的基本语言模型以及您使用的定制语言模型或语法。 定制语言模型和语法可能会影响服务拆分文字记录的方式和位置。

如果将定制语言模型应用于语音识别,那么服务可能会基于模型的语料库内容和性质来拆分文字记录。 例如,其语料库包含许多简短句子的模型会使服务偏向于模拟语料库,并将输入拆分为多个较短的最终结果。 与此类似,期望一系列六位数字的语法会影响服务插入拆分,以容纳该系列数字。

但是,定制语言模型和语法影响服务拆分文字记录的程度取决于许多因素。 此类因素包括构建定制模型时使用的训练数据量以及音频本身的质量。 音频中的小更改可能会影响结果。

但是,服务仍可以生成多个最终结果,以响应停顿和静默。 如果省略 split_transcript_at_phrase_end 参数或将其设置为 false,那么服务仅基于停顿时间间隔来拆分文字记录。 基于停顿时间间隔拆分优先于根据语义特征进行拆分。 如果在单个请求上一起使用,那么 end_of_phrase_silence_time 参数优先于 split_transcript_at_phrase_end 参数。 有关更多信息,请参阅短语结束静默时间

短语结尾的拆分文字记录不可用于大型语音模型。

在短语结束位置拆分文字记录的结果

启用在短语结束位置拆分文字记录功能后,文字记录中的每个最终结果都包含一个额外的 end_of_utterance 字段,用于指明服务在该点拆分文字记录的原因:

  • full_stop - 完全语义停止,例如语法句子结束。 插入拆分受基本语言模型的影响,并受定制语言模型和语法的影响,如前所述。
  • silence - 至少与停顿时间间隔一样长的停顿或静默。 可以使用 end_of_phrase_silence_time 参数来控制停顿时间间隔的长度。
  • end_of_data - 输入音频流结束。
  • reset - 当前正在处理的音频量超过最大值两分钟。 服务会拆分文字记录,以避免过度使用内存。

在短语结束位置拆分文字记录的示例

以下示例请求演示了如何使用 split_transcript_at_phrase_end 参数。 音频说的短语是:“I have an identification card. The number is one two three four five six.”。 说话者在词“three”和“four”之间停顿了 1 秒。

第一个示例显示了忽略参数的请求结果:

IBM Cloud

curl -X POST -u "apikey:{apikey}" \
--header "Content-Type: audio/wav" \
--data-binary @{path}audio-file.wav \
"{url}/v1/recognize"

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"

该服务返回两个最终结果,仅在说话者长时间停顿时分割转录文本:

{
  "result_index": 0,
  "results": [
    {
      "alternatives": [
        {
          "confidence": 0.93,
          "transcript": "I have a valid identification card the number is one two three "
        }
      ],
      "final": true
    },
    {
      "alternatives": [
        {
          "confidence": 0.99,
          "transcript": "four five six "
        }
      ],
      "final": true
    }
  ]
}

第二个示例识别相同的音频,但将 split_transcript_at_phrase_end 设置为 true

IBM Cloud

curl -X POST -u "apikey:{apikey}" \
--header "Content-Type: audio/wav" \
--data-binary @{path}audio-file.wav \
"{url}/v1/recognize?split_transcript_at_phrase_end=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?split_transcript_at_phrase_end=true"

服务会返回三个最终结果,即除了上例中的两个最终结果外,还对于在第一个句子后面的语义停止添加了一个结果。 每个结果都包含 end_of_utterance 字段以指明拆分的原因。

{
  "result_index": 0,
  "results": [
    {
      "alternatives": [
        {
          "confidence": 0.92,
          "transcript": "I have a valid identification card "
        }
      ],
      "final": true,
      "end_of_utterance": "full_stop"
    },
    {
      "alternatives": [
        {
          "confidence": 0.97,
          "transcript": "the number is one two three "
        }
      ],
      "final": true,
      "end_of_utterance": "silence"
    },
    {
      "alternatives": [
        {
          "confidence": 0.99,
          "transcript": "four five six "
        }
      ],
      "final": true,
      "end_of_utterance": "end_of_data"
    }
  ]
}

字符插入偏差

character_insertion_bias 参数是可用于所有下一代模型的功能。 此参数不可用于大型语音模型和前代模型。

character_insertion_bias 参数控制服务在语音识别期间不同长度的竞争字符串的偏差。 使用大型语音模型和下一代模型,服务按字符解析音频字符。 正如它所做的那样,它建立了先前字符串的假设,以帮助确定可行的下一个字符。 在此过程中,它收集不同长度的候选字符串。

缺省情况下,每个模型都使用缺省 character_insertion_bias 0.0。 此值经过优化以在具有不同字符数的假设之间产生最佳平衡。 缺省值通常足以用于大多数语音识别。 但是,某些用例可能会因偏向具有较短或较长字符串的假设而受益。 在这种情况下,指定对缺省值的更改可以改进语音识别。

您可以使用 character_insertion_bias 参数来指示服务在考虑其假设的后续字符时将偏向较短或较长的字符串。 您提供的值取决于音频的特征。 可接受值的范围是从 -1.0 到 1.0:

  • 负值 使服务首选具有较短字符串的假设。
  • 正值 使服务首选具有较长字符串的假设。

随着值接近 -1.0 或 1.0,参数的影响将变得更加明显。 要确定方案的最有效值,请首先将参数值设置为较小的增量 (例如 -0.1,-0.05,0.05或 0.1),然后评估该值如何影响转录结果。 然后根据需要使用不同的值进行试验,按小增量调整值,以评估偏离模型缺省值的程度。

字符插入偏差示例

以下示例请求通过将 character_insertion_bias 参数设置为 0.1,将服务引导为稍微偏向于较长的字符假设字符串。 这是一个小的初始增量,用于确定更改对转录结果的影响。

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&character_insertion_bias=0.1"

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&character_insertion_bias=0.1"