请求为fun_asr_nano添加pcm、numpy直接推理 #2798
-
|
1 必须保存成磁盘文件无法在纯内存中操作音频,是硬伤 |
Beta Was this translation helpful? Give feedback.
Replies: 1 comment
-
|
我重新按 FunASR 1.3.14 和当前 1. PCM / NumPy 可以纯内存推理,但请先转成 16 kHz 单声道 Tensor下面这条路径不写磁盘: import numpy as np
import torch
import torchaudio
from funasr import AutoModel
model = AutoModel(
model="FunAudioLLM/Fun-ASR-Nano-2512",
hub="hf",
trust_remote_code=True,
device="cuda:0",
ctc_decoder=None, # 只需要文本时关闭 CTC 时间戳分支
)
def numpy_to_16k_mono_tensor(audio_np, sample_rate):
"""audio_np 必须是一维、单声道、归一化到 [-1, 1] 的音频。"""
audio_np = np.asarray(audio_np)
if audio_np.ndim != 1:
raise ValueError("请先按实际声道布局转换成一维单声道音频")
audio = torch.from_numpy(np.ascontiguousarray(audio_np, dtype=np.float32))
if sample_rate != 16000:
audio = torchaudio.functional.resample(audio, sample_rate, 16000)
return audio
audio = numpy_to_16k_mono_tensor(audio_np, sample_rate)
result = model.generate(input=audio, bf16=True) # Ampere/Hopper;不支持 BF16 时去掉 bf16=True
print(result[0]["text"])16-bit little-endian PCM bytes 可以这样处理;多声道 PCM 先按交错布局 reshape 后平均: def pcm_s16le_to_16k_mono_tensor(pcm_bytes, sample_rate=16000, channels=1):
audio_np = np.frombuffer(pcm_bytes, dtype="<i2").astype(np.float32) / 32768.0
if channels > 1:
audio_np = audio_np.reshape(-1, channels).mean(axis=1)
return numpy_to_16k_mono_tensor(audio_np, sample_rate)
audio = pcm_s16le_to_16k_mono_tensor(pcm_bytes, sample_rate=48000, channels=1)
result = model.generate(input=audio, bf16=True)我验证了文件解码后的 Tensor、S16LE PCM 转 Tensor、48 kHz 内存重采样到 16 kHz 三条路径,三者输出文本完全一致。当前版本也不要给 Nano 传 2. 加载时 CPU 内存明显高于最终显存,是现有加载流程造成的这个 checkpoint 的 在 H100、PyTorch 2.6.0+cu124 上,我测到:
具体峰值会随 PyTorch、Python、allocator 和宿主环境变化,所以你看到 12 GB 以上是可能的;但目前 3. 只输出文本:在构造模型时传
|
Beta Was this translation helpful? Give feedback.
我重新按 FunASR 1.3.14 和当前
main做了真实模型测试,需要先纠正之前的回复:Fun-ASR-Nano 目前不能把np.ndarray直接传给generate()。Nano 的这条输入分支只处理文件路径或torch.Tensor,直接传 NumPy 会报TypeError: 'NoneType' object is not iterable。1. PCM / NumPy 可以纯内存推理,但请先转成 16 kHz 单声道 Tensor
下面这条路径不写磁盘: