面向隐私保护的说话人匿名化(speaker anonymization)框架:在尽量保留语言内容与 可懂度的前提下,通过替换 / 扰动说话人音色来隐藏其身份。纯 Python 参考实现,离线优先, 核心只依赖 NumPy。
⚠️ 开发中(alpha),公开 API 可能仍会调整。
- 多种匿名化方法,统一接口、可自由串联:
mcadams—— McAdams 系数 LPC 极点角度弯折(VoicePrivacy 基线思路);vtln—— 基于双线性频率弯折的共振峰变换;pitch—— 相位声码器整体变调(保持时长);modulation—— 平滑随机谱包络扰动。
- 隐私评测:说话人嵌入 + ASV 打分、等错误率(EER)、全局可链接性 D_sys / D_max。
- 可懂度评测:MCD、对数谱距离(LSD)、短时可懂度代理、对数梅尔包络相关。
- 零外部数据:内置源-滤波器合成语音,可离线跑通全流程与全部示例。
- 纯 NumPy 内核:无需 PyTorch / librosa / SciPy;STFT、LPC、相位声码器均自带实现。
- 完整类型标注,
ruff+mypy严格检查,测试覆盖率 > 90%。
pip install voxhush # 从源码:pip install -e ".[dev]"要求 Python ≥ 3.10。
import numpy as np
from voxhush import anonymize, read_wav, write_wav
from voxhush.metrics import mel_cepstral_distortion, verification_score
wav, sr = read_wav("speaker.wav")
# 用 McAdams 系数匿名化
anon = anonymize(wav, sr, method="mcadams", mcadams=0.8)
write_wav("speaker_anon.wav", anon, sr)
# 隐私:原始与匿名语音的说话人相似度(越低越难链接回本人)
print("ASV 相似度:", verification_score(wav, anon, sr))
# 可懂度 / 内容保持:梅尔倒谱失真(越低越接近)
print("MCD:", mel_cepstral_distortion(wav, anon, sr))串联多种方法:
from voxhush import AnonymizationPipeline
pipe = AnonymizationPipeline.from_names(["mcadams", "pitch"])
anon = pipe(wav, sr)voxhush info # 版本与可用方法
voxhush demo -o demo.wav --method mcadams # 合成一段语音并匿名化(无需数据)
voxhush anonymize in.wav -o out.wav --method vtln --alpha 0.1
voxhush evaluate --original in.wav --anonymized out.wav大多数方法遵循「分析—扰动—重建」范式:先把语音分解为声道 / 谱包络与激励,
只对承载说话人身份的谱包络做变换(如 McAdams 弯折 LPC 极点角度),再重建波形。
由于激励(承载基频与时序)与语言内容大体保留,可懂度得以维持。详见
docs/architecture.md 与 docs/design-notes.md。
隐私与可懂度往往此消彼长。voxhush 用两组离线指标量化这一权衡:
| 维度 | 指标 | 方向 |
|---|---|---|
| 隐私 | ASV 相似度、EER、可链接性 D_sys | 相似度 / D_sys 越低越好,EER 越接近 0.5 越好 |
| 可懂度 | MCD、LSD、可懂度代理 | MCD / LSD 越低越好,代理越高越好 |
MIT © Qin Muyan