
mlx-audio 中的 Fun-ASR-Nano-2512在 Apple Silicon 上运行 SenseVoice 编码器 Qwen3-0.6B 解码器的轻量级语音识别【免费下载链接】mlx-audioA text-to-speech (TTS), speech-to-text (STT) and speech-to-speech (STS) library built on Apples MLX framework, providing efficient speech analysis on Apple Silicon.项目地址: https://gitcode.com/GitHub_Trending/ml/mlx-audioFun-ASR-Nano-2512 是 FunAudioLLM 发布的一款紧凑型自动语音识别ASR模型采用 SenseVoice 风格音频编码器与 Qwen3-0.6B 文本解码器组合。本仓库 mlx-audio 基于 Apple MLX 框架给出了完整实现支持中/英/日三种语言条件转写、热词上下文偏置与长音频自动分块。读完本文你将掌握如何加载官方 MLX 权重、如何用 Python API 与 CLI 完成转写、如何利用 language / hotwords / context / itn 等核心选项精确控制输出以及该运行时“仅转写、无时间戳”的能力边界。模型概览Fun-ASR-Nano-2512 的官方 MLX 权重托管在mlx-community/Fun-ASR-Nano-25120.8B 参数其上游实现源自 FunAudioLLM 的同名模型。当前仓库支持的模型清单如下ModelParametersLanguagesDescriptionmlx-community/Fun-ASR-Nano-25120.8BZH, EN, JATranscription-only Fun-ASR-Nano checkpoint该模型在 mlx-audio 中注册于 mlx_audio/stt/models/fun_asr_nano/通过model_type fun_asr_nano被 STT 加载器识别见 mlx_audio/stt/utils.py 中的MODEL_REMAPPING。架构三段式管线从 fun_asr_nano.py 的实现来看模型主体由三部分串联组成SenseVoice 风格音频编码器SenseVoiceEncoderSmall对输入的 Fbank 特征做深度建模由 50 层 SANMSelf-Attention with Memory编码层加 20 层 Transformer-Predictortp_blocks构成。SANM 层在多头自注意力之外引入一个深度可分离卷积fsmn_blockkernel_size11作为记忆机制兼顾局部时序建模与全局注意力。相关配置见 config.py 的SenseVoiceEncoderConfignum_blocks50、tp_blocks20、kernel_size11等。音频适配器AudioAdaptorTransformer把编码器输出映射到 LLM 词嵌入空间由两层 Transformer 块组成n_layer2llm_dim1024。Qwen3-0.6B 文本解码器Qwen3CausalLM以音频 token 与提示词拼成的 embedding 为输入自回归生成转写文本lm_head 与词嵌入共享tie_word_embeddings因此转写为 token 时会跳过 lm_head 权重。音频侧的前端处理audio.py也遵循 Kaldi 风格16 kHz 采样、80 维 Mel、Hamming 窗25ms 帧长 / 10ms 帧移随后做 LFR低帧率lfr_m7, lfr_n6压缩时间轴再进入编码器。快速上手Python 用法安装并加载模型后调用generate即可完成一次转写。最简示例from mlx_audio.stt import load model load(mlx-community/Fun-ASR-Nano-2512) result model.generate( audio.wav, languagezh, hotwords[开放时间], ) print(result.text)generate返回一个 STTOutput 对象除了text之外还包含segments每段文本及起止时间、prompt_tokens/generation_tokens/total_tokens、total_time以及prompt_tps/generation_tps等统计字段。也可以使用mlx_audio.stt.utils.load_model加载两者最终都走base_load_model自动识别fun_asr_nano类型from mlx_audio.stt.utils import load_model model load_model(mlx-community/Fun-ASR-Nano-2512) result model.generate(audio.wav, languagezh, hotwords[开放时间]) print(result.text)除文件路径外generate还接受mx.array、numpy.ndarray或这些类型的列表作为音频输入采样率不匹配时加载过程会自动重采样到模型所需的 16 kHz。命令行使用通过mlx_audio.stt.generate命令可以在终端直接转写。官方 README 推荐写法mlx_audio.stt.generate \ --model mlx-community/Fun-ASR-Nano-2512 \ --audio audio.wav \ --output-path transcript \ --language zh \ --context 开放时间, 地址其中--model模型路径或 HF 仓库 ID--audio待转写音频文件必填--output-path输出文件前缀默认格式 txt可用--format切换txt/srt/vtt/json--language语言提示--context上下文偏置字符串等价于 Python 侧的hotwords。CLI 还提供--max-tokens、--chunk-duration、--verbose、--prefill-step-size、--gen-kwargs以 JSON 传入额外生成参数等通用选项具体参数解析见 mlx_audio/stt/generate.py。核心选项详解language语言条件转写语言提示使用 ISO 风格代码当前 checkpoint 支持zh中文中文方言代码会统一映射到中文提示词yue粤语、wuu吴语、nan闽南语、hak客家话、gan赣语、hsn湘语、cjy晋语en英文ja日文。传None或auto表示不施加语言约束让模型自行判断。从源码_map_languagefun_asr_nano.py看zh-cn、zh-hans、cmn等变体也会被归一化到中文而ko等未支持的 ISO 代码会抛出ValueError。语言会被拼进用户提示词如语音转写成中文实现条件化转写。hotwords热词上下文偏置热词用于把领域专有词人名、地名、术语注入提示词提升识别准确率。支持以列表形式提供result model.generate(audio.wav, languagezh, hotwords[开放时间, 地址])从_prompt_text的实现可见热词会拼成固定的中文指令模板“请结合上下文信息更加准确地完成语音转写任务……热词列表[开放时间, 地址]”再由 Qwen3-0.6B 在解码时参照执行。contextCLI / Server 的统一别名共享 CLI 与 OpenAI 兼容的服务端 API 把上下文偏置暴露为单个context字符串它是hotwords的别名。需要强调的是非空的hotwords与context互斥同时传入会抛出ValueError(Pass either hotwords or context, not both.)。_resolve_hotwords会先剔除空白项再决定最终生效的列表因此 CLI 里的--context 开放时间, 地址与 Python 里的hotwords[开放时间, 地址]效果一致。这一约定也通过mlx_audio.stt.generate --context ...和POST /v1/audio/transcriptions两种入口保持一致测试见 mlx_audio/stt/tests/test_fun_asr_nano.py。itn逆文本规整开关逆文本规整Inverse Text NormalizationITN默认开启模型会把“一百二十三”这类口语数字转写为“123”。如果希望保留口语化书写显式关闭即可result model.generate(audio.wav, languagezh, itnFalse)关闭后提示词会追加“不进行文本规整”模型据此输出原样的口语文本。长音频与生成控制generate内部会把长音频按chunk_duration默认 1200 秒切块后逐段转写再拼接每段独立处理并记录start/end偏移max_tokens默认取自配置的default_max_tokens512。生成侧支持temperature、top_p、top_k、min_p、repetition_penalty等采样参数且默认temperature0.0保证确定性输出prefill_step_size2048控制预填充步长并会在每块结束后调用mx.clear_cache()释放显存见_generate_single_chunk与generate。从 PyTorch 权重转换到 MLX官方发布的权重是 PyTorch 格式的model.pt如需自建 MLX 模型目录可运行模型专属转换脚本convert.pypython -m mlx_audio.stt.models.fun_asr_nano.convert \ --hf-path FunAudioLLM/Fun-ASR-Nano-2512 \ --mlx-path Fun-ASR-Nano-2512-mlx转换脚本会下载上游快照含model.pt、Qwen3-0.6B/*tokenizer、example/*示例音频把权重转为 MLX safetensors默认bfloat16可用--dtype选择float16/bfloat16/float32并在输出目录中写入model.safetensors转换后的 MLX 权重config.json运行时配置前端、编码器、适配器、Qwen3 文本配置见RUNTIME_CONFIGQwen3-0.6B/Qwen3 tokenizer模型加载时通过post_load_hook用AutoTokenizer加载README.md可直接发布的模型卡。转换时有两个关键细节一是fsmn_block.weight若为 3 维且中间维为 1会转置为(out, in, 1)以匹配 MLX 的 Conv1d 布局二是由于 lm_head 与嵌入共享llm.lm_head.weight会被跳过。这两点都有单元测试覆盖见test_converter_transposes_fsmn_and_skips_tied_lm_head。转换完成后的目录可以直接上传为 HF 仓库如mlx-community/Fun-ASR-Nano-2512或在本地直接传入load/load_model使用。能力边界与注意事项该运行时是纯转写transcription-only模型官方FunAudioLLM/Fun-ASR-Nano-2512checkpoint 不包含时间戳头timestamp head权重因此不会输出词级或句段级时间戳。此外VAD语音活动检测与说话人分离diarization也不在该模型内实现若需要这两类能力应先使用仓库中独立的 VAD 模块 或说话人分离方案对音频进行切分后再调用本模型。其他值得注意的边界语言提示、热词与 ITN 都通过提示词注入生效因此它们的表达能力受 Qwen3-0.6B 解码器能力约束热词列表在长音频分块场景下会对每一块重复生效测试test_cli_context_reaches_each_fun_asr_audio_chunk验证了这一点模型权重为 0.8B 参数量推理成本远低于大模型适合 Apple Silicon 上的本地、隐私优先部署但不应对其转写能力做超出官方描述的夸大。小结Fun-ASR-Nano-2512 以“轻量编码器 0.6B 文本解码器”的组合在 mlx-audio 中提供了一条在 Apple Silicon 上快速上手的 ASR 路径Python 侧load(...).generate(...)三行代码即可转写CLI 侧一条命令即可批处理language/hotwords/context/itn四个选项覆盖了语言条件、领域热词与文本规整等最常见的实战需求。需要完整源码佐证时可继续阅读 fun_asr_nano.py、config.py、audio.py、convert.py 以及对应测试 test_fun_asr_nano.py。【免费下载链接】mlx-audioA text-to-speech (TTS), speech-to-text (STT) and speech-to-speech (STS) library built on Apples MLX framework, providing efficient speech analysis on Apple Silicon.项目地址: https://gitcode.com/GitHub_Trending/ml/mlx-audio创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考