weixin_39689622
weixin_39689622
2020-12-08 19:54

Normalize path_score as confidence score for utterance?

How can I normalize a path_score (like in Pocketsphinx::Decoder::Hypothesis) of an utterance to a relative confidence probability?

该提问来源于开源项目:watsonbox/pocketsphinx-ruby

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

4条回答

  • weixin_39603505 weixin_39603505 5月前

    You can not do that. Confidence is available in C api with ps_get_prob call which is not used in bindings.

    点赞 评论 复制链接分享
  • weixin_39835158 weixin_39835158 5月前

    I've made it possible to get at this value using Pocketsphinx::Decoder::Hypothesis#posterior_prob. Does this help? Is there some additional normalization calculation that would be worth adding to the hypothesis?

    Does calling ps_get_prob every time I call ps_get_hyp have any negative performance implications?

    点赞 评论 复制链接分享
  • weixin_39689622 weixin_39689622 5月前

    IMO a step in the right direction, but the posterior probability is logarithmic and needs to be converted to a decimal probability in order to get to a more meaningful confidence score, e.g. .81 = 81% confidence, etc. According to my investigation, I think an approach worth investigating is the following:

     ruby
    ...
    # Add inside Pocketsphinx::API::Pocketsphinx
    typedef :pointer, :logmath
    attach_function :ps_get_logmath, [:decoder], :logmath
    attach_function :logmath_get_base, [:logmath], FFI::NativeType::FLOAT64
    attach_function :logmath_exp, [:logmath, :int], FFI::NativeType::FLOAT64
    ...
    # Pocketsphinx::Decoder
    logmath = ps_api.ps_get_logmath(ps_decoder)
    logbase = ps_api.logmath_get_base(logmath)
    log_prob = ps_api.ps_get_prob(ps_decoder) # -> -9834
    dec_prob = ps_api.logmath_exp(logmath, log_prob) # => 0.83111
    

    Something similar needs to happen per word within an utterance:

     ruby
    # Inside Pocketsphinx::Decoder
    def words
      ...
      acoustic_score = FFI::MemoryPointer.new(:int32, 1)
      language_score = FFI::MemoryPointer.new(:int32, 1)
      language_backoff = FFI::MemoryPointer.new(:int32, 1)
    
      ps_api.ps_seg_prob(seg_iter, acoustic_score, language_score, language_backoff)
      ...
    

    Again, these scores are logarithmic and need to be converted before they are meaningful.

    点赞 评论 复制链接分享
  • weixin_39835158 weixin_39835158 5月前

    Sorry for the delay! Please let me know if my commit resolves these issues.

    点赞 评论 复制链接分享