Skip to content

Bug: AudioFeat.extract elif 分支 tuple 解包顺序与项目约定不一致 #62

@gpww

Description

@gpww

问题描述

fireredvad/core/audio_feat.pyAudioFeat.extract() 方法的 elif 分支,对 tuple 的解包顺序是 soundfile 风格的 (data, sr),但项目内其他位置统一使用 (sr, data) 格式。如果有人传入 (sample_rate, wav_np) 格式的 tuple,sample_rate 和 wav_np 会被互换。

问题代码

# fireredvad/core/audio_feat.py, AudioFeat.extract()
def extract(self, audio):
    if isinstance(audio, str):
        wav_np, sample_rate = sf.read(audio, dtype="int16")  # soundfile 返回 (data, sr)
    elif isinstance(audio, (list, tuple)):
        wav_np, sample_rate = audio   # ← 解包顺序是 (data, sr)
    else:
        wav_np = audio
        sample_rate = 16000

项目内的格式约定

项目内其他位置统一使用 (sample_rate, wav_np) 格式

位置 代码 格式
fireredasr2system.py:71 batch_asr_wav.append((sample_rate, wav_segment)) (sr, data)
asr_feat.py:34 for (sample_rate, wav_np), path, uttid in zip(...) (sr, data)
asr_feat.py KaldifeatFbank.__call__ sample_rate, wav_np = wav (sr, data)
audio_feat.py KaldifeatFbank.__call__ sample_rate, wav_np = wav (sr, data)

elif 分支的 wav_np, sample_rate = audio 与上述约定方向相反

当前影响

暂无实际影响——所有现有调用方传给 AudioFeat.extract() 的参数都是 str(走 if 分支)或 np.ndarray(走 else 分支),elif 分支目前是死代码:

调用方 传参 走的分支
vad.py:68 vad.detect(audio) str 路径 if
aed.py:69 aed.detect(audio) str 路径 if
stream_vad.py:77 extract(audio_frame) np.ndarray else
stream_vad.py:89 extract(audio_chunk) np.ndarray else
stream_vad.py:107 extract(audio) str 或 np.ndarray if/else
fireredasr2system.py:54 vad.detect(wav_path) str 路径 if

潜在风险

如果未来有调用方以 (sample_rate, wav_np) 格式的 tuple 传入(与项目约定一致),elif 分支会互换 sample_rate 和 wav_np:

  • wav_np 实际拿到的是整数 16000
  • sample_rate 实际拿到的是 numpy 数组
  • assert sample_rate == 16000 会失败(numpy 数组 != 16000),报错反而掩盖了根因

建议修复

将 elif 解包顺序统一为 (sample_rate, wav_np)

elif isinstance(audio, (list, tuple)):
    sample_rate, wav_np = audio   # 统一为 (sr, data) 格式

这需要同步更新 elif 分支上游可能传 tuple 的调用方,确保它们也遵循 (sample_rate, wav_np) 格式。

同类问题排查

项目中还有一个类似的历史遗留不一致:AudioFeat.extract 的 if 分支使用 sf.read() 返回的 (data, sr) 格式,而 KaldifeatFbank.__call__ 返回的也是 (sr, data) 格式。建议整个项目统一 tuple 约定为 (sample_rate, wav_np),与 kaldi 生态的 (sr, wav) 惯例一致。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions