FunASR icon indicating copy to clipboard operation
FunASR copied to clipboard

python fastapi进行离线文件识别报错choose a window size 400 that is [2, 0]

Open secslim opened this issue 1 year ago • 10 comments

🐛 Bug

使用FunASR/runtime/python/http/server.py文件进行离线文件识别, 服务端使用两个进程 uvicorn.run( app="fun_test:app", host=args.host, port=args.port, ssl_keyfile=args.keyfile, ssl_certfile=args.certfile, workers=2 ) 当两个用户同时访问,报如下错误 choose a window size 400 that is [2, 0]

Environment

  • OS : Linux
  • FunASR Version : 1.1.5
  • PyTorch Version : 2.3.1

secslim avatar Aug 12 '24 12:08 secslim

同样遇到这个错误,assert 2 <= window_size <= len(waveform), "choose a window size {} that is [2, {}]".format( AssertionError: choose a window size 400 that is [2, 160] Environment OS : Linux FunASR Version : 1.1.6 PyTorch Version : 2.3.1

nixonjin avatar Aug 22 '24 05:08 nixonjin

单进程没有这个错误,使用多进程遇到这个错误,有大佬知道大概是哪里出现问题吗?源码要修改哪里?

nixonjin avatar Aug 22 '24 08:08 nixonjin

fix bug: 方法一 升级funasr到1.1.6版本

  1. 找到/funasr/fronteds/wav_fronted.py/WavFonted 类的forward 方法

  2. 转到第137行,在调用kaldi.fbank方法中,修改代码为:

       mat = kaldi.fbank(
             waveform,
             num_mel_bins=self.n_mels,
             frame_length=min(self.frame_length,waveform_length/self.fs*1000),
             frame_shift=self.frame_shift,
             dither=self.dither,
             energy_floor=0.0,
             window_type=self.window,
             sample_frequency=self.fs,
             snip_edges=self.snip_edges,
         )
    

在我的场景中此法有效

方法二: MyWavFrontend 或者,如果不想直接修改funasr包代码,可以新建一个MYWavFrontend类 ` @tables.register("frontend_classes", "my_wav_frontend") @tables.register("frontend_classes", "MyWavFrontend") class MYWavFrontend(WavFrontend): """Conventional frontend structure for ASR."""

def forward(
    self,
    input: torch.Tensor,
    input_lengths,
    **kwargs,
) -> Tuple[torch.Tensor, torch.Tensor]:
    batch_size = input.size(0)
    feats = []
    feats_lens = []
    for i in range(batch_size):
        waveform_length = input_lengths[i]
        waveform = input[i][:waveform_length]
        if self.upsacle_samples:
            waveform = waveform * (1 << 15)
        waveform = waveform.unsqueeze(0)
        mat = kaldi.fbank(
            waveform,
            num_mel_bins=self.n_mels,
            # frame_length=self.frame_length,
            frame_length=min(self.frame_length,waveform_length/self.fs*1000),
            frame_shift=self.frame_shift,
            dither=self.dither,
            energy_floor=0.0,
            window_type=self.window,
            sample_frequency=self.fs,
            snip_edges=self.snip_edges,
        )

        if self.lfr_m != 1 or self.lfr_n != 1:
            mat = apply_lfr(mat, self.lfr_m, self.lfr_n)
        if self.cmvn is not None:
            mat = apply_cmvn(mat, self.cmvn)
        feat_length = mat.size(0)
        feats.append(mat)
        feats_lens.append(feat_length)

    feats_lens = torch.as_tensor(feats_lens)
    if batch_size == 1:
        feats_pad = feats[0][None, :, :]
    else:
        feats_pad = pad_sequence(feats, batch_first=True, padding_value=0.0)
    return feats_pad, feats_lens`

并在模型配置文件speech_seaco_paraformer_large_asr_nat-zh-cn-16k-common-vocab8404-pytorch/config.yaml 中修改WavFrontend为MyWavFrontend

nixonjin avatar Aug 27 '24 10:08 nixonjin

fix bug: 方法一 升级funasr到1.1.6版本

  1. 找到/funasr/fronteds/wav_fronted.py/WavFonted 类的forward 方法
  2. 转到第137行,在调用kaldi.fbank方法中,修改代码为:
       mat = kaldi.fbank(
             waveform,
             num_mel_bins=self.n_mels,
             frame_length=min(self.frame_length,waveform_length/self.fs*1000),
             frame_shift=self.frame_shift,
             dither=self.dither,
             energy_floor=0.0,
             window_type=self.window,
             sample_frequency=self.fs,
             snip_edges=self.snip_edges,
         )
    

在我的场景中此法有效

方法二: MyWavFrontend 或者,如果不想直接修改funasr包代码,可以新建一个MYWavFrontend类 ` @tables.register("frontend_classes", "my_wav_frontend") @tables.register("frontend_classes", "MyWavFrontend") class MYWavFrontend(WavFrontend): """Conventional frontend structure for ASR."""

def forward(
    self,
    input: torch.Tensor,
    input_lengths,
    **kwargs,
) -> Tuple[torch.Tensor, torch.Tensor]:
    batch_size = input.size(0)
    feats = []
    feats_lens = []
    for i in range(batch_size):
        waveform_length = input_lengths[i]
        waveform = input[i][:waveform_length]
        if self.upsacle_samples:
            waveform = waveform * (1 << 15)
        waveform = waveform.unsqueeze(0)
        mat = kaldi.fbank(
            waveform,
            num_mel_bins=self.n_mels,
            # frame_length=self.frame_length,
            frame_length=min(self.frame_length,waveform_length/self.fs*1000),
            frame_shift=self.frame_shift,
            dither=self.dither,
            energy_floor=0.0,
            window_type=self.window,
            sample_frequency=self.fs,
            snip_edges=self.snip_edges,
        )

        if self.lfr_m != 1 or self.lfr_n != 1:
            mat = apply_lfr(mat, self.lfr_m, self.lfr_n)
        if self.cmvn is not None:
            mat = apply_cmvn(mat, self.cmvn)
        feat_length = mat.size(0)
        feats.append(mat)
        feats_lens.append(feat_length)

    feats_lens = torch.as_tensor(feats_lens)
    if batch_size == 1:
        feats_pad = feats[0][None, :, :]
    else:
        feats_pad = pad_sequence(feats, batch_first=True, padding_value=0.0)
    return feats_pad, feats_lens`

并在模型配置文件speech_seaco_paraformer_large_asr_nat-zh-cn-16k-common-vocab8404-pytorch/config.yaml 中修改WavFrontend为MyWavFrontend

试了您的两种方法,我这边还是报同样错误,我想请问一下,您的torch版本是多少?

secslim avatar Nov 20 '24 02:11 secslim

PyTorch Version : 2.3.1,应该跟torch版本关系不大, 你报的还是这个错误吗?

nixonjin avatar Nov 20 '24 02:11 nixonjin

PyTorch Version : 2.3.1,应该跟torch版本关系不大, 你报的还是这个错误吗?

除了报这个错外:choose a window size 400 that is [2,0],还会报list index out of range

secslim avatar Nov 20 '24 03:11 secslim

list index out of range 这个你可以尝试一下更新到最新版本funasr, 我前一阵子pull requests修了两个与这个相关的bug,你看是否可以解决你的问题。 choose a window size 400 that is [2,0], 这个,你可以尝试一下用try except 在遇到错误的时候 reload model(重新对asr_model进行初始化)试试。

nixonjin avatar Nov 20 '24 03:11 nixonjin

list index out of range

非常感谢您,list index out of range这个bug已经通过更新funasr版本得到解决,choose a window size 400 that is [2,0]这个bug,用try execpt还是无法解决并发问题

secslim avatar Nov 20 '24 06:11 secslim

list index out of range 这个你可以尝试一下更新到最新版本funasr, 我前一阵子pull requests修了两个与这个相关的bug,你看是否可以解决你的问题。 choose a window size 400 that is [2,0], 这个,你可以尝试一下用try except 在遇到错误的时候 reload model(重新对asr_model进行初始化)试试。

升级funasr版本之后,又出现另一个报错: File "/home/malimin/.conda/envs/offline_test/lib/python3.10/site-packages/funasr/auto/auto_model.py", line 343, in inference | res = model.inference(**batch, **kwargs) | File "/home/malimin/.conda/envs/offline_test/lib/python3.10/site-packages/funasr/models/fsmn_vad_streaming/model.py", line 717, in inference | "waveform": cache["frontend"]["waveforms"], | KeyError: 'waveforms'

secslim avatar Nov 20 '24 06:11 secslim

list index out of range

非常感谢您,list index out of range这个bug已经通过更新funasr版本得到解决,choose a window size 400 that is [2,0]这个bug,用try execpt还是无法解决并发问题

请问解决了吗?咋解决的

taohongxiu avatar Mar 08 '25 12:03 taohongxiu