Haystack 集成 FunASR:使用 FunASRTranscriber 构建本地离线语音转文本(ASR)流水线
Haystack 集成 FunASR使用 FunASRTranscriber 构建本地离线语音转文本ASR流水线【免费下载链接】haystackOpen-source AI orchestration framework for building context-engineered, production-ready LLM applications. Design modular pipelines and agent workflows with explicit control over retrieval, routing, memory, and generation. Built for scalable agents, RAG, multimodal applications, semantic search, and conversational systems.项目地址: https://gitcode.com/GitHub_Trending/ha/haystack本篇技术指南围绕 Haystack 2.22 参考文档中的FunASRTranscriber集成组件展开讲解如何将阿里达摩院开源语音识别工具包 FunASR 接入 Haystack把 WAV、MP3 等音频文件批量转写为结构化Document对象。读完本文你将掌握该组件的完整参数体系、独立使用与流水线接入方式、说话人分离与标点恢复等进阶配置并理解其与 Haystack 核心数据模型Document、ByteStream及设备管理ComponentDevice之间的底层协作关系。组件概览本地化、免 API Key 的语音识别FunASRTranscriber是 Haystack 官方集成位于haystack_integrations.components.audio.funasr.transcriber模块中负责语音转文本的组件。它基于 FunASR 与对应 API 参考文档完全本地运行推理在本机完成无需任何 API Key不依赖云端服务多语言支持默认模型iic/SenseVoiceSmall支持 50 种语言官方资料称其速度约为 Whisper 的 5–10 倍模型自动管理首次使用时从 ModelScope 自动下载模型并缓存在本地~/.cache/modelscope目录之后离线复用零手动加载模型在组件首次运行时自动载入内存也可通过warm_up()主动预热。在 Haystack 的音频组件家族中见 docs-website/docs/pipeline-components/audio.mdxFunASRTranscriber与LocalWhisperTranscriber、RemoteWhisperTranscriber并列但它是唯一一个「本地运行 免 API Key」的选择最适合对数据隐私、网络隔离或成本敏感的场景。快速上手独立使用FunASRTranscriber最常见的定位是索引流水线indexing pipeline中的第一个组件。最简用法如下from haystack_integrations.components.audio.funasr import FunASRTranscriber transcriber FunASRTranscriber() result transcriber.run(sources[speech.wav, interview.mp3]) documents result[documents]要点说明sources接受音频文件路径列表str或Path也接受ByteStream二进制流对象支持的音频格式包括 WAV、MP3、FLAC、OGG、M4A、AAC以及 FunASR 底层音频后端soundfile/ffmpeg能够解码的任何格式返回结果是一个字典键documents对应一个Document列表每个音频源生成一个Document完整转写文本存放在其content字段中若想直接打印结果可使用print(result[documents][0].content)。Document是 Haystack 的核心数据类其定义见 haystack/dataclasses/document.pycontent字段保存文本内容meta字段保存可 JSON 序列化的自定义元数据——FunASR 转写产生的说话人信息等正是写入meta。构造参数全解析FunASRTranscriber的构造函数签名来自 API 参考文档如下__init__( *, model: str iic/SenseVoiceSmall, vad_model: str | None fsmn-vad, punc_model: str | None ct-punc, spk_model: str | None None, device: ComponentDevice | None None, batch_size_s: int 300, store_full_path: bool False, generation_kwargs: dict[str, Any] | None None ) - None所有参数均为仅关键字参数keyword-only。各参数含义如下参数类型默认值作用与取值建议modelstriic/SenseVoiceSmallFunASR 模型名称或本地模型路径。默认值为多语言模型iic/SenseVoiceSmall支持 50 语言、速度快于 Whisper中文场景可选paraformer-zh英文场景可选paraformer-en。可浏览 ModelScope 模型库按需挑选vad_modelstr \| Nonefsmn-vad语音活动检测Voice Activity Detection模型用于把长音频切分成语音片段。设为None则将整段音频作为单一流处理不做切分punc_modelstr \| Nonect-punc标点恢复punctuation restoration模型。设为None则关闭标点功能spk_modelstr \| NoneNone说话人分离speaker diarization模型例如cam。启用后会在生成的Document元数据中加入speakers键。默认None表示关闭分离deviceComponentDevice \| NoneNone推理设备。None时自动选择默认设备GPU 推理使用ComponentDevice.from_str(cuda)显式指定batch_size_sint300VAD 切分后音频的批处理时长秒。值越大吞吐越高但内存占用也越大store_full_pathboolFalse是否在Document元数据中保存音频文件的完整路径。True存完整路径False默认只存文件名generation_kwargsdict[str, Any] \| NoneNone透传给AutoModel.generate()的额外关键字参数用于模型专属选项详见下文进阶配置一说话人分离 标点恢复对于会议纪要、访谈整理等多说话人场景可以同时启用 VAD 切分、标点恢复和说话人分离from haystack.utils import ComponentDevice transcriber FunASRTranscriber( modelparaformer-zh, vad_modelfsmn-vad, punc_modelct-punc, spk_modelcam, deviceComponentDevice.from_str(cuda), )此配置下run()产出的每个Document的meta中会包含speakers键记录各语音片段对应的说话人标识从而支持在转写文本基础上做按说话人归类的后处理。进阶配置二SenseVoice 反文本规范化ITNSenseVoice 模型可通过generation_kwargs开启反文本规范化Inverse Text Normalisation把口语数字、日期、金额等转写为规范化书面形式并启用 VAD 合并与语种自动识别transcriber FunASRTranscriber( modeliic/SenseVoiceSmall, generation_kwargs{use_itn: True, merge_vad: True, language: auto}, )generation_kwargs直接透传给底层AutoModel.generate()因此它同时承担着模型专属能力开关的职责SenseVoice 系列use_itnTrue开启反文本规范化merge_vadTrue合并 VAD 片段languageauto自动识别语种上下文热词可通过hotword...传入热词列表实现特定人名、专有名词的上下文识别纠偏。在流水线中使用FunASRTranscriber可无缝嵌入 HaystackPipeline。例如与LinkContentFetcher组合实现「抓取网页音频链接 → 转写」的链路from haystack import Pipeline from haystack.components.fetchers import LinkContentFetcher from haystack_integrations.components.audio.funasr import FunASRTranscriber pipe Pipeline() pipe.add_component(fetcher, LinkContentFetcher()) pipe.add_component(transcriber, FunASRTranscriber()) pipe.connect(fetcher, transcriber) result pipe.run( data{ fetcher: { urls: [https://example.com/interview.wav], }, }, ) print(result[transcriber][documents][0].content)这条链路的可行性有核心源码支撑在 haystack/components/fetchers/link_content.py 中LinkContentFetcher为audio/*MIME 类型注册了二进制内容处理器_binary_content_handler因此抓取到的音频流会以ByteStream形式输出恰好与FunASRTranscriber.run()的sources入参类型str | Path | ByteStream衔接。转写后的Document可继续连接到DocumentWriter写入文档存储构成完整的音频索引流水线。输入输出契约run 方法详解run( sources: list[str | Path | ByteStream], meta: dict[str, Any] | list[dict[str, Any]] | None None, ) - dict[str, list[Document]]参数说明sources必填音频文件路径str或Path或ByteStream对象的列表。支持的格式包含 WAV、MP3、FLAC、OGG、M4A、AAC 等 FunASR 底层后端可解码的一切格式meta可选附加到产出Document上的元数据。传入单个字典时同一份元数据应用于所有Document传入与sources等长的字典列表时元数据按位置与各Document一一对应。返回值返回字典以documents为键值为Document列表每个输入源对应一个Document其content保存完整转写文本。这符合 Haystack 组件「输出统一为Document结构」的设计惯例便于下游检索、存储与评估组件直接消费。生命周期方法warm_up / to_dict / from_dictwarm_up()warm_up() - None将 FunASR 模型加载进内存。模型在首次调用时从 ModelScope 下载并缓存到本地该方法具备幂等性idempotent重复调用是安全的可放心用于流水线预热阶段以缩短首次run的延迟。to_dict() 与 from_dict()to_dict() - dict[str, Any] from_dict(data: dict[str, Any]) - FunASRTranscriberto_dict()将组件序列化为字典便于将组件配置持久化为 YAML/JSON 或存入版本控制from_dict(data)从字典反序列化重建组件实例返回FunASRTranscriber。二者配合即可实现 Haystack 标准的组件序列化往返round-trip例如将「SenseVoice VAD 标点 GPU」的完整配置导出后在其他环境或进程中原样还原。底层机制与源码佐证设备抽象ComponentDevicedevice参数的类型ComponentDevice定义于 haystack/utils/device.py。它是对单设备Device或多设备映射DeviceMap的统一封装常用构造方式包括ComponentDevice.from_str(cuda)从设备字符串创建单设备表示ComponentDevice.from_single(device)从Device对象创建ComponentDevice.from_multiple(device_map)从设备映射创建多卡场景。内部还提供to_torch()/to_torch_str()等转换方法见 haystack/utils/device.py供组件在载入模型时将统一的设备抽象转换为具体深度学习框架如 PyTorch所需的设备格式。需要说明的是设备映射不支持转换为单设备格式多卡并行需使用专门的设备映射路径。数据载体ByteStreamByteStream定义于 haystack/dataclasses/byte_stream.py是 Haystack 中表示二进制对象的基础数据类承载data二进制内容、meta元数据与mime_type三个字段。因此FunASRTranscriber可以直接消费内存中的音频字节流而不必先把数据落盘成临时文件——这在上述「网页抓取 → 转写」以及「API 上传音频 → 转写」的实时链路中尤为实用。ByteStream还提供了to_file()与from_file_path()等工具方法见 haystack/dataclasses/byte_stream.py用于与文件系统互相转换。输出模型Document转写结果统一封装为Documenthaystack/dataclasses/document.pycontent存放转写全文meta存放可 JSON 序列化的附加信息如说话人speakers、音频文件名或完整路径。这意味着转写结果无需任何适配即可进入 Haystack 的文档存储、嵌入与检索环节。实践建议与注意事项模型缓存与离线首次运行会从 ModelScope 下载模型并缓存至~/.cache/modelscope。对完全离线的生产环境可提前在联网机器上预热warm_up()并整体拷贝缓存目录长音频处理默认开启的fsmn-vad会先把长音频切分为语音片段再由batch_size_s默认 300 秒控制批处理粒度——吞吐与内存之间的权衡可通过该参数调节若音频本身很短也可将vad_model设为None以单一流处理说话人分离需要按说话人区分转写内容时务必设置spk_modelcam并在下游读取meta[speakers]中文场景默认的 SenseVoice 模型已覆盖中文追求中文效果更佳时可显式选用paraformer-zh并配合ct-punc标点恢复与use_itnTrue规范化设备指定有 GPU 时建议显式传入ComponentDevice.from_str(cuda)以获得最佳推理性能不传则自动选择默认设备。延伸阅读组件使用指南含独立使用与流水线示例docs-website/docs/pipeline-components/audio/funasrtranscriber.mdxHaystack 音频组件全景FunASR / LocalWhisper / RemoteWhisperdocs-website/docs/pipeline-components/audio.mdx组件设备管理实现haystack/utils/device.pyComponentDevice定义见 haystack/utils/device.py#L247-L271音频内容抓取支持audio/*MIME 处理器haystack/components/fetchers/link_content.py#L157-L165二进制数据载体ByteStreamhaystack/dataclasses/byte_stream.py输出数据模型Documenthaystack/dataclasses/document.py注意FunASRTranscriber属于 Haystack 的扩展集成haystack_integrations命名空间其实现代码托管于独立的 core-integrations 仓库本仓库Haystack 核心负责提供Pipeline、Document、ByteStream、ComponentDevice等支撑它的基础设施。【免费下载链接】haystackOpen-source AI orchestration framework for building context-engineered, production-ready LLM applications. Design modular pipelines and agent workflows with explicit control over retrieval, routing, memory, and generation. Built for scalable agents, RAG, multimodal applications, semantic search, and conversational systems.项目地址: https://gitcode.com/GitHub_Trending/ha/haystack创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考