Skip to main content

High-performance offline speech recognition library for Python

Project description

ffvoice-engine

CI Release

License: MIT C++20 CMake

Platform macOS Linux Windows

PyPI version Python versions GitHub release GitHub stars GitHub forks

FFmpeg PortAudio FLAC Whisper

Code Style PRs Welcome

🎙️ 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 installcmake 即可完成。

Pain points it addresses / 解决的痛点

Pain point ffvoice approach
Privacy / 隐私合规 — audio must not leave the device (GDPR, HIPAA, enterprise policy) 100% offline; audio never transmitted
Cloud cost / 云端费用 — commercial APIs charge per minute ($0.01–0.024/min at scale) Zero per-minute cost; runs on your own hardware
Glue code / 胶水代码 — wiring PortAudio + RNNoise + VAD + whisper.cpp + FLAC yourself takes days All wired together and tested; one SDK
Offline / 断网场景 — embedded systems, air-gapped environments, poor connectivity Fully offline; no network dependency
Low latency / 低延迟 — cloud round-trips add 200–800ms per request Local inference; < 100ms capture latency

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 费用
  • 低延迟 - 本地处理,<100ms 音频采集延迟
  • 开源免费 - MIT 协议,可商用

vs FFmpeg 命令行:

  • 实时转写 - 边录边识别,支持 VAD 智能分段
  • AI 降噪 - 集成 RNNoise 深度学习降噪
  • C++ SDK - 可嵌入任何 C++ 应用,非黑盒工具

vs Python 方案(whisper-cli):

  • 高性能 - C++20 实现,比 Python 快 3-10x
  • 低内存 - 单进程 <500MB(含 Whisper tiny 模型)
  • 易部署 - 单一可执行文件,无 Python 环境依赖

💡 技术亮点

  • 🚀 零拷贝处理链 - 音频数据在内存中就地处理
  • 🧠 智能 VAD 分段 - 基于 RNNoise VAD 的语音活动检测
  • 🎯 高压缩比 - FLAC 无损压缩 2-3x,质量无损
  • whisper.cpp 加速 - 推理速度 5-75x realtime(M2/M3)

核心特性

  • 实时音频采集 - 低延迟麦克风/系统声音捕获 (PortAudio)
  • 多格式输出 - WAV、FLAC 无损压缩
  • 音频增强处理 - 音量归一化、高通滤波、RNNoise 降噪
  • 离线语音识别 - Whisper ASR (tiny model,纯文本/SRT/VTT/JSON 四种格式,含词级时间戳)
  • 实时字幕流 - LiveCaptioner 双线程模型,partial/final 字幕事件,边说边出字
  • 说话人分离 - Diarizer 离线 diarization(sherpa-onnx),自动标注"谁在何时说话"
  • Agent 集成 - CLI + MCP server,AI agent 可直接调用本地离线语音能力

🏗️ 当前状态 (v0.8.2)

四个集成层路线图阶段全部交付,已发布到 PyPI(macOS / Linux / Windows,Python 3.10–3.14)。

能力 状态
音频采集 / WAV·FLAC 输出 / 音频增强(归一化·高通·RNNoise)
离线语音识别(Whisper ASR — 纯文本 / SRT / VTT / JSON,词级时间戳)
实时字幕流(LiveCaptioner — partial/final 字幕事件)
说话人分离(Diarizer — sherpa-onnx,可选 -DENABLE_DIARIZATION=ON
Agent 集成(CLI 硬化 + MCP server,5 个工具)
测试:311 C++ 单元测试 + 131 Python 测试,全部通过

完整历史见 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 安装

brew install cmake ffmpeg portaudio flac

Linux (Ubuntu/Debian) 安装

sudo apt-get install cmake build-essential \
  libavcodec-dev libavformat-dev libavutil-dev libswresample-dev \
  portaudio19-dev libflac-dev

Windows 安装

# 使用 vcpkg 管理 C++ 依赖
# 1. 克隆 vcpkg(如果还没有)
git clone https://github.com/Microsoft/vcpkg.git C:\vcpkg
C:\vcpkg\bootstrap-vcpkg.bat

# 2. 安装依赖包
C:\vcpkg\vcpkg install ffmpeg:x64-windows portaudio:x64-windows libflac:x64-windows

# 3. 设置环境变量(用于 CMake)
set CMAKE_TOOLCHAIN_FILE=C:\vcpkg\scripts\buildsystems\vcpkg.cmake

# 注意:Windows 用户也可以直接使用 PyPI 的预编译 wheels(推荐)
# pip install ffvoice

编译

标准编译:

Linux/macOS:

mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j$(nproc)

Windows:

mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=C:\vcpkg\scripts\buildsystems\vcpkg.cmake
cmake --build . --config Release

启用 RNNoise 降噪 (推荐,自动下载):

Linux/macOS:

mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DENABLE_RNNOISE=ON
make -j$(nproc)
# RNNoise 库会通过 CMake FetchContent 自动下载和编译

Windows:

# 注意:Windows 版本禁用 RNNoise(MSVC 不支持 VLA)
# 使用其他音频处理选项替代

启用 Whisper 语音识别 (推荐,自动下载):

Linux/macOS:

mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DENABLE_WHISPER=ON
make -j$(nproc)
# whisper.cpp 和 tiny 模型(39MB)会自动下载

Windows:

mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DENABLE_WHISPER=ON -DCMAKE_TOOLCHAIN_FILE=C:\vcpkg\scripts\buildsystems\vcpkg.cmake
cmake --build . --config Release

启用所有可选功能 (Linux/macOS):

cmake .. -DCMAKE_BUILD_TYPE=Release \
  -DENABLE_RNNOISE=ON \
  -DENABLE_WHISPER=ON
make -j$(nproc)

使用

注意:

  • Linux/macOS: 使用 ./build/ffvoice
  • Windows: 使用 .\build\Release\ffvoice.exe
# 查看帮助
./build/ffvoice --help

# 生成测试 WAV 文件(440Hz A4 音符,3秒)
./build/ffvoice --test-wav test.wav

# 列出可用音频设备
./build/ffvoice --list-devices

# 录制 10 秒 WAV 音频(默认格式)
./build/ffvoice --record -o recording.wav -t 10

# 录制 30 秒 FLAC 音频(无损压缩)
./build/ffvoice --record -o recording.flac -t 30

# 使用最大压缩级别录制 FLAC
./build/ffvoice --record -o recording.flac --compression 8 -t 60

# 选择特定设备录制立体声
./build/ffvoice --record -d 1 -o stereo.wav --channels 2 -t 20

# 启用音频处理(音量归一化 + 高通滤波)
./build/ffvoice --record -o clean.wav --enable-processing -t 10

# 仅启用音量归一化
./build/ffvoice --record -o normalized.wav --normalize -t 10

# 自定义高通滤波频率(去除 100Hz 以下噪声)
./build/ffvoice --record -o filtered.flac --highpass 100 -t 20

# 组合:FLAC + 音频处理
./build/ffvoice --record -o studio.flac --normalize --highpass 80 -t 30

# RNNoise 深度学习降噪(推荐用于语音录制,仅 Linux/macOS)
./build/ffvoice --record -o clean.wav --rnnoise -t 10

# 完整处理链(高通 + RNNoise + 归一化,仅 Linux/macOS)
./build/ffvoice --record -o studio.flac --highpass 80 --rnnoise --normalize -t 30

# RNNoise + VAD (实验性,仅 Linux/macOS)
./build/ffvoice --record -o vad.wav --rnnoise-vad -t 20

# 播放录音
afplay recording.wav   # 或 recording.flac

# ==================== 语音识别(需启用 ENABLE_WHISPER) ====================

# 转写音频文件为纯文本
./build/ffvoice --transcribe recording.wav -o transcript.txt

# 生成 SRT 字幕文件
./build/ffvoice --transcribe recording.wav --format srt -o subtitles.srt

# 生成 VTT 字幕文件
./build/ffvoice --transcribe recording.wav --format vtt -o subtitles.vtt

# 生成 JSON 转写文件(含分段级与词级时间戳)
./build/ffvoice --transcribe recording.wav --format json -o transcript.json

# 指定语言(中文)
./build/ffvoice --transcribe recording.wav --language zh -o transcript_zh.txt

# 转写 FLAC 文件
./build/ffvoice --transcribe recording.flac --format srt -o subtitles.srt

# 完整工作流:录制 + 音频处理 + 转写
./build/ffvoice --record -o speech.flac --highpass 80 --rnnoise --normalize -t 30
./build/ffvoice --transcribe speech.flac --format srt -o speech.srt

# ==================== 实时语音识别(需启用 ENABLE_RNNOISE 和 ENABLE_WHISPER) ====================

# 边录边转写(实时模式)
./build/ffvoice --record -o speech.wav --rnnoise-vad --transcribe-live -t 60

# 实时转写 + 音频处理
./build/ffvoice --record -o speech.flac --rnnoise-vad --transcribe-live --highpass 80 --normalize -t 120

# ==================== 实时字幕流(需启用 ENABLE_WHISPER;LiveCaptioner) ====================

# 边说边出字幕:partial 字幕实时刷新,final 字幕断句落定
./build/ffvoice --record -o talk.wav --live-captions -t 60

# 调整 partial 字幕刷新间隔(毫秒)
./build/ffvoice --record -o talk.wav --live-captions --partial-interval 300 -t 60

# ==================== 说话人分离(需 -DENABLE_DIARIZATION=ON 构建) ====================

# 转写并标注说话人:每段带 speaker_id(JSON 输出可见)
./build/ffvoice --transcribe meeting.wav --diarize --format json -o meeting.json

# 指定说话人数量(默认自动判定)
./build/ffvoice --transcribe meeting.wav --diarize --num-speakers 2 --format srt -o meeting.srt

⚠️ 说话人分离适用边界:diarization 的 embedding 模型默认英文调优。中文或混合语言音频请改用内置的中英双语模型 —— 在 transcribe_file_with_diarization MCP 工具(或 make_diarizer)传 embedding="multilingual",首次使用自动下载。已知说话人数时请传 --num-speakers N,自动判定数量在多说话人场景不够稳。

🐍 Python Bindings

ffvoice 提供高性能的 Python 绑定,让您在 Python 中轻松使用所有功能。

安装

从 PyPI 安装 (推荐):

pip install ffvoice                    # 核心:转写 / VAD / 采集 / 混音
pip install 'ffvoice[mcp]'             # + MCP server(供 AI agent 调用)
pip install 'ffvoice[diarization]'     # + 说话人分离(零编译、全平台)

💡 说话人分离免编译:[diarization] extra 经 sherpa-onnx 提供 diarization,无需从源码构建 ONNX Runtime;Whisper 与 diarization 模型在首次使用时自动下载到 ~/.cache/ffvoice/,无需手动配置。

从源码安装:

git clone https://github.com/chicogong/ffvoice-engine.git
cd ffvoice-engine
pip install .

平台兼容性

平台 PyPI Wheel 安装方式 状态
🍎 Apple Silicon (M1/M2/M3) ✅ ARM64 pip install ffvoice ✅ 原生支持
🍎 Intel Mac ❌ 不兼容 从源码编译 ⚠️ 需手动构建
🐧 Linux x86_64 ✅ x86_64 pip install ffvoice ✅ 原生支持
🪟 Windows x86_64 ✅ x86_64 pip install 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 不兼容,需要从源码编译:
    # 确保已安装依赖
    brew install cmake ffmpeg portaudio flac
    
    # 从源码安装
    git clone https://github.com/chicogong/ffvoice-engine.git
    cd ffvoice-engine
    pip install .
    
  • Rosetta 2 用户: ARM64 wheel 在 Rosetta 环境下不工作,请使用 ARM64 原生 Python:
    # 检查 Python 架构
    python -c "import platform; print(platform.machine())"
    # 应该输出 'arm64',如果是 'x86_64' 则需要重新安装 ARM64 Python
    
    # 强制使用 ARM64 Python
    arch -arm64 python3 -m pip install ffvoice
    

快速示例

import ffvoice
import numpy as np

# 1. 语音识别
config = ffvoice.WhisperConfig()
config.model_type = ffvoice.WhisperModelType.TINY
asr = ffvoice.WhisperASR(config)
asr.initialize()

# 从文件转写
segments = asr.transcribe_file("audio.wav")
for seg in segments:
    print(f"[{seg.start_ms}ms - {seg.end_ms}ms] {seg.text}")

# 从 NumPy 数组转写
audio = np.zeros(48000, dtype=np.int16)  # 1秒音频
segments = asr.transcribe_buffer(audio)

# 2. 噪声抑制
rnnoise = ffvoice.RNNoise(ffvoice.RNNoiseConfig())
rnnoise.initialize(sample_rate=48000, channels=1)

audio = np.random.randint(-1000, 1000, 256, dtype=np.int16)
rnnoise.process(audio)  # 原地处理
vad_prob = rnnoise.get_vad_probability()

# 3. 实时音频采集
def audio_callback(audio_array):
    print(f"收到 {len(audio_array)} 个采样")

ffvoice.AudioCapture.initialize()
capture = ffvoice.AudioCapture()
capture.open(sample_rate=48000, channels=1, frames_per_buffer=256)
capture.start(audio_callback)
# ... 录制中 ...
capture.stop()
capture.close()
ffvoice.AudioCapture.terminate()

# 4. 多音轨混音
mixer = ffvoice.AudioMixer()
mixer.initialize(sample_rate=48000, channels=2)
track = mixer.add_track(gain=1.0, pan=0.0)
mixed = mixer.mix_block({track: np.zeros(480, dtype=np.int16)})

# 5. 无锁环形缓冲区(实时音频路径的线程间交接)
ring = ffvoice.RingBuffer(capacity=4096)
ring.push_bulk(np.zeros(1024, dtype=np.int16))
chunk = ring.pop_bulk(512)

# 6. 词级时间戳
config.word_timestamps = True  # 转写结果的每个分段附带 words 数组
for seg in asr.transcribe_file("audio.wav"):
    for word in seg.words:
        print(f"  [{word.start_ms}-{word.end_ms}ms] {word.text}")

完整文档

详细文档和示例请查看 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)能够直接调用本地离线语音识别能力,全程无需联网,音频数据绝不离开本机

安装

pip install 'ffvoice[mcp]'                # MCP server
pip install 'ffvoice[mcp,diarization]'    # + 说话人分离工具

提供的工具

工具 说明
transcribe_file 转写本地音频文件(WAV/FLAC 等),支持语言选择、模型大小、词级时间戳
transcribe_file_with_diarization 转写并标注说话人 —— 每段带 speaker_id,回答"谁在何时说什么"(需 pip install 'ffvoice[diarization]',免编译)
capture_and_transcribe 录制指定时长的麦克风音频并实时转写(内置 VAD 分段 + 可选 RNNoise 降噪)
capture_and_caption 录制麦克风音频并产出实时字幕流(LiveCaptioner,partial/final 事件)
list_audio_devices 列出所有可用的音频输入/输出设备及默认设备 ID

接入 Claude Desktop

将以下配置粘贴到 Claude Desktop 的 claude_desktop_config.json

{"mcpServers": {"ffvoice": {"command": "ffvoice-mcp", "args": []}}}

重启 Claude Desktop 后,即可在对话中直接请求转写本地音频或录制语音。

Claude Agent Skill

仓库内置一个 Claude Agent Skill(.claude/skills/ffvoice-transcription/)—— 用 Claude Code 打开本仓库即被自动发现,无需任何配置。它教 agent 何时、如何用 ffvoice 的 MCP 工具与 CLI 完成转写、说话人分离、实时字幕。配合 MCP server,ffvoice 对 AI agent 真正做到开箱即用。

📁 项目结构

ffvoice-engine/
├── CMakeLists.txt          # 主构建文件
├── include/ffvoice/        # 公共头文件
│   └── types.h             # 核心类型定义
├── src/                    # 源代码
│   ├── audio/              # 音频采集与处理模块
│   │   ├── audio_capture_device.* # ✅ PortAudio 采集器
│   │   ├── audio_mixer.*          # ✅ 多音轨混音器
│   │   ├── audio_processor.*      # ✅ 音频处理框架
│   │   ├── rnnoise_processor.*    # ✅ RNNoise 深度学习降噪 (可选)
│   │   ├── vad_segmenter.*        # ✅ VAD 音频分段器
│   │   ├── whisper_processor.*    # ✅ Whisper ASR 语音识别 (可选)
│   │   ├── live_captioner.*       # ✅ 实时字幕流 LiveCaptioner (可选)
│   │   └── diarizer.*             # ✅ 说话人分离 Diarizer (可选)
│   ├── media/              # 媒体编码/封装
│   │   ├── wav_writer.*    # ✅ WAV 文件写入器
│   │   └── flac_writer.*   # ✅ FLAC 无损压缩
│   └── utils/              # 工具类
│       ├── signal_generator.* # ✅ 音频信号生成
│       ├── ring_buffer.*   # ✅ 环形缓冲区
│       ├── audio_converter.*  # ✅ 音频格式转换
│       ├── subtitle_generator.* # ✅ 字幕生成(SRT/VTT)
│       └── logger.*        # ✅ 日志工具
├── apps/cli/               # CLI 应用
│   └── main.cpp            # ✅ 完整录音功能
├── tests/                  # 单元测试
│   ├── unit/               # ✅ 311 个测试用例(全部通过)
│   ├── mocks/              # Mock 对象
│   └── fixtures/           # 测试夹具
├── models/                 # AI 模型文件
└── scripts/                # 辅助脚本

🛣️ 路线图

Milestone 1–6 —— 基础录制 → 音频增强(RNNoise) → 离线 ASR(Whisper) → 实时 ASR → 性能优化 → AudioMixer / RingBuffer / 词级时间戳 —— ✅ 全部完成。

集成层路线图(v0.8.2)—— 四个阶段全部交付:

  • 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 + MCP transcribe_file_with_diarization

完整历史见 CHANGELOG.md

📝 开发说明

主分支:master

代码规范

  • C++20 标准
  • Google C++ Style Guide(部分)
  • 使用 clang-format 格式化

测试

# 配置并编译测试
cmake .. -DBUILD_TESTS=ON -DCMAKE_BUILD_TYPE=Debug
make -j4

# 运行所有测试
make test

# 运行单个测试(详细输出)
./build/tests/ffvoice_tests --gtest_filter=WavWriter*

已实现功能

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 头)
  • 纯文本格式(无时间戳)
  • 自动时间戳格式化

测试覆盖

  • 311 个 C++ 单元测试 + 131 个 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

  1. 🐛 报告 Bug - 使用 Bug Report 模板
  2. 请求功能 - 使用 Feature Request 模板
  3. 📝 改进文档 - 提交 PR 改进 README、docs 或代码注释
  4. 💻 提交代码 - Fork → 开发 → 测试 → PR

开发指南 / Development Guide

详细的贡献指南请参阅 CONTRIBUTING.md

快速开始:

# 1. Fork 并克隆仓库
git clone https://github.com/YOUR_USERNAME/ffvoice-engine.git

# 2. 创建功能分支
git checkout -b feature/your-feature-name

# 3. 进行开发并测试
cmake -B build -DBUILD_TESTS=ON
make -C build -j$(nproc)
make -C build test

# 4. 格式化代码
./scripts/format.sh

# 5. 提交并推送
git commit -m "feat: add your feature"
git push origin feature/your-feature-name

# 6. 创建 Pull Request

代码规范 / 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.2): Agent 集成 (CLI + MCP) / 实时字幕流 / 说话人分离 - 完成

详见 CHANGELOG.md


📞 支持与反馈 / Support & Feedback


📄 许可证 / 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:


⭐ Star History

如果这个项目对你有帮助,请考虑给我们一个 ⭐ Star!

If this project helps you, please consider giving us a ⭐ Star!

Star History Chart


Made with ❤️ by the ffvoice-engine team

⬆️ Back to Top

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ffvoice-0.8.3.tar.gz (144.6 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

ffvoice-0.8.3-cp314-cp314-win_amd64.whl (720.4 kB view details)

Uploaded CPython 3.14Windows x86-64

ffvoice-0.8.3-cp314-cp314-manylinux_2_39_x86_64.whl (2.5 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.39+ x86-64

ffvoice-0.8.3-cp314-cp314-macosx_11_0_arm64.whl (679.8 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

ffvoice-0.8.3-cp313-cp313-win_amd64.whl (699.7 kB view details)

Uploaded CPython 3.13Windows x86-64

ffvoice-0.8.3-cp313-cp313-manylinux_2_39_x86_64.whl (2.5 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.39+ x86-64

ffvoice-0.8.3-cp313-cp313-macosx_11_0_arm64.whl (679.2 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

ffvoice-0.8.3-cp312-cp312-win_amd64.whl (699.6 kB view details)

Uploaded CPython 3.12Windows x86-64

ffvoice-0.8.3-cp312-cp312-manylinux_2_39_x86_64.whl (2.5 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.39+ x86-64

ffvoice-0.8.3-cp312-cp312-macosx_11_0_arm64.whl (679.2 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

ffvoice-0.8.3-cp311-cp311-win_amd64.whl (697.9 kB view details)

Uploaded CPython 3.11Windows x86-64

ffvoice-0.8.3-cp311-cp311-manylinux_2_39_x86_64.whl (2.5 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.39+ x86-64

ffvoice-0.8.3-cp311-cp311-macosx_11_0_arm64.whl (678.2 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

ffvoice-0.8.3-cp310-cp310-win_amd64.whl (697.2 kB view details)

Uploaded CPython 3.10Windows x86-64

ffvoice-0.8.3-cp310-cp310-manylinux_2_39_x86_64.whl (2.5 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.39+ x86-64

ffvoice-0.8.3-cp310-cp310-macosx_11_0_arm64.whl (677.1 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

File details

Details for the file ffvoice-0.8.3.tar.gz.

File metadata

  • Download URL: ffvoice-0.8.3.tar.gz
  • Upload date:
  • Size: 144.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.15

File hashes

Hashes for ffvoice-0.8.3.tar.gz
Algorithm Hash digest
SHA256 d993d07264264400c9f0fa9a1ec5eb2d430f0ec128e7a41b67e98a218a5aba50
MD5 073a03046245c0a35270af65c54d72c8
BLAKE2b-256 b6d961d649dd312681526443f3d69589d9e3ee12d2341dc54a7554dd2ab4e47a

See more details on using hashes here.

File details

Details for the file ffvoice-0.8.3-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: ffvoice-0.8.3-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 720.4 kB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.4

File hashes

Hashes for ffvoice-0.8.3-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 423bce2992000a3d81f86e9938559f37d10c7f26331ecd66b37ecbb151bc12db
MD5 5070d15d3c0cbb635e0a1e50957702b2
BLAKE2b-256 5594a0e49b0e037f4829525e286f5295a598a0a530000b50a7533fd68412ec4f

See more details on using hashes here.

File details

Details for the file ffvoice-0.8.3-cp314-cp314-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for ffvoice-0.8.3-cp314-cp314-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 b3ee80841b80b1006ea9e7d972a793c058286366f363c44374ca17fdd363bc63
MD5 6a05d1238a6e0db43e1f30d9bb25cd76
BLAKE2b-256 03aeeadb47828ee0a150147f044f4078ac7b46b13c127569eccdfcde221b2c53

See more details on using hashes here.

File details

Details for the file ffvoice-0.8.3-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for ffvoice-0.8.3-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c59b198f6d1d65fc5cb5ff897872fb846b2e409b5c7b81b94172b88287773c4b
MD5 ef2ef649520635fa2c996fb5f3cfa1a4
BLAKE2b-256 60e31fe5c9828a62259d27ad8015aac646256920d001ccb918f755bbfcd6e30e

See more details on using hashes here.

File details

Details for the file ffvoice-0.8.3-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: ffvoice-0.8.3-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 699.7 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.13

File hashes

Hashes for ffvoice-0.8.3-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 32a2ad657c32eb7a685e05f51d48663d2c99582ef9e4759da0c25baec2a06015
MD5 33826ea729d4e060a48afcf00aaf7357
BLAKE2b-256 9cd54c091fccad0fcd3f1d0dfa2b6f68dd8001e98823a93cddeb20eeb131b1ee

See more details on using hashes here.

File details

Details for the file ffvoice-0.8.3-cp313-cp313-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for ffvoice-0.8.3-cp313-cp313-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 39e347a0aac52165db83b896c12ab4edb22f3e76df5b7fdd06a42720a385968c
MD5 8f4efe94f8546b3a2170e77f1685443a
BLAKE2b-256 fabe10f24ba3a8dd9b6c900b65cda7dfe6d627d912268e56d9cf3d14a0f12c28

See more details on using hashes here.

File details

Details for the file ffvoice-0.8.3-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for ffvoice-0.8.3-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 01a84d16d903d5eb7cb2ad39eec7d74a517e2b8b6c8b72e70c29bc41b6938022
MD5 344cb6043c47e74204b2c3e98bf852d4
BLAKE2b-256 64212f3c9271243a3aed376a3456589b8d041799d5f746b798c319ae6ab5e0aa

See more details on using hashes here.

File details

Details for the file ffvoice-0.8.3-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: ffvoice-0.8.3-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 699.6 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.10

File hashes

Hashes for ffvoice-0.8.3-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 003ab29cf2d2930f4fe998122d1747162096c125be1e28a74f8d21a876df639d
MD5 8dfb3d753ec3d792503a4032f597a9b0
BLAKE2b-256 3e5ab4ac826e068e647275ae0263155913f79bde33927d103931a8ce4c6935ee

See more details on using hashes here.

File details

Details for the file ffvoice-0.8.3-cp312-cp312-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for ffvoice-0.8.3-cp312-cp312-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 eccd223088fd17391888be5049430ec275f61951d6a183baf54ae0759d4fc29b
MD5 23c8ec6357e43f76de631f9ac5cb2e88
BLAKE2b-256 90682854f5bd7ad1d0d0ad3a62a886a689185b1ad85dfaab2a5a31592aa17663

See more details on using hashes here.

File details

Details for the file ffvoice-0.8.3-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for ffvoice-0.8.3-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 428626a6a71103f2fa5c303d282d8a29ed272bf8ca74adc0a34cfef1d05c89e9
MD5 fda5a9d8fe45d24ebf9f6a1c289e7bb8
BLAKE2b-256 4a6abf54205b3df34794fc0627574251d42ddb0549b56e11c89b5ab0f0e40997

See more details on using hashes here.

File details

Details for the file ffvoice-0.8.3-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: ffvoice-0.8.3-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 697.9 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.9

File hashes

Hashes for ffvoice-0.8.3-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 17adcb98b91f115072c006eb32008d815417ec93460f139c856735bff5fd971d
MD5 02e103c5d8f1e3f80274bb420df9ae68
BLAKE2b-256 3ccf960b84496a9d53e812996cf33b2a8252c44e8ee85715301bec62593999a7

See more details on using hashes here.

File details

Details for the file ffvoice-0.8.3-cp311-cp311-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for ffvoice-0.8.3-cp311-cp311-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 0bfee5a8a7fd868288abe76bc43cef6d3a47d662d318aa9f1572c43080c89558
MD5 4f67cc6df1923601dc9ade1bdf48acb1
BLAKE2b-256 f5367ebee41da86bcfd712c27c03b7f39e5d980e104c614e139bd268fc961330

See more details on using hashes here.

File details

Details for the file ffvoice-0.8.3-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for ffvoice-0.8.3-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8751424fcdf1d80bbfa9fa05f214aa8cc59276cd053cd18ab7af6e6a6c0b6fe4
MD5 faf2eb72dc77b71c105d27aad91cafd8
BLAKE2b-256 c0988c93164dbdb85a338d59ac09b4afffadf7d907c14abccf5e0d206768d10e

See more details on using hashes here.

File details

Details for the file ffvoice-0.8.3-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: ffvoice-0.8.3-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 697.2 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.11

File hashes

Hashes for ffvoice-0.8.3-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 f0f25d9a95124fee61212a211ea1a3296e5159964332667650a4953f4feaf9b0
MD5 71e1122b7d12c1e22633240da511a9af
BLAKE2b-256 4400bcf5bcb026f55e9111c951e1bb4cc0b3131b99362f7d25f0adfd06f7bc09

See more details on using hashes here.

File details

Details for the file ffvoice-0.8.3-cp310-cp310-manylinux_2_39_x86_64.whl.

File metadata

File hashes

Hashes for ffvoice-0.8.3-cp310-cp310-manylinux_2_39_x86_64.whl
Algorithm Hash digest
SHA256 4dd53e4b844d69828322806932c6c16cf32d2db0ef7772fd8973428f7ed1778c
MD5 628592774560f9f89abf8909e89d9304
BLAKE2b-256 87339d65508842090ca3e00a8c456c6f1b078e10f074637c379237559fa80405

See more details on using hashes here.

File details

Details for the file ffvoice-0.8.3-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for ffvoice-0.8.3-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 66747eac20c98f094a2c2d9efa67f9457615aa72c0414d3ed35bd57752ad0213
MD5 a491663086c65b7296923ab1a50ad9e8
BLAKE2b-256 d69d440e35b645cb7c937666be4f311f91b23691e5a97586d1bbce0ece36b1a4

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page