
Ffvoice
io.github.chicogongPublished by GitHub account chicogongv0.8.3Updated Oct 24, 2026
Offline speech-to-text & speaker diarization MCP server: transcribe audio on-device, no cloud
Overview
Local MCP server for offline speech-to-text and speaker diarization, letting an assistant transcribe audio files or record and caption microphone input on-dev.
- What you can do
- Transcribe local audio files (WAV, FLAC and similar) with language and model-size options and word-level timestamps, output as text, SRT, VTT or JSON. Transcribe with speaker diarization so each segment carries a speaker ID. Record microphone audio for a set duration and transcribe it with VAD segmentation and optional RNNoise denoising. Record and produce a live caption stream of partial and final events. List available audio input and output devices with default device IDs.
- When to use it
- Useful when an assistant should turn local recordings or meetings into transcripts or subtitles, label who spoke when, or capture and transcribe microphone audio, especially where audio must stay on the machine and no cloud API is wanted.
- Requirements
- Runs as a local process via uvx from the PyPI package ffvoice; the MCP server needs the mcp extra and diarization needs the diarization extra. Desktop only. Whisper and diarization models download automatically on first use to the local cache. No accounts, API keys or environment variables are declared.
Installation
In SourceWeft
- Open Ffvoice in the dashboard and add it to a workspace.
- Enable the server for the chats that should use its tools.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Other MCP clients
Follow the launch instructions in the repository.
README
ffvoice-engine
[License: MIT] [C++20] [CMake]
[Platform] [macOS] [Linux] [Windows]
[PyPI version] [Python versions] [GitHub release] [GitHub stars] [GitHub forks]
[FFmpeg] [PortAudio] [FLAC] [Whisper]
🎙️ Offline speech-to-text & speaker diarization for AI agents — Whisper ASR, live captioning, an MCP server, a CLI and Python bindings. Fully on-device, no cloud API.
🎙️ 离线语音识别 + 说话人分离,AI Agent 开箱即用 —— Whisper 实时转写 · 实时字幕 · MCP server · CLI · Python 绑定 · 100% 本地运行,音频不上云。
[ffvoice demo — offline speech-to-text in ~12 lines of Python]
Why ffvoice? / 为什么用 ffvoice?
The honest pitch: ffvoice is an integration layer, not a new ASR engine. It embeds whisper.cpp as-is and makes no changes to its accuracy or inference speed. What ffvoice adds is a batteries-included, pre-wired pipeline — microphone capture → RNNoise denoising → VAD segmentation → Whisper ASR → speaker diarization → live captions / WAV / FLAC / subtitles — delivered as a single C++ SDK with Python bindings, a CLI, and an MCP server that lets AI agents (Claude and others) transcribe audio out of the box — all in one pip install or cmake build.
诚实定位: ffvoice 是一个集成层,而非新的 ASR 引擎。它内嵌 whisper.cpp,不修改其识别精度或推理速度。ffvoice 带来的是一条开箱即用、预连接的完整管道——麦克风采集 → RNNoise 降噪 → VAD 分段 → Whisper ASR → 说话人分离 → 实时字幕 / WAV / FLAC / 字幕输出——打包成 C++ SDK + Python 绑定 + CLI,外加一个 MCP server,让 AI agent(Claude 等)开箱即用地转写音频——一条 pip install 或 cmake 即可完成。
Pain points it addresses / 解决的痛点
What ffvoice does NOT do / 不做什么
- ffvoice does not improve whisper.cpp's WER (word error rate) or speed. If Whisper tiny gives you 12% WER, ffvoice will too.
- ffvoice does not outperform sherpa-onnx or other optimized inference runtimes on raw transcription speed.
- ffvoice does not provide custom vocabulary or acoustic model fine-tuning.
If raw ASR accuracy or throughput is your primary concern, evaluate whisper.cpp directly or consider specialized runtimes. ffvoice's value is the integrated pipeline, not the ASR engine itself.
📋 项目介绍
ffvoice-engine 是一个轻量级、高性能的音频处理引擎,专注于实时音频采集、智能处理和语音识别。
🎯 使用场景
- 📝 会议记录 - 实时转写会议内容,说话人分离标注"谁说了什么",自动生成字幕
- 🎓 在线教育 - 录制课程并生成字幕,支持多语言识别
- 🎙️ 播客制作 - 高质量音频录制 + RNNoise 降噪 + 自动字幕生成
- 🎵 音乐制作 - 低延迟音频采集,支持 FLAC 无损压缩
- 🤖 语音助手 - 实时语音识别和处理,构建本地 AI 语音应用
- 📡 直播字幕 - 边录边转写,生成实时字幕流
✨ 核心优势
vs 商业服务(Azure/Google Cloud Speech):
- ✅ 完全离线 - 无需网络,保护隐私,零 API 费用
- ✅ 本地处理 - 无网络往返;端到端延迟取决于设备、模型与音频长度
- ✅ 开源免费 - MIT 协议,可商用
vs FFmpeg 命令行:
- ✅ 实时转写 - 边录边识别,支持 VAD 智能分段
- ✅ AI 降噪 - 集成 RNNoise 深度学习降噪
- ✅ C++ SDK - 可嵌入任何 C++ 应用,非黑盒工具
vs Python 方案(whisper-cli):
- ✅ 原生管道 - C++20 实现,处理链无 Python 解释器与胶水开销
- ✅ 易部署 - 单一可执行文件,无 Python 环境依赖
- ✅ 同样的精度 - 内嵌 whisper.cpp,识别质量与上游一致(ffvoice 不改模型)
💡 技术亮点
- 🚀 零拷贝处理链 - 音频数据在内存中就地处理
- 🧠 智能 VAD 分段 - 基于 RNNoise VAD 的语音活动检测
- 🎯 高压缩比 - FLAC 无损压缩 2-3x,质量无损
- ⚡ whisper.cpp 推理 - 内嵌 whisper.cpp,Apple Silicon 上推理快于实时
核心特性
- ✅ 实时音频采集 - 低延迟麦克风/系统声音捕获 (PortAudio)
- ✅ 多格式输出 - WAV、FLAC 无损压缩
- ✅ 音频增强处理 - 音量归一化、高通滤波、RNNoise 降噪
- ✅ 离线语音识别 - Whisper ASR (tiny model,纯文本/SRT/VTT/JSON 四种格式,含词级时间戳)
- 🧪 滚动字幕流 - LiveCaptioner 输出 partial/final 事件;partial 会重复转写累计语音,不等同于增量流式解码
- ✅ 说话人分离 - Diarizer 离线 diarization(sherpa-onnx),自动标注"谁在何时说话"
- ✅ Agent 集成 - CLI + MCP server,AI agent 可直接调用本地离线语音能力
🏗️ 当前状态 (v0.8.3)
四个集成层路线图阶段全部交付,已发布到 PyPI(macOS / Linux / Windows,Python 3.10–3.14)。
完整历史见 CHANGELOG.md。
🚀 快速开始
依赖
- CMake 3.20+
- C++20 编译器(GCC 10+, Clang 12+, MSVC 2019+)
- FFmpeg 4.4+ (libavcodec, libavformat, libavutil, libswresample)
- PortAudio 19.7+ (音频采集)
- FLAC 1.5+ (无损压缩)
- whisper.cpp (可选,自动下载,用于语音识别)
- RNNoise (可选,自动下载,用于深度学习降噪)
macOS 安装:
Linux (Ubuntu/Debian) 安装:
Windows 安装:
编译
标准编译:
Linux/macOS:
Windows:
启用 RNNoise 降噪 (推荐,自动下载):
Linux/macOS:
Windows:
启用 Whisper 语音识别 (推荐,自动下载):
Linux/macOS:
Windows:
启用所有可选功能 (Linux/macOS):
使用
注意:
- Linux/macOS: 使用
./build/ffvoice- Windows: 使用
.\build\Release\ffvoice.exe
⚠️ LiveCaptioner 边界:音频采集/VAD 已与 Whisper 推理解耦,并由有界队列提供 final 优先、generation 取消、whisper.cpp 协作式计算中止和旧结果抑制;
reset()可在停止后复用已加载模型。partial 仍是重转写累计语音,不是增量解码。SDK/Python 使用方必须同时检查 input drop、cancel、inference job drop、final job drop;任何 final drop 都应视为会话完整性失败。真实设备延迟与打断仍待验证。
⚠️ 说话人分离适用边界:diarization 的 embedding 模型默认英文调优。中文或混合语言音频请改用内置的中英双语模型 —— 在
transcribe_file_with_diarizationMCP 工具(或make_diarizer)传embedding="multilingual",首次使用自动下载。已知说话人数时请传--num-speakers N,自动判定数量在多说话人场景不够稳。
🐍 Python Bindings
ffvoice 提供高性能的 Python 绑定,让您在 Python 中轻松使用所有功能。
安装
从 PyPI 安装 (推荐):
💡 说话人分离免编译:
[diarization]extra 经sherpa-onnx提供 diarization,无需从源码构建 ONNX Runtime;Whisper 与 diarization 模型在首次使用时自动下载到~/.cache/ffvoice/,无需手动配置。
从源码安装:
平台兼容性
重要说明:
- Apple Silicon 用户: 直接使用
pip install ffvoice即可,性能最佳 - Windows 用户: 现已支持 Windows x86_64 预编译 wheels,直接使用
pip install ffvoice即可- 支持 Python 3.10-3.14
- 自动包含所有必需的依赖(无需手动安装 FFmpeg 等)
- 注意: Windows 版本禁用了 RNNoise 降噪(MSVC 不支持 VLA),其他功能完全可用
- Intel Mac 用户: PyPI wheel 不兼容,需要从源码编译:
- Rosetta 2 用户: ARM64 wheel 在 Rosetta 环境下不工作,请使用 ARM64 原生 Python:
快速示例
完整文档
详细文档和示例请查看 python/README.md:
- 📖 完整 API 参考(含
AudioMixer多音轨混音、RingBuffer无锁环形缓冲区、词级时间戳Word/TranscriptionSegment.words) - 🎯 16+ 代码示例
- 🚀 Quick Start 指南
- 📓 Jupyter Notebook 教程
性能优势:
- ⚡ 3-10x 更快 - C++ 核心 vs 纯 Python 实现
- 💾 零拷贝 - NumPy 数组直接传递
- 🔒 100% 离线 - 无需网络,隐私安全
- 🎙️ 完整工作流 - 采集 → 降噪 → VAD → 识别
🤖 AI Agent 集成 — MCP Server + Agent Skill
ffvoice 内置了一个 MCP (Model Context Protocol) 服务器,让 AI agent(如 Claude Desktop)能够直接调用本地离线语音识别能力,全程无需联网,音频数据绝不离开本机。
安装
提供的工具
接入 Claude Desktop
将以下配置粘贴到 Claude Desktop 的 claude_desktop_config.json:
重启 Claude Desktop 后,即可在对话中直接请求转写本地音频或录制语音。
Claude Agent Skill
仓库内置一个 Claude Agent Skill(.claude/skills/ffvoice-transcription/)—— 用 Claude Code 打开本仓库即被自动发现,无需任何配置。它教 agent 何时、如何用 ffvoice 的 MCP 工具与 CLI 完成转写、说话人分离、实时字幕。配合 MCP server,ffvoice 对 AI agent 真正做到开箱即用。
📁 项目结构
🛣️ 路线图
Milestone 1–6 —— 基础录制 → 音频增强(RNNoise) → 离线 ASR(Whisper) → 实时 ASR → 性能优化 → AudioMixer / RingBuffer / 词级时间戳 —— ✅ 全部完成。
集成层路线图(v0.8.3):
- ✅ Phase 1 Agent 集成 — CLI 硬化 + MCP server,让 AI agent 把 ffvoice 当本地离线语音工具调用;v0.7.0 已发布到 PyPI
- 🧪 Phase 2 滚动字幕流 — LiveCaptioner 已有 partial/final 事件;真正低延迟对话接入仍需异步推理、取消与积压观测
- ✅ Phase 3 说话人分离 — Diarizer(sherpa-onnx 离线 diarization),CLI
--diarize+ MCPtranscribe_file_with_diarization
下一阶段:面向 Open Voice Agent 的稳定输入层
- ✅ v0.8.4 正确性与可观测性 — 采样率一致性、mono 合同、丢样计数、类型桩。
- 🧪 v0.9 对话流式核心 — 已完成采集/VAD 与 Whisper 解耦、有界任务队列、final 优先、generation 取消、会话 reset,以及 backlog/drop/queue-wait/final-latency 指标;尚缺 whisper.cpp 在途计算中止与真实设备端点验证。
- v1.0 采用门槛 — 真实设备语料上的 WER、RTF、端点延迟、丢样基线;验证 wheel 矩阵;由 Open Voice Agent 通过稳定 provider 合同消费。
完整历史见 CHANGELOG.md。
📝 开发说明
主分支:master
代码规范
- C++20 标准
- Google C++ Style Guide(部分)
- 使用 clang-format 格式化
测试
已实现功能
AudioCaptureDevice - 音频采集器
- 基于 PortAudio 的跨平台音频捕获
- 实时流式采集(回调模式)
- 设备枚举和自动选择
- 低延迟配置(256 帧缓冲)
- 支持 mono/stereo
- 可配置采样率(默认 48kHz)
WavWriter - WAV 文件写入器
- 手写 RIFF/WAV 格式实现
- 支持 PCM 16-bit 音频
- 支持 mono/stereo
- 可调采样率
- 实时写入支持
FlacWriter - FLAC 无损压缩
- 基于 libFLAC 1.5.0
- 实时流式编码
- 可配置压缩级别(0-8,默认 5)
- 压缩比 1.5-3x(取决于音频内容)
- 支持 16/24-bit PCM
- 自动压缩比统计
SignalGenerator - 音频信号生成器
- 正弦波生成(可调频率、时长、振幅)
- 静音生成
- 白噪声生成
- 用于测试和调试
AudioProcessor - 音频处理框架
架构设计:
- 抽象接口
AudioProcessor支持模块化扩展 AudioProcessorChain处理器链(串联多个处理器)- 实时处理(在采集回调中)
- 就地处理(in-place)提高效率
VolumeNormalizer - 音量归一化:
- 基于 RMS 的自动增益控制
- 平滑增益调整(exponential moving average)
- Attack time: 0.1s(增益提升速度)
- Release time: 0.3s(增益下降速度)
- 目标电平:0.3(可配置 0.0-1.0)
- 增益范围:0.1x - 10.0x
- 防止削波和保持一致响度
HighPassFilter - 高通滤波器:
- 一阶 IIR 滤波器实现
- 去除低频噪声(呼吸声、麦克风碰撞、环境噪音)
- 默认截止频率:80Hz(可配置)
- 每通道独立状态(支持立体声)
- 滤波器公式:
y[n] = α(y[n-1] + x[n] - x[n-1])
RNNoiseProcessor - RNNoise 深度学习降噪 (可选):
- 基于 Xiph RNNoise 的 RNN 深度学习模型
- 专为语音优化的降噪算法
- 帧大小:480 samples (10ms @48kHz)
- 支持采样率:48kHz, 44.1kHz, 24kHz
- 多声道支持:每通道独立 DenoiseState
- 格式转换:自动处理 int16 ↔ float
- 帧缓冲管理:256 samples → 480 samples
- VAD 选项:可选语音活动检测(实验性)
- CPU 开销:~5-10%(显著低于 WebRTC APM)
- 降噪效果:~20dB(语音场景)
性能:
- 实时处理(<10ms 延迟)
- 低 CPU 开销(RNNoise: ~8%)
- 支持 mono/stereo
WhisperProcessor - 离线语音识别 (可选)
- 基于 OpenAI Whisper 的 C++ 实现 (whisper.cpp)
- 自动下载和集成 tiny 模型(39MB)
- 支持多种语言识别(中文、英文、自动检测)
- 音频格式自动转换(WAV/FLAC → 16kHz float mono)
- 四种输出格式:
- 纯文本(无时间戳)
- SRT 字幕(SubRip 格式)
- VTT 字幕(WebVTT 格式)
- JSON 转写(含分段级与词级时间戳 / per-segment & per-word timestamps)
- 词级时间戳(word-level timestamps):每个分段附带
words数组,每个词有独立的起止时间与概率(WhisperConfig::word_timestamps) - 性能指标(Apple M3 Pro, Rosetta 2):
- 转写速度:5-75x realtime(取决于音频长度)
- 内存占用:~272MB(模型 + 计算缓冲区)
- 准确率:英文 ~8-10% WER,中文 ~12-15% WER
- 推理线程数可配置(默认 4 线程)
- 可选翻译功能(转写 + 翻译成英文)
性能优化(v0.3.0 新增):
- Whisper 模型选择:
- 支持 TINY/BASE/SMALL/MEDIUM/LARGE 模型
- 灵活平衡速度与精度(10x → 0.5x realtime)
- 性能计时系统:
- 详细分段计时(转换/推理/提取)
- 实时因子 (RTF) 自动计算
- 性能瓶颈识别
- VAD 智能优化:
- 5 种灵敏度预设(VERY_SENSITIVE → VERY_CONSERVATIVE)
- 自适应阈值调整(根据环境噪声动态优化)
- 实时统计(平均 VAD 概率、语音占比)
- 内存优化:
- 缓冲区重用(减少 90% 内存分配)
- 条件扩容(避免不必要的 resize)
- 降低内存碎片化和 GC 压力
AudioConverter - 音频格式转换:
- WAV/FLAC 文件加载
- 采样率转换(48kHz/44.1kHz → 16kHz)
- 格式转换(int16 → float)
- 声道转换(stereo → mono)
- 线性插值重采样
SubtitleGenerator - 字幕生成:
- SRT 格式(
00:00:01,500时间戳格式) - VTT 格式(
00:00:01.500时间戳格式 + WEBVTT 头) - 纯文本格式(无时间戳)
- 自动时间戳格式化
测试覆盖
- 当前 296 个 C++ 单元测试 + 146 个 Python 测试,全部通过
- 覆盖音频采集 / 编码(WAV·FLAC)/ 处理(归一化·高通·RNNoise)/ VAD / Whisper ASR / 字幕生成 / LiveCaptioner / Diarizer / AudioMixer / RingBuffer
- C++ 用 Google Test,Python 用 pytest
- CI 矩阵覆盖 Linux / macOS / Windows × Python 3.10–3.14
🤝 贡献 / Contributing
我们欢迎并感谢所有形式的贡献!无论是报告 bug、提出新功能、改进文档还是提交代码,都对项目有很大帮助。
We welcome and appreciate all forms of contributions! Whether it's reporting bugs, proposing new features, improving documentation, or submitting code.
如何贡献 / How to Contribute
- 🐛 报告 Bug - 使用 Bug Report 模板
- ✨ 请求功能 - 使用 Feature Request 模板
- 📝 改进文档 - 提交 PR 改进 README、docs 或代码注释
- 💻 提交代码 - Fork → 开发 → 测试 → PR
开发指南 / Development Guide
详细的贡献指南请参阅 CONTRIBUTING.md
快速开始:
代码规范 / Code Style
- 语言: C++20
- 风格指南: Google C++ Style Guide(变体)
- 格式化工具: clang-format(配置见
.clang-format) - 静态分析: clang-tidy(配置见
.clang-tidy) - 提交规范: Conventional Commits
行为准则 / Code of Conduct
请遵守我们的 行为准则,营造友好和包容的社区环境。
Please follow our Code of Conduct to maintain a welcoming and inclusive community environment.
📊 项目状态 / Project Status
- ✅ Milestone 1: 基础音频采集和文件保存 - 完成
- ✅ Milestone 2: 音频处理增强 (RNNoise) - 完成
- ✅ Milestone 3: 离线语音识别 (Whisper ASR) - 完成
- ✅ Milestone 4: 实时语音识别 - 完成
- ✅ Milestone 5: 性能优化与增强 - 完成
- ✅ Milestone 6: 高级功能 (AudioMixer / RingBuffer / 词级时间戳 / JSON 字幕) - 完成
- ✅ 集成层路线图 (v0.8.3): Agent 集成 (CLI + MCP) / 实时字幕流 / 说话人分离 - 完成
详见 CHANGELOG.md
📞 支持与反馈 / Support & Feedback
- 📖 文档: docs/
- 💬 讨论: GitHub Discussions
- 🐛 Bug 报告: GitHub Issues
- 📧 联系: [email protected]
📄 许可证 / License
本项目采用 MIT 许可证 - 详见 LICENSE 文件。
This project is licensed under the MIT License - see the LICENSE file for details.
🙏 致谢 / Acknowledgments
感谢以下开源项目:
Thanks to the following open-source projects:
- FFmpeg - 多媒体处理框架
- PortAudio - 跨平台音频 I/O 库
- FLAC - 无损音频压缩
- whisper.cpp - OpenAI Whisper 的 C++ 实现
- RNNoise - 深度学习降噪库
- Google Test - C++ 测试框架
⭐ Star History
如果这个项目对你有帮助,请考虑给我们一个 ⭐ Star!
If this project helps you, please consider giving us a ⭐ Star!
Made with ❤️ by the ffvoice-engine team
Source: README.md at commit ca484f2
Tools
0Version history
1- v0.8.3LatestSep 16, 2026
Score
50% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
- Reached in the last 30 days25 pts
Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.
- Auth declared10 pts
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
- Tools listed15 pts
Answer tools/list without a credential, or ship a package that starts in a sandbox without one.
- DescriptionRequired15 pts
- Logo10 pts
- Documentation15 pts
- License10 pts

