Slyne / ctc_decoder

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

Wrong number or type of arguments for overload function 'map_batch' #5

Closed Ryuk17 closed 2 years ago

Ryuk17 commented 2 years ago

报错定位到Wenet recognize_onnx.py的191行 image

错误如下 image

请问这个问题要怎么修改呢?

Ryuk17 commented 2 years ago

因为最新转onnx模型和recognize_onnx.py不一致,我使用的是这个版本 image

Slyne commented 2 years ago

@Ryuk17 你可以用这个脚本转onnx

map_batch的参数定义

std::vector<std::string> map_batch(
    const std::vector<std::vector<int>> &batch_sents,
    const std::vector<std::string> &vocabulary, size_t num_processes,
    bool greedy, int blank_id)

# python
# batch_sents: a list of list of int elements    [[1,2,3,4,5,....], [2,3,4,5,6, .....], [1,3,5,7,9], ......]
# vocabulary: a list of string   ["<blankid>", "你", "我", "它", .......]
# num_processes: int
# greedy:  True  -> use greedy search   False: just map id to character
# blank_id: int

你可以打印一下看看能不能对的上

另外191行不是这个吗? https://github.com/wenet-e2e/wenet/blob/main/wenet/bin/recognize_onnx.py#L191

可以看一下你的命令行吗?是不是beam=1 ?

Ryuk17 commented 2 years ago

感谢回复,我研究了下wenet那个recognize_onnx.py,我在这里加了一行代码,这样使用ctc_greedy_search就可以顺利运行了 image

Ryuk17 commented 2 years ago

还有另外一个问题想请教一些,wenet更新了转onnx模型的方式,ctc作为一个单独的模块,这意味着只有ctc_log_probs这个tensor,没有encoder_out_lens数据长度信息了,如何喂给map_batch这个函数呢?

Slyne commented 2 years ago

还有另外一个问题想请教一些,wenet更新了转onnx模型的方式,ctc作为一个单独的模块,这意味着只有ctc_log_probs这个tensor,没有encoder_out_lens数据长度信息了,如何喂给map_batch这个函数呢?

recognize_batch.py 只支持 export_onnx_gpu.py的offline模型导出的识别, encoder_out_lens在这里 所以一直都在,只是文件名改啦

这个脚本只是我当时看直接用Pytorch对单条音频做推理速度太慢了,所以临时写了一个方便大家更快得到实验推理结果。实际部署要参考server 目录。

它现在不支持 export_onnx_cpu.py

export_onnx_cpu.py针对的是server/x86 下的 onnxruntime 部署 export_onnx_gpu.py针对的是server/x86_gpu下的triton inference server部署 所以看你的场景啦

Ryuk17 commented 2 years ago

不对诶,我得到了ctc_log_probs这个矩阵,它的大小是[T,C](T是时间长度,C是字典大小),那就应该可以进行greedy_search和prefix_beam_search。如果map_batch支持这两种解码方式,那就应该可以调用吧?

Slyne commented 2 years ago

不对诶,我得到了ctc_log_probs这个矩阵,它的大小是[T,C](T是时间长度,C是字典大小),那就应该可以进行greedy_search和prefix_beam_search。如果map_batch支持这两种解码方式,那就应该可以调用吧?

ctc_log_probs 指的是每个C上的概率, 它在 export_onnx_gpu.py 中的 shape是 [B, T, C] 而不是 [T, C] 我猜你用了 export_onnx_cpu.py 但是又想用 recognize_onnx.py

recognize_onnx.py 中的每个tensor第一维都是 B - batch_size 这个跟 export_onnx_cpu.py 是不一样的,它假设的维度是bz=1的。

map_batch 接收的是 list of int list 所以我并不觉得 ctc_log_probs[:, :, 0] 是对的 详见前面的comment

# assume ctc_log_probs shape is [B, T, C]
log_probs_idx = torch.argmax(ctc_log_probs, axis=-1)

map_batch 不支持 ctc_prefix_beam_search 只支持 greedy_search

Ryuk17 commented 2 years ago

懂了,问题已经解掉了,十分感谢您的回复!