Slyne / ctc_decoder

A ctc decoder for both online and offline asr model
57 stars 26 forks source link

语言模型解码错误 #3

Open travisCxy opened 2 years ago

travisCxy commented 2 years ago

你好,请问有使用语言模型进行联合解码的脚本吗。我是从wenet那边过来的,我正尝试使用triton部署离线语音识别服务,在不含语言模型的情况下可以跑通并且获取正确结果,但是加上语言模型之后无法获取正确结果。 服务端显示内容如下: E0524 08:34:07.612731 97 python.cc:1968] Stub process is unhealthy and it will be restarted. Loading the LM will be faster if you build a binary file. Reading /ws/onnx_model/lm.arpa ----5---10---15---20---25---30---35---40---45---50---55---60---65---70---75---80---85---90---95--100 ***The ARPA file is missing . Substituting log10 probability -100.


Successfully load language model! Initialized Rescoring!

客户端则直接报错,内容如下:

Exception in thread Thread-3: Traceback (most recent call last): File "/usr/lib/python3.8/threading.py", line 932, in _bootstrap_inner self.run() File "/usr/lib/python3.8/threading.py", line 870, in run self._target(*self._args, **self._kwargs) File "/usr/lib/python3.8/multiprocessing/pool.py", line 576, in _handle_results task = get() File "/usr/lib/python3.8/multiprocessing/connection.py", line 251, in recv return _ForkingPickler.loads(buf.getbuffer()) TypeError: init() missing 1 required positional argument: 'msg'

Slyne commented 2 years ago

Hi @travisCxy 有服务器端的log吗 另外我没有测过 >1GB 的语言模型 如果方便的话 你可以分享一下你的语言模型方便我测试吗? 如果怕有隐私问题,可以构建成binary:

build_binary -q 8 trie lm.arpa  lm01111.bin

也可以用这个脚本先本机测一下

在这个脚本里加语言模型的方法可以参照: https://github.com/Slyne/ctc_decoder/blob/master/swig/test/test_en.py#L51

# 初始化语言模型打分
alpha = 0.5
beta = 0.5
lm_path = '../kenlm/lm/test.arpa'
scorer = decoder.Scorer(alpha, beta, lm_path, vocab_list)

# 将 scorer 加入到 ctc_prefix_beam_search中
result1 =  decoder.ctc_beam_search_decoder_batch(batch_chunk_log_prob_seq, 
                                                 batch_chunk_log_probs_idx,
                                                 root2,
                                                 batch_start,
                                                 beam_size, 1, 6, 1, 0.9999, scorer)

即在这一行把scorer加进去

也可以加我微信: dylanup

Slyne commented 2 years ago

记录一下问题: 主要是语言模型构建问题 @travisCxy 用的是srilm构建的 这个项目只支持kenlm的语言模型

fclearner commented 1 year ago

hello, @Slyne ,我看了你的readme中的语言模型构建部分,也尝试做了srilm和kenlm工具构建的arpa效果对比实验,我发现其实两种工具都是可以支持语言模型构建的,前提是需要把语料按单字分割;但是我遇到一个问题,我尝试用srilm去做了语言模型插值实验,融合了两个arpa文件后,这个语言模型解码结果经常会只出前面的部分,导致cer非常差,插值为什么会对解码有影响呢

fclearner commented 1 year ago

补充一下,插值之后是报了这个错:line 7: warning: non-zero probability for in closed-vocabulary LM BOW numerator for context "" is -0.4 < 0

Slyne commented 1 year ago

补充一下,插值之后是报了这个错:line 7: warning: non-zero probability for in closed-vocabulary LM BOW numerator for context "" is -0.4 < 0

请尽量用kenlm来插值

duj12 commented 1 year ago

遇到了同样的问题,我的arpa是用srilm构建的,中文是以字为建模单元,但是英文不是以字母为建模单元,而是用的BPE(空格是▁),加语言模型之后性能下降特别明显,不仅英文有问题,中文也有很大的问题。

我之前看到了https://github.com/Slyne/ctc_decoder/issues/9 这个issue,但并没有明确get到解决办法。 我现在想的是直接在构建arpa的时候去解决这个问题,就是直接用kenlm并且将语料的英文字母也用空格分开去构建arpa,但这就引入一个问题:原本英文中的空格怎么办呢?能想到的一个办法是先将与语料中的空格转成其他字符比如“|”构建好arpa,然后一遍识别结果中也将空格替换成“|”,再用arpa重打分,最后再把“|”换回空格,这个方法比较麻烦。 @Slyne 你这边有什么好的办法嘛?

Slyne commented 1 year ago

遇到了同样的问题,我的arpa是用srilm构建的,中文是以字为建模单元,但是英文不是以字母为建模单元,而是用的BPE(空格是▁),加语言模型之后性能下降特别明显,不仅英文有问题,中文也有很大的问题。

我之前看到了#9 这个issue,但并没有明确get到解决办法。 我现在想的是直接在构建arpa的时候去解决这个问题,就是直接用kenlm并且将语料的英文字母也用空格分开去构建arpa,但这就引入一个问题:原本英文中的空格怎么办呢?能想到的一个办法是先将与语料中的空格转成其他字符比如“|”构建好arpa,然后一遍识别结果中也将空格替换成“|”,再用arpa重打分,最后再把“|”换回空格,这个方法比较麻烦。 @Slyne 你这边有什么好的办法嘛?

@duj12 谢谢,我确实一直没有加BPE,并且只支持kenlm. 如果是workaround,你可以先尝试CUDA WFST解码: https://github.com/wenet-e2e/wenet/tree/main/runtime/gpu/cuda_decoders 这个也可以直接pip安装 https://github.com/nvidia-riva/riva-asrlib-decoder

你可以分享一下你的应用是离线ASR还是流式的? 我这里可以先:

  1. 先加BPE解码,没有语言模型
  2. 加语言模型
  3. 直接把wenet wfst解码拿过来 然后包装一下