Skip to content

Latest commit

 

History

History
189 lines (151 loc) · 9.48 KB

File metadata and controls

189 lines (151 loc) · 9.48 KB

用 Transformers 转写 Fun-ASR-Nano

简体中文 | English

AutoProcessorAutoModelForSpeechSeq2Seq 转写中、英、日语音。 正式发布的 Transformers 5.17.0 已包含 Fun-ASR-Nano 原生支持。 不需要克隆源码、安装 FunASR 工具库,也不需要执行模型仓库的远程 Python 代码。

在线 Space · 打开 Notebook · 可运行示例

先得到第一条转写

使用独立环境。下面是已验证的 Linux x86-64、Python 3.12 CPU 安装路径, 不要直接升级已有的 FunASR 或 vLLM 服务环境。torch 与 torchaudio 必须匹配, 因为原生特征提取器使用 torchaudio.compliance.kaldi.fbank

python3.12 -m venv .venv-funasr-native
. .venv-funasr-native/bin/activate
python -m pip install --index-url https://download.pytorch.org/whl/cpu \
  'torch==2.10.0+cpu' 'torchaudio==2.10.0+cpu'
python -m pip install 'transformers==5.17.0' 'numpy==1.26.4' \
  'librosa==0.11.0' 'soundfile==0.13.1' \
  'huggingface-hub==1.30.0' 'tokenizers==0.23.2'
python -m pip check

运行以下 Python 示例。首次加载需要下载约 1.66 GB 模型权重,然后转写一段 固定版本的官方英文样例。明确使用 CPU float32,不要求 GPU。

import torch
from transformers import AutoModelForSpeechSeq2Seq, AutoProcessor

torch.set_num_threads(4)
model_id = "FunAudioLLM/Fun-ASR-Nano-2512-hf"
revision = "d93b302ee7fd505e1b3576120fc142fc6f7820e1"
audio = "https://huggingface.co/FunAudioLLM/Fun-ASR-Nano-2512/resolve/272c57b82523ada6fd87095e955f8e29100979ab/example/en.mp3"

processor = AutoProcessor.from_pretrained(
    model_id, revision=revision, trust_remote_code=False, token=False
)
model = AutoModelForSpeechSeq2Seq.from_pretrained(
    model_id, revision=revision, trust_remote_code=False, token=False,
    dtype=torch.float32,
).to("cpu").eval()
inputs = processor.apply_transcription_request(
    audio=audio, language="en",
    processor_kwargs={
        "return_tensors": "pt",
        "audio_kwargs": {"sampling_rate": 16000},
        "text_kwargs": {"padding": True},
    },
)
with torch.inference_mode():
    generated = model.generate(**inputs, max_new_tokens=128, do_sample=False)
new_tokens = generated[:, inputs.input_ids.shape[1]:]
print(processor.batch_decode(new_tokens, skip_special_tokens=True)[0])

模型输出同时包含输入提示和生成结果,因此解码前需要去掉完整输入张量宽度。 这段音频实测的原始输出为: “The tribal chieftain called for the boy, and presented him with fifty pieces of gold.” 这是功能示例,不是质量保证。

换成自己的录音,再做批处理

命令行示例 补齐了输入校验、采样率转换和生成完成检查。克隆 QwenAudio/Fun-ASR 代码仓库 (不是 HF 权重仓库),按该目录说明安装独立依赖,再在代码仓库根目录运行:

python examples/transformers/transcribe.py recording.wav --language zh --keywords 开放时间
python examples/transformers/transcribe.py chinese.wav english.wav --language zh en

示例将多声道取均值为单声道,再用 soxr_hq 显式重采样到 16 kHz, 不会覆盖原始录音。接受 1-4 个文件,总音频时长最多 60 秒;过长、空输入 和非有限采样值会被拒绝,不会静默截断。

在自己的应用中,可向 processor.apply_transcription_request 传入波形、 本地路径或支持的 URL。原始数组必须使用真实采样率,不能把 48 kHz 数组标成 16 kHz。语言使用 zhenja。批量时传入音频列表、对应语言列表, 并设置 text_kwargs={"padding": True},解码后保留输入顺序。

keywords 是词汇提示,prompt 是上下文,不是强制词典,也不是工具库的 hotword 参数。中文样例加入 开放时间 后,实测仍输出 开饭时间; 需要用代表性录音和人工参考文本评估质量。

上面的短样例最多生成 128 个新 token。没有 EOS 可能意味着截断,单纯提高 上限不等于长录音已完整覆盖。CLI 输出 reached_eos,缺少 EOS 或文本为空时 以非零状态结束;出现 EOS 也不代表每个字都识别正确。

用 CUDA 运行 CLI

先按独立 CUDA 安装指南 安装专用的 requirements-gpu.txt,不要混入 CPU 环境。在 QwenAudio/Fun-ASR 代码仓库根目录,用自己的本地录音运行:

python examples/transformers/transcribe.py chinese.wav english.wav --language zh en --device cuda --dtype bfloat16

2026-09-10 在 Linux/Python 3.12、H100 80 GB、驱动 550.127.08、 torch/torchaudio 2.11.0+cu128、Transformers 5.17.0 上完成八项功能检查: float32/BF16 各覆盖英文、中文、关键词和中英 padding 批次。修改后的 CLI 也通过 GPU 单文件、批次与默认 CPU 回归。这不是准确率、最低显存或服务容量评测; 前述中文关键词识别错误仍存在。其他 GPU 和 float16 尚未测试。

不传设备参数仍使用 CPU float32。显式请求 CUDA 但设备不可用时直接报错, BF16 也会检查设备支持,不会静默回退 CPU。模型和输入一起迁移设备,不把整数 token ID 转成浮点数;输出记录实际设备与精度。测试中出现过 attention 分派警告, 功能通过不代表每个组件的内核已验证,也不意味着 Flash Attention 性能已验证。 这些本地检查不覆盖托管 GPU Space 或 Colab 的实际运行。

从示例走向服务

需求 checkpoint 与接口
Python 原生 Transformers FunAudioLLM/Fun-ASR-Nano-2512-hfAutoProcessor + AutoModelForSpeechSeq2Seq
FunASR 流水线和 HTTP 适配器 FunAudioLLM/Fun-ASR-Nano-2512funasr.AutoModel部署矩阵
原生 vLLM FunAudioLLM/Fun-ASR-Nano-2512-vllm原生 vLLM 指南
C++ / 边缘部署 转换后的 GGUF;llama.cpp

这些是不同格式,不能只替换模型 ID。Transformers 原生支持不自动提供 HTTP 服务、队列、流式协议、字级时间戳或说话人身份。该原生导出不包含 CTC 时间戳 分支。基础 Nano 支持中、英、日及中文方言、口音;31 语言 MLT 是独立 checkpoint

需要转写、匿名说话人和片段时间戳时,查看第三方 OpenMOSS MOSS 指南;其他任务见 Model Zoo。GPU dtype、attention 后端、显存、 并发和质量都要在实际目标硬件上另行验证。

不加载权重的排查方法

加载失败时,先检查当前解释器、transformers.__version__-hf 模型 ID 和 revision。5.16.1 不包含此模型,请在新环境升级,不要改动无关运行服务。 原生类位于 transformers.models.fun_asr_nano

下面是可选的合成静音预处理检查,只下载 processor,不加载模型权重:

import numpy as np
from transformers import AutoProcessor

model_id = "FunAudioLLM/Fun-ASR-Nano-2512-hf"
revision = "d93b302ee7fd505e1b3576120fc142fc6f7820e1"
processor = AutoProcessor.from_pretrained(
    model_id, revision=revision, trust_remote_code=False, token=False
)
inputs = processor.apply_transcription_request(
    audio=np.zeros(16000, dtype=np.float32), language="en",
    processor_kwargs={
        "return_tensors": "pt",
        "audio_kwargs": {"sampling_rate": 16000},
    },
)
print({name: tuple(value.shape) for name, value in inputs.items()})

应用层先拒绝空录音和空批次。预处理成功不代表准确率或容量验证

复现记录与来源

2026-09-09 使用实际发布的 5.17.0 wheel 验证:Python 3.12.3, torch/torchaudio 2.10.0+cpu、float32、四个 Torch 线程,CPU 为 Intel Xeon Platinum 8480+。官方英文 URL、中文波形、中文热词和中英 padding 批次均返回非空文本,并在 128 token 之前出现 EOS。两段公开短样例的功能 检查不等于 CER/WER、GPU 兼容性或服务容量评测。

公开原生 revision 为 d93b302ee7fd505e1b3576120fc142fc6f7820e1, 解析到 FunAsrNanoForConditionalGeneration,使用 trust_remote_code=Falsemodel.safetensors 大小 1,659,773,320 字节, SHA256:1bbb6dcc5d8b75084a399d48c4d4b0f3aa1d3f09f2616ae40ed2c4fba03d89c9。 音频来自原始模型仓库的 固定样例目录, 不是虚构的 -hf/example 路径。

PR #46180 的合并提交为 fc501343edfccdc840eb8594a6cafa8185c2de53,早于正式包发布。旧版源码安装说明 对应那个时间窗口;现在新安装应使用上面的正式包。 参阅 5.17.0 官方模型文档原生 model card

评估应用时保留版本、输入摘要与原始结果,不要向公开 issue 上传私人录音或凭证。