FluidAudio
FluidAudio 是一款专为 Apple 设备打造的 Swift SDK,旨在让开发者轻松在 macOS 和 iOS 应用中集成前沿的本地音频 AI 能力。它支持语音转文字、文字转语音、语音活动检测以及说话人区分等多种核心功能。
针对传统音频处理依赖云端服务器导致的延迟高、隐私风险大及流量成本高等痛点,FluidAudio 通过将推理任务完全卸载至苹果神经引擎(ANE),实现了全本地化、低延迟且低功耗的运行模式。这不仅大幅减少了内存占用,还避免了占用 CPU 或 GPU 资源,非常适合后台处理、环境计算及“始终在线”的应用场景。
该工具主要面向 iOS 和 macOS 应用开发者,尤其是那些希望在不依赖网络的情况下为用户提供实时语音交互功能的团队。其技术亮点在于集成了多个开源最先进模型(如 Parakeet 和 Kokoro),支持包括中文、日文在内的多种语言,并具备端到端 utterance 检测和语音克隆等高级特性。只需几行代码,开发者即可将这些强大的模型融入自己的项目中,同时保持用户数据的完全私密。
使用场景
一位 iOS 开发者正在构建一款面向记者的离线会议记录应用,需要在设备上实时将多人对话转为文字并区分发言人。
没有 FluidAudio 时
- 依赖云端导致延迟高:音频必须上传至服务器处理,网络波动会导致转写结果严重滞后,无法实现“边说边记”。
- 隐私合规风险大:敏感的会议录音需传出设备,难以满足企业对数据不出域的严格隐私要求。
- 电量与发热失控:传统本地模型占用大量 CPU/GPU 资源,导致手机迅速发烫且电量在半小时会议中耗尽。
- 开发集成复杂:自行移植和优化开源语音模型(如 Whisper)到 CoreML 耗时数周,且难以实现说话人分离功能。
使用 FluidAudio 后
- 端侧实时响应:利用苹果神经网络引擎(ANE)加速,实现毫秒级低延迟流式转写,说完即现文字。
- 数据完全本地化:所有语音识别、说话人日记(Diarization)均在设备本地完成,彻底消除隐私泄露隐患。
- 极致能效表现:推理任务卸载至 ANE,几乎不占用主处理器资源,长时间录音仅消耗微量电量且机身清凉。
- 快速落地多语种:通过几行 Swift 代码即可集成支持中、日、英等 25 种语言的 SOTA 模型及说话人区分功能。
FluidAudio 让开发者能以极低的代码成本,在 Apple 设备上构建出兼具隐私安全、实时响应与超长续航的专业级音频 AI 应用。
运行环境要求
- macOS
- iOS
- 不需要独立 GPU 或 CUDA
- 模型专门优化以在 Apple Neural Engine (ANE) 上运行,完全避免使用 GPU/MPS,以降低功耗并减少内存占用
未说明(强调低内存占用,适合后台处理和始终在线的工作负载)

快速开始

FluidAudio - 使用 CoreML 模型进行转录、文本转语音、VAD 和说话人分离
FluidAudio 是一个适用于 Apple 设备的 Swift SDK,可在本地实现低延迟的音频 AI 处理,并将推理任务卸载到 Apple 神经引擎(ANE),从而减少内存占用并显著提升推理速度。
该 SDK 包含最先进的说话人分离、转录和语音活动检测功能,基于开源模型(MIT/Apache 2.0 许可)开发,只需几行代码即可轻松集成。这些模型针对后台处理、环境计算和始终在线的工作负载进行了优化,通过在 ANE 上运行推理来最大限度地降低 CPU 使用率,并完全避免使用 GPU/MPS。
如需定制用例、反馈、额外的模型支持或平台请求,请加入我们的 Discord 社区。我们还将推出用于设备端的视觉、语言和 TTS 模型,并会在那里分享最新进展。
以下是几款在 macOS 和 iOS 上使用 Fluid Audio 模型的优秀本地 AI 应用:
想转换您自己的模型吗?请查看 möbius。
亮点
- 自动语音识别 (ASR):Parakeet TDT v3(0.6b)及其他 TDT/CTC 模型,支持批量转录,涵盖 25 种欧洲语言、日语和中文;Parakeet EOU(120m),用于流式 ASR 并具备话语结束检测功能(仅支持英语)。更多 ASR 模型请参阅 [Documentation/Models.md#asr-models]。
- 逆向文本规范化 (ITN):对 ASR 输出进行后处理,将口语形式转换为书面形式(“two hundred” → “200”)。详情请参阅 text-processing-rs。
- 文本转语音 (TTS):Kokoro(82m),支持 SSML 和发音控制,可并行合成 9 种语言(EN、ES、FR、HI、IT、JA、PT、ZH);PocketTTS 则支持流式 TTS 及语音克隆功能(仅限英语)。
- 说话人分离(在线 + 离线):能够从音频流中分离并识别不同说话人。提供实时处理的流式管道以及具备高级聚类功能的离线批处理管道。
- 说话人嵌入提取:生成说话人嵌入,用于语音比较和聚类,也可用于说话人身份识别。
- 语音活动检测 (VAD):采用 Silero 模型进行语音活动检测。
- Apple 神经引擎:模型高效运行于 Apple 的 ANE 上,以最小的功耗实现最佳性能。
- 开源模型:所有模型均在 HuggingFace 上公开可用——由我们的团队转换并优化;采用宽松许可协议。完整模型目录请参阅 [Documentation/Models.md]。
视频演示
| 链接 | 描述 |
|---|---|
| Spokenly 实时 ASR | FluidAudio 转录准确性和速度的视频演示 |
| Senko 集成 | 使用 FluidAudio 分割模型在 Mac 上进行 Python 说话人分离 |
| Kokoro TTS | 在 iOS 上使用 FluidAudio 的 Kokoro 和 Silero 模型进行文本转语音演示 |
| Parakeet 实时 EOU | 在 iOS 上使用 Parakeet 进行流式 ASR,并具备话语结束检测功能 |
| Sortformer 说话人分离 | 使用 Sortformer 在 iOS 上处理重叠语音的说话人分离 |
| PocketTTS | 在 iOS 上使用 PocketTTS 进行流式文本转语音 |
| Parakeet EOU 超低延迟 | 在 iOS 上演示实时 Parakeet EOU 转录,展现超低延迟的语音转文字能力 |
| 动作短语直播制作控制 | 基于 FluidAudio 的 ASR 和说话人分离技术,通过自然语音命令控制摄像机、图形和布局的直播制作流程 |
展示区
如果您希望将自己的应用加入展示列表,请提交 PR,并请按时间顺序排列。
| 应用 | 描述 |
|---|---|
| Voice Ink | 本地AI,实现即时、私密的转录,准确率接近完美。采用Parakeet ASR技术。 |
| Spokenly | Mac上的语音输入应用,支持快速、精准的语音转文字;同时支持实时听写和文件转录。使用Parakeet ASR及说话人分离技术。 |
| Senko | 高速且精确的说话人分离流水线。提供了一个很好的示例,展示如何将FluidAudio集成到Python应用中:链接。 |
| Slipbox | 注重隐私的会议助手,提供实时对话智能分析。跨平台使用Parakeet ASR和说话人分离技术。 |
| Whisper Mate | 在本地转录电影和音频;可从扬声器或系统应用中实时录音并转录。使用说话人分离技术。 |
| Altic/Fluid Voice | 基于FluidAudio构建的轻量级、完全免费且开源的macOS语音转文字听写工具。再也不必为听写应用付费。 |
| Paraspeech | AI驱动的语音转文字服务。完全离线运行,无需订阅。 |
| mac-whisper-speedtest | 对不同本地ASR的比较,其中包括FluidAudio早期版本的ASR模型之一。 |
| Starling | 开源、完全本地化的语音转文字转录工具,在光标处自动粘贴文本。 |
| BoltAI | 使用Parakeet模型,让内容创作速度提升10倍。 |
| Voxeoflow | Mac上的语音输入应用,具备实时翻译功能。以闪电般的速度转录超过100种语言,并即时翻译为目标语言。 |
| Speakmac | 一款Mac应用,允许用户通过语音在Mac的任何位置进行输入。基于FluidAudio构建的完全本地化、私密的语音输入工具。 |
| SamScribe | 一款开源的macOS应用,能够实时捕获并转录来自麦克风以及会议软件(Zoom、Teams、Chrome)的音频,并支持跨会话的说话人识别。 |
| WhisKey | 注重隐私的iOS和macOS语音输入键盘。设备端转录支持12种以上语言,提供AI会议摘要和思维导图生成功能。非常适合日常使用和氛围编码。使用说话人分离技术。 |
| Dictate Anywhere | 原生macOS语音输入应用,可通过全局Fn键激活。支持25种语言,可在任意应用中进行语音输入。使用Parakeet ASR技术。 |
| hongbomiao.com | 一个个人研发实验室,致力于知识共享。使用Parakeet ASR技术。 |
| Hex | 一款macOS应用,按下并长按快捷键即可录制语音、转录并粘贴到任何应用程序中。使用Parakeet ASR技术。 |
| Super Voice Assistant | 开源的macOS语音助手,具备本地转录功能。使用Parakeet ASR技术。 |
| VoiceTypr | 开源的macOS和Windows语音转文字听写工具。使用Parakeet ASR技术。 |
| Summit AI Notes | 本地会议转录与总结,附带说话人识别功能。支持100多种语言。 |
| Ora | macOS上的本地语音助手,具备语音识别和文本转语音功能。 |
| Flowstay | 简单易用的文本转语音功能,结合本地后处理及Claude Code集成,适用于macOS。永久免费。 |
| macos-speech-server | 兼容OpenAI的STT/转录与TTS/语音API服务器。 |
| Snaply | 免费、快速、100%本地化的Mac端AI语音输入工具。 |
| OpenOats | 开源的会议记录工具,能够实时转录对话,并从知识库中提取相关笔记。使用FluidAudio进行本地转录。 |
| Enconvo | macOS上的AI智能体启动器,支持语音输入、实时字幕和文本转语音功能。采用Parakeet ASR进行本地语音识别。 |
| Meeting Transcriber | 一款macOS菜单栏应用,可自动检测、录制并转录Teams、Zoom、Webex等会议,配备双轨说话人分离功能。使用Parakeet ASR、Qwen3-ASR及说话人分离技术。 |
| Hitoku Draft | 一款位于macOS菜单栏的本地、私密的语音写作助手。使用Parakeet ASR技术。 |
| Audite | 一款macOS菜单栏应用,用于录制会议并将内容本地转录为Markdown格式的笔记,导入Obsidian使用。通过FluidAudio在Apple Neural Engine上运行Parakeet ASR。 |
| Muesli | 原生macOS语音输入与会议转录工具,延迟约0.13秒。可捕获麦克风和系统音频,并自动进行说话人分离。使用Parakeet TDT和Qwen3 ASR技术。 |
| NanoVoice | 免费的iOS语音键盘,适用于任何应用中的快速、私密语音输入。使用Parakeet ASR技术。 |
| MiniWhisper | 开源的macOS菜单栏工具,只需简单设置即可实现快速的本地语音转文字。选择快捷键,开始说话。使用Parakeet ASR技术。 |
| Talat | 注重隐私的AI会议笔记应用。在Mac本地录制并转录会议,具备说话人识别和LLM驱动的摘要功能。曾被TechCrunch报道。使用Parakeet ASR技术。 |
| Volocal | iOS上的全本地语音AI。采用流式Parakeet EOU ASR和流式PocketTTS技术。 |
| VivaDicta | 开源的iOS语音转文字应用,内置全系统AI语音键盘——可在任何应用中进行语音输入并由AI处理文本。支持15+家AI服务商、40+种AI预设。使用Parakeet ASR技术。 |
| MimicScribe | 一款macOS菜单栏应用,结合Parakeet TDT流式ASR、PyanNote Community的单说话人分离技术以及云端LLMs,根据实时转录内容和用户指令生成会议讨论要点。具备会议总结、自然语言搜索、用于智能体集成的MCP服务器,以及以键盘和语音为主的用户界面。 |
| Action Phrase | 一款面向iOS、iPadOS和macOS的语音控制直播制作应用。可通过自然语音命令控制摄像机、图形、布局和制作流程。可与OBS、vMix、ProPresenter、Bitfocus Companion等主流工具无缝集成。使用Parakeet TDT ASR和Sortformer说话人分离技术。 |
安装
使用 Swift 包管理器将 FluidAudio 添加到您的项目中:
dependencies: [
.package(url: "https://github.com/FluidInference/FluidAudio.git", from: "0.12.4"),
],
在 Xcode 中:
- 将 FluidAudio 包添加到您的项目中。
- 在“添加包”对话框中,选择
FluidAudio。 - 将其添加到您的应用目标。
在 Package.swift 中:
.product(name: "FluidAudio", package: "FluidAudio")
CocoaPods: 我们建议使用 cocoapods-spm 以获得更好的 SPM 集成,但如有需要,您也可以使用我们的 podspec:pod 'FluidAudio', '~> 0.12.4'。
其他框架
如果您使用的是其他框架,请使用我们的官方封装库:
| 平台 | 包 | 安装 |
|---|---|---|
| React Native / Expo | @fluidinference/react-native-fluidaudio | npm install @fluidinference/react-native-fluidaudio |
| Rust / Tauri | fluidaudio-rs | cargo add fluidaudio-rs |
后处理工具
使用后处理工具增强 ASR 输出:
| 工具 | 描述 | 语言 |
|---|---|---|
| text-processing-rs | 反向文本规范化 (ITN) 和文本规范化 (TN),支持 7 种语言(EN、DE、ES、FR、HI、JA、ZH)。100% 兼容 NeMo 测试(3,011 个测试)。将口语形式的 ASR 输出转换为书面形式(“two hundred” → “200”,“five dollars” → “$5”)。基于 NVIDIA NeMo Text Processing 的 Rust 实现,并提供 Swift 封装。 | Rust、Swift |
配置
快速参考
两者解决的是同一个问题:“我无法直接访问 HuggingFace。” 它们是不同的方法,您可以根据自己的设置选择适合的一种:
| 场景 | 解决方案 | 配置 |
|---|---|---|
| 您有一个 本地镜像或内部模型服务器 | 使用注册表 URL 替换 | REGISTRY_URL=https://your-mirror.com |
| 您位于 公司防火墙之后,且代理可以访问 HuggingFace | 使用代理配置 | https_proxy=http://proxy.company.com:8080 |
工作原理:
- 注册表 URL:应用程序从
your-mirror.com而不是huggingface.co请求。 - 代理:应用程序仍然请求
huggingface.co,但流量通过代理路由以到达该地址。
在大多数情况下,您只需要其中一种。只有当您的镜像位于代理之后且没有代理无法访问时,才需要同时使用两者。
模型注册表 URL - 更改下载目标
默认情况下,FluidAudio 会从 HuggingFace 下载模型。您可以将其覆盖以使用镜像、本地服务器或空气隔离环境。
程序化覆盖(推荐用于应用程序):
import FluidAudio
// 在使用任何管理器之前设置自定义注册表
ModelRegistry.baseURL = "https://your-mirror.example.com"
// 现在模型将从自定义注册表下载
let diarizer = DiarizerManager()
环境变量(推荐用于 CLI/测试):
# 使用自定义注册表
export REGISTRY_URL=https://your-mirror.example.com
swift run fluidaudiocli transcribe audio.wav
# 或者使用 MODEL_REGISTRY_URL 别名
export MODEL_REGISTRY_URL=https://models.internal.corp
swift run fluidaudiocli diarization-benchmark --auto-download
Xcode 方案配置:
- 编辑方案 → 运行 → 参数
- 转到 环境变量 选项卡
- 点击
+并添加:REGISTRY_URL=https://your-mirror.example.com - 自定义注册表将应用于所有调试运行
代理配置 - 通过代理服务器路由下载
如果您位于公司防火墙之后,无法直接访问 HuggingFace(或您的注册表),请配置代理以转发请求:
设置 https_proxy 环境变量:
export https_proxy=http://proxy.company.com:8080
# 或对于需要身份验证的代理:
export https_proxy=http://user:password@proxy.company.com:8080
swift run fluidaudiocli transcribe audio.wav
Xcode 方案中的代理配置:
- 编辑方案 → 运行 → 参数
- 转到 环境变量 选项卡
- 点击
+并添加:https_proxy=http://proxy.company.com:8080 - FluidAudio 将自动通过代理路由下载
文档
DeepWiki 提供此仓库的自动生成文档。
文档索引
- 指南
- 推理用音频转换
- 手动下载和加载模型的选项:ASR、Diarizer、VAD
- 如果需要通过代理路由 Hugging Face(或兼容)请求,请在运行下载助手之前设置
https_proxy(参见 Documentation/API.md)。
- 模型
- 基准测试
- API 参考
- 命令行指南
MCP 服务器
该仓库已编入 DeepWiki MCP 服务器索引,因此您的编码工具可以访问文档:
{
"mcpServers": {
"deepwiki": {
"url": "https://mcp.deepwiki.com/mcp"
}
}
}
对于 claude 代码:
claude mcp add -s user -t http deepwiki https://mcp.deepwiki.com/mcp
自动语音识别 (ASR) / 转录
- 模型:
FluidInference/parakeet-tdt-0.6b-v3-coreml(多语言,涵盖 25 种欧洲语言)FluidInference/parakeet-tdt-0.6b-v2-coreml(仅英语,召回率最高)
- 处理模式:批量转录完整音频文件
- 实时因子:在 M4 Pro 上约为 190 倍(约 19 秒内处理 1 小时音频)
- 流式支持:通过
SlidingWindowAsrManager支持实时流式处理和取消操作 - 后端:我们的后端 ASR 使用相同的 Parakeet TDT v3 模型。
ASR 快速入门
import FluidAudio
// 从音频文件进行批量转录
Task {
// 1) 初始化 ASR 管理器并加载模型
let models = try await AsrModels.downloadAndLoad(version: .v3) // 切换到 .v2 以仅支持英语
let asrManager = AsrManager(config: .default)
try await asrManager.loadModels(models)
// 3) 转录音频(已转换为 16Hz)
let result = try await asrManager.transcribe(samples)
// 3) 转录文件
// let url = URL(fileURLWithPath: sample.audioPath)
// 3) 转录 AVAudioPCMBuffer
// let result = try await asrManager.transcribe(audioBuffer)
print("转录结果:\(result.text)")
}
# 批量转录音频文件
swift run fluidaudiocli transcribe audio.wav
# 仅限英语且召回率更高的运行
swift run fluidaudiocli transcribe audio.wav --model-version v2
发言人区分
离线发言人区分流程
Pyannote Community-1 流程(幂集分割 + WeSpeaker + VBx)用于离线发言人区分。适用于大多数用例,基准测试请参阅 Benchmarks.md。
import FluidAudio
let config = OfflineDiarizerConfig()
let manager = OfflineDiarizerManager(config: config)
try await manager.prepareModels() // 如果缺少 Core ML 包,则下载并编译
let samples = try AudioConverter().resampleAudioFile(path: "meeting.wav")
let result = try await manager.process(audio: samples)
for segment in result.segments {
print("\(segment.speakerId) \(segment.startTimeSeconds)s → \(segment.endTimeSeconds)s")
}
对于音频文件处理,使用基于文件的 API,它会自动采用内存映射流式传输以提高效率:
let url = URL(fileURLWithPath: "meeting.wav")
let result = try await manager.process(url)
for segment in result.segments {
print("\(segment.speakerId) \(segment.startTimeSeconds)s → \(segment.endTimeSeconds)s")
}
# 使用完整的 VBx 聚类处理会议
swift run fluidaudiocli process ~/FluidAudioDatasets/ami_official/sdm/ES2004a.Mix-Headset.wav \
--mode offline --threshold 0.6 --output es2004a_offline.json
# 运行 AMI 单文件基准测试并自动下载
swift run fluidaudiocli diarization-benchmark --mode offline --auto-download \
--single-file ES2004a --threshold 0.6 --output offline_results.json
offline_results.json 包含 DER/JER/RTFx 以及分割、嵌入提取和 VBx 聚类的时间分解。CI 现在会在每个 PR 上运行此工作流,以确保离线模型保持健康,并且 Hugging Face 资产始终可访问。
LS-EEND(长时流式端到端神经网络发言人区分)
使用 CoreML 推理的端到端流式发言人区分。是在线发言者区分的默认选择——单个模型,无需聚类流程,最多支持 10 名说话人,每 100 毫秒更新一次帧,并提供 900 毫秒的暂定预览。支持流式处理和完整缓冲区处理。详细信息请参阅 Documentation/Diarization/GettingStarted.md。
import FluidAudio
Task {
let diarizer = LSEENDDiarizer()
try await diarizer.initialize(variant: .dihard3)
let samples = try await loadSamples16kMono(path: "path/to/meeting.wav")
let timeline = try diarizer.processComplete(samples, sourceSampleRate: 16_000)
for segment in timeline.segments {
print("说话人 \(segment.speakerId): \(segment.startTimeSeconds)s - \(segment.endTimeSeconds)s")
}
}
Sortformer(端到端神经网络发言人区分)
使用 NVIDIA 的 Sortformer 的端到端神经网络发言人区分。作为次要的流式发言人区分工具——虽然其说话人身份稳定性更好,参与者关注度更高,但相比 LS-EEND 在说话人容量和基准测试结果上有所牺牲。仅限 4 名说话人。无需单独的 VAD、分割或聚类。受 NVIDIA 开放模型许可证保护。
LS-EEND 和 Sortformer 都会以超低延迟更新的方式输出 DiarizerTimeline。使用方法及对比请参阅 Documentation/Diarization/Sortformer.md。
流式/在线发言人区分(Pyannote)
该流程使用分割加说话人嵌入,是继 LS-EEND 和 Sortformer 之后的第三选择。如果您特别需要经典的多阶段流程,它可以派上用场,但在实时发言人区分方面,它的速度远不及 LS-EEND 或 Sortformer。
为何使用 WeSpeaker/Pyannote 流程:
- 如果您希望分离分割和嵌入阶段,此流程更具模块化
- 当您需要集成外部说话人识别或聚类逻辑时,此流程更合适
- 说话人预先注册可靠
- 说话人数据库管理更加容易
- 清除或更新个别说话人非常简单
- 不建议在优先考虑低延迟实时发言人区分时使用
在大多数应用中:
- 将 LS-EEND 作为默认的在线发言人区分工具
- 当 Sortformer 更强的身份稳定性和参与者关注度比 4 名说话人的限制更重要时,将其作为第二选择
- 仅当您特别需要其模块化设计,即使会牺牲速度时,才使用 WeSpeaker/Pyannote 流程
权衡:
- 在推理时间和实际延迟方面都比 LS-EEND 或 Sortformer 慢
- 需要较大的数据块,通常至少需要 5 秒才能获得较好的结果
- 与 LS-EEND 和 Sortformer 不同,说话人状态更容易被显式操控
import FluidAudio
// 对音频文件进行发言人区分
Task {
let models = try await DiarizerModels.downloadIfNeeded()
let diarizer = DiarizerManager()
diarizer.initialize(models: models)
// 准备 16 kHz 单声道样本(参见:音频转换)
let samples = try await loadSamples16kMono(path: "path/to/meeting.wav")
// 进行发言人区分
let result = try diarizer.performCompleteDiarization(samples)
for segment in result.segments {
print("说话人 \(segment.speakerId): \(segment.startTimeSeconds)s - \(segment.endTimeSeconds)s")
}
}
关于流式发言人区分,请参阅 Documentation/Diarization/GettingStarted.md。
swift run fluidaudiocli diarization-benchmark --single-file ES2004a \
--chunk-seconds 3 --overlap-seconds 2
CLI
# 处理单个文件并保存 JSON
swift run fluidaudiocli process meeting.wav --output results.json --threshold 0.6
语音活动检测(VAD)
Silero VAD 为我们设备上的检测器提供支持。最新版本沿用了上游 PyTorch 实现中的相同时间戳提取和流式启发式方法。如果您需要针对您的环境调整设置,请在 Discord 上联系我们。
VAD 快速入门(离线分割)
简单调用,每 256 毫秒跳动一次返回分块级别的概率:
let results = try await manager.process(samples)
for (index, chunk) in results.enumerated() {
print(
String(
format: "分块 %02d: 概率=%.3f, 推理时间=%.4fs",
index,
chunk.probability,
chunk.processingTime
)
)
}
以下是更适合与其他系统集成的高级 API:
import FluidAudio
Task {
let manager = try await VadManager(
config: VadConfig(defaultThreshold: 0.75)
)
let audioURL = URL(fileURLWithPath: "path/to/audio.wav")
let samples = try AudioConverter().resampleAudioFile(audioURL)
var segmentation = VadSegmentationConfig.default
segmentation.minSpeechDuration = 0.25
segmentation.minSilenceDuration = 0.4
let segments = try await manager.segmentSpeech(samples, config: segmentation)
for segment in segments {
print(
String(format: "语音 %.2f–%.2fs", segment.startTime, segment.endTime)
)
}
}
流式处理
import FluidAudio
Task {
let manager = try await VadManager()
var state = await manager.makeStreamState()
for chunk in microphoneChunks {
let result = try await manager.processStreamingChunk(
chunk,
state: state,
config: .default,
returnSeconds: true,
timeResolution: 2
)
state = result.state
// 访问原始概率(0.0-1.0)以用于自定义逻辑
print(String(format: "概率: %.3f", result.probability))
if let event = result.event {
let label = event.kind == .speechStart ? "开始" : "结束"
print("\(label) @ \(event.time ?? 0)s")
}
}
}
命令行界面
从通用的 process 命令开始,该命令会端到端地对单个文件运行说话人分离管道(因此也包括 VAD):
swift run fluidaudiocli process path/to/audio.wav
一旦你需要直接试验与 VAD 相关的参数,可以使用以下命令:
# 检查离线分割结果(默认模式)
swift run fluidaudiocli vad-analyze path/to/audio.wav
# 仅进行流式模拟(默认按秒打印时间戳)
swift run fluidaudiocli vad-analyze path/to/audio.wav --streaming
# 基准测试准确率与精度之间的权衡
swift run fluidaudiocli vad-benchmark --num-files 50 --threshold 0.3
swift run fluidaudiocli vad-analyze --help 列出了所有可调参数,包括负阈值覆盖、最大语音分割、填充以及分块大小。离线模式还会根据模型的每分块处理时间报告 RTFx。
文本转语音(TTS)
⚠️ 测试版: TTS 目前仅支持美式英语。计划增加更多语言支持。
FluidAudio 提供两种 TTS 后端:
| PocketTTS | Kokoro | |
|---|---|---|
| GPL 依赖项 | 无 | 无 |
| 分词器 | SentencePiece | CoreML G2P → IPA 音素 |
| 生成 | 帧对帧自回归(80 毫秒) | 并行(一次性生成所有帧) |
| 流式传输 | 是 | 否 |
| 语音克隆 | 是(1–30 秒音频样本) | 否 |
| 发音控制 | 否 | 是(SSML,自定义词典) |
| 输出 | 24 kHz 单声道 WAV | 24 kHz 单声道 WAV |
PocketTTS
适合流式传输的 TTS,支持从短音频样本中进行语音克隆。
import FluidAudio
Task {
let manager = try await PocketTtsManager()
let audioData = try await manager.synthesize("Hello from FluidAudio.")
try audioData.write(to: URL(fileURLWithPath: "out.wav"))
}
# 使用默认语音合成
swift run fluidaudiocli tts "Hello from FluidAudio." --output out.wav --backend pocket
# 从音频样本克隆语音
swift run fluidaudiocli tts "Hello world." --output out.wav --backend pocket --clone-voice speaker.wav
Kokoro
高质量并行 TTS,支持 SSML 和音素级发音控制。对于未收录在词汇表中的单词,使用 CoreML G2P(字素到音素)模型——无需外部依赖。
import FluidAudio
Task {
let manager = KokoroTtsManager()
try await manager.initialize()
let data = try await manager.synthesize(text: "Hello from FluidAudio.")
try data.write(to: URL(fileURLWithPath: "out.wav"))
}
swift run fluidaudiocli tts "Hello from FluidAudio." --auto-download --output out.wav
词典和模型资产会缓存在 ~/.cache/fluidaudio/Models/kokoro 下。
持续集成
tests.yml:默认构建矩阵,涵盖 SwiftPM 测试和 iOS 归档冒烟测试。diarizer-benchmark.yml:在 ES2004a 上运行流式说话人分离基准测试,用于跟踪回归。offline-pipeline.yml:端到端执行 VBx 离线管道(fluidaudio diarization-benchmark --mode offline),如果 DER/JER 超出限制或模型下载失败,则构建失败。可将此工作流作为在您自己的 CI 中预置模型缓存的参考。
其他信息
常见问题解答
- 命令行界面仅适用于 macOS。对于 iOS,请以编程方式使用库。
- 模型会在首次使用时自动下载。如果您的网络限制了对 Hugging Face 的访问,请设置 HTTPS 代理:
export https_proxy=http://127.0.0.1:7890。 - Windows 替代方案正在开发中:fluid-server。
- 如果您想在 Mac 上获取系统音频,可以参考这个仓库 AudioCap。
许可证
Apache 2.0 — 详情请参阅 LICENSE 文件。
致谢
本项目基于 sherpa-onnx 项目的优秀工作,该团队在说话人分离算法和技术方面做出了卓越贡献。
Pyannote:https://github.com/pyannote/pyannote-audio
WeSpeaker:https://github.com/wenet-e2e/wespeaker
Parakeet-mlx:https://github.com/senstella/parakeet-mlx
silero-vad:https://github.com/snakers4/silero-vad
Kokoro-82M:https://huggingface.co/hexgrad/Kokoro-82M
引用
如果您在工作中使用了 FluidAudio,请引用以下内容:
FluidInference 团队. (2025). FluidAudio:适用于 Apple 平台的本地说话人分离、ASR 和 VAD(版本 0.12.4)[计算机软件]. GitHub. https://github.com/FluidInference/FluidAudio
@software{FluidInferenceTeam_FluidAudio_2025,
author = {{FluidInference Team}},
title = {{FluidAudio: 本地说话人分离、ASR 和 VAD,适用于 Apple 平台}},
year = {2025},
month = {3},
version = {0.12.4},
url = {https://github.com/FluidInference/FluidAudio},
note = {计算机软件}
}
表达您的支持
通过在您的项目中添加“由 Fluid Inference 提供支持”徽章,帮助 Fluid Inference 社区发展壮大吧!
将以下提示复制并粘贴到您托管主页的代码代理中:
在页脚中添加一个居中的“由 Fluid Inference 提供支持”徽章,链接至 fluidinference.com。图片地址:https://oss.gittoolsai.com/images/FluidInference_FluidAudio_readme_84a39d3f1e87.png。请在您的框架配置中将该图片的主机名加入白名单。
或者使用以下代码片段之一:
React/Next.js
<div className="flex justify-center py-8">
<a href="https://fluidinference.com">
<img
src="https.//assets.inference.plus/fi-badge.png"
alt="由 Fluid Inference 提供支持"
height={80}
/>
</a>
</div>
HTML
<div style="text-align: center; padding: 20px;">
<a href="https://fluidinference.com">
<img src="https://oss.gittoolsai.com/images/FluidInference_FluidAudio_readme_84a39d3f1e87.png" alt="由 Fluid Inference 提供支持" height="80">
</a>
</div>
Markdown
<p align="center">
<a href="https://fluidinference.com">
<img src="https://oss.gittoolsai.com/images/FluidInference_FluidAudio_readme_84a39d3f1e87.png" alt="由 Fluid Inference 提供支持" height="80">
</a>
</p>
版本历史
v0.13.62026/04/04v0.13.52026/04/03v0.13.42026/03/29v0.13.2.62026/03/28v0.13.2.52026/03/28v0.13.22026/03/26v0.13.12026/03/26v0.13.02026/03/26v0.12.62026/03/24v0.12.52026/03/21v0.12.42026/03/15v0.12.32026/03/08v0.12.22026/03/06v0.12.12026/02/12v0.12.02026/02/03v0.11.02026/01/31v0.10.12026/01/28v0.10.02026/01/12v0.9.12026/01/03v0.9.02025/12/31常见问题
相似工具推荐
openclaw
OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你
stable-diffusion-webui
stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。
everything-claude-code
everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上
ComfyUI
ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。
gemini-cli
gemini-cli 是一款由谷歌推出的开源 AI 命令行工具,它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言,它提供了一条从输入提示词到获取模型响应的最短路径,无需切换窗口即可享受智能辅助。 这款工具主要解决了开发过程中频繁上下文切换的痛点,让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用,还是执行复杂的 Git 操作,gemini-cli 都能通过自然语言指令高效处理。 它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口,具备出色的逻辑推理能力;内置 Google 搜索、文件操作及 Shell 命令执行等实用工具;更独特的是,它支持 MCP(模型上下文协议),允许用户灵活扩展自定义集成,连接如图像生成等外部能力。此外,个人谷歌账号即可享受免费的额度支持,且项目基于 Apache 2.0 协议完全开源,是提升终端工作效率的理想助手。
markitdown
MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具,专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片(含 OCR)、音频(含语音转录)、HTML 乃至 YouTube 链接等多种格式的解析,能够精准提取文档中的标题、列表、表格和链接等关键结构信息。 在人工智能应用日益普及的今天,大语言模型(LLM)虽擅长处理文本,却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点,它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式,成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外,它还提供了 MCP(模型上下文协议)服务器,可无缝集成到 Claude Desktop 等 LLM 应用中。 这款工具特别适合开发者、数据科学家及 AI 研究人员使用,尤其是那些需要构建文档检索增强生成(RAG)系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器