Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 35 additions & 5 deletions funasr/utils/load_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
from funasr.download.file import download_from_url
except:
print("urllib is not installed, if you infer from url, please install it first.")
import pdb
import subprocess
from subprocess import CalledProcessError, run

Expand Down Expand Up @@ -144,11 +143,42 @@ def load_audio_text_image_video(
return data_or_path_or_list


def _is_audio_container(data: bytes) -> bool:
"""Return True if *data* starts with a recognised container-format magic header.

Raw PCM byte streams have no header, so they will return False and the
expensive pydub/ffmpeg validation round-trip can be skipped entirely.
"""
if len(data) < 4:
return False
# WAV – RIFF....WAVE
if data[:4] == b"RIFF":
return True
# MP3 – ID3 tag or sync word (0xFF 0xEx)
if data[:3] == b"ID3" or (data[0] == 0xFF and (data[1] & 0xE0) == 0xE0):
return True
# OGG
if data[:4] == b"OggS":
return True
# FLAC
if data[:4] == b"fLaC":
return True
# MP4 / M4A / AAC – 'ftyp' box at offset 4
if len(data) >= 8 and data[4:8] == b"ftyp":
return True
Comment on lines +167 to +168
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

建议增加对 WebM/Matroska 容器格式的检查。WebM 格式(通常包含 Opus 编码的音频)在 Web 应用和流媒体中非常常见。其 EBML 头部标识符为 \x1a\x45\xdf\xa3

Suggested change
if len(data) >= 8 and data[4:8] == b"ftyp":
return True
if len(data) >= 8 and data[4:8] == b"ftyp":
return True
# WebM / MKV
if data[:4] == b"\x1a\x45\xdf\xa3":
return True

return False


def load_bytes(input):
try:
input = validate_frame_rate(input)
except:
pass
# Only run the (expensive) frame-rate validation when the payload is an
# actual audio container (WAV, MP3, OGG, …). Raw PCM buffers have no
# recognisable header and would cause pydub to spend ~200 ms before
# raising an exception that is then silently swallowed anyway.
if _is_audio_container(input):
try:
input = validate_frame_rate(input)
except:
pass
Comment on lines +178 to +181
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

建议避免使用空的 except:,因为这会捕获包括 KeyboardInterruptSystemExit 在内的所有异常,可能会掩盖真正的程序问题。建议改为捕获 Exception 或更具体的异常类型。

Suggested change
try:
input = validate_frame_rate(input)
except:
pass
try:
input = validate_frame_rate(input)
except Exception:
pass
References
  1. PEP 8 建议不要使用空的 except: 语句,而应该捕获具体的异常或至少使用 except Exception:。 (link)

middle_data = np.frombuffer(input, dtype=np.int16)
middle_data = np.asarray(middle_data)
if middle_data.dtype.kind not in "iu":
Expand Down