Windows 桌面端实时变声器:游戏开黑、微信语音一键换声整蛊,纯本地、零延迟感、不上云。
- 11 种预设音色:男童、女童、男青年、女青年、大叔、阿姨、萝莉、东北女汉子、四川妹子、老爷爷、老奶奶
- 实时变声:传统 DSP 算法(基频 + 共振峰解耦),延迟 ≈35ms(< 50ms),CPU 占用低、无需显卡
- 自定义调音:11 个参数滑块实时调节(音高、共振峰、气声、混响、颤音、粗糙度、EQ 等)
- 音频导入克隆音色:导入一段语音(wav/mp3/flac),自动分析 F0/共振峰/谱质心/音色特征,生成对应调音参数
- 虚拟声卡路由:变声结果输出到 VB-CABLE 虚拟麦克风,游戏/微信里选它即可整蛊
- 自适应源音高:启动时自动估算你的声线(男/女源),让每个预设男女通用、听感一致
- 预设管理:内置预设只读,改动后可"另存为我的音色",本地持久化
| 项 | 要求 |
|---|---|
| 操作系统 | Windows 10 / 11(x64) |
| 声卡 | 自带麦克风即可;整蛊他人需额外安装 VB-CABLE 虚拟声卡 |
| 运行环境 | 已打包:无需 Python;源码运行:Python 3.11+(实测 3.13) |
双击 dist\VariableSound\VariableSound.exe 即可(单目录模式,启动快、无需解压)。
首次启动会弹出免责声明勾选;若未装 VB-CABLE 会引导你到官网下载。
# 1. 创建虚拟环境
python -m venv .venv
# 2. 安装依赖
.venv\Scripts\pip install -r requirements.txt
# 3. 运行
.venv\Scripts\python main.py- 插入麦克风,启动程序
- 在「设备区」选择 输入设备(你的真实麦克风)
- 输出设备选择
CABLE Input(VB-CABLE 虚拟声卡的输入端) - 点 启动变声
- 在音色卡片里点选一种预设(如「萝莉」「大叔」),实时试听
- 在 微信 / 游戏 的麦克风设置里,把输入设备选为
CABLE Output(VB-CABLE 虚拟声卡的输出端) - 开黑 / 语音,朋友听到的就是变声后的效果 😈
- 手动调音:选一个预设后,拖动参数滑块实时微调,点「另存为我的音色」保存
- 导入克隆:准备一段目标声音的音频(≤60s、纯人声最佳)→ 点「导入音频生成音色」→ 程序自动分析并生成调音参数 → 试听微调后保存
# 安装打包工具
.venv\Scripts\pip install pyinstaller
# 一键打包(等价于 python -m PyInstaller build.spec --noconfirm --clean)
build.bat产物:dist\VariableSound\(单目录模式,内含 VariableSound.exe + 依赖 DLL,启动快、无需每次解压)。
如需单文件便携版(一个 exe 发给朋友),把
build.spec末尾改回EXE(...)单文件写法即可(代价是每次启动需解压,冷启动慢几秒)。
VariableSound/
├── main.py # 入口:QApplication + 免责声明 + 主窗口
├── requirements.txt # 依赖清单(必需 + 可选降级)
├── build.spec / build.bat # PyInstaller 打包配置(单目录模式)
├── app/
│ ├── config.py # 全局常量(采样率/块/窗长/路径,单一来源)
│ ├── audio/ # 音频引擎、设备管理、环形缓冲
│ │ ├── engine.py # 实时音频流回调(线程安全)
│ │ ├── devices.py # 输入/输出设备枚举 + VB-CABLE 检测
│ │ └── ringbuffer.py # 波形/VU 显示缓冲
│ ├── dsp/ # 核心 DSP 算法层
│ │ ├── stft.py # 短时傅里叶变换(相位声码器)
│ │ ├── pitch_shifter.py # 变调(基频偏移)
│ │ ├── formant_shifter.py # 共振峰偏移(倒谱包络 warp,与基频解耦)
│ │ ├── voice_chain.py # 音效链(混响/气声/颤音/粗糙度/EQ)
│ │ ├── filters.py # biquad/comb/allpass 滤波器
│ │ └── f0_tracker.py # 基频估计(YIN)
│ ├── analysis/ # 音频导入特征提取
│ │ ├── preprocess.py # 预处理(重采样/VAD/降噪)
│ │ ├── feature_extractor.py # F0/共振峰/谱质心/HNR 提取(三级降级)
│ │ └── param_mapper.py # 特征 → 调音参数映射
│ ├── presets/ # 预设数据层
│ │ ├── models.py # VoiceParams 数据模型
│ │ ├── builtin.py # 11 种内置音色参数
│ │ └── preset_manager.py # 预设加载/保存
│ └── ui/ # PySide6 界面层
│ ├── main_window.py # 主窗口(四区布局 + 信号槽编排)
│ ├── preset_panel.py # 音色卡片网格
│ ├── param_panel.py # 调音滑块面板
│ ├── monitor_panel.py # 波形/频谱/VU 实时显示
│ ├── device_panel.py # 输入/输出设备选择
│ ├── import_dialog.py # 音频导入对话框
│ ├── disclaimer.py # 免责声明
│ ├── widgets.py # 自定义控件
│ └── styles.py # QSS 主题
├── tests/ # 测试(smoke / QA 独立 / 回调性能基准)
└── docs/ # PRD / 架构设计 / 类图 / 时序图(测试报告与诊断产物不入库)
- 变声算法:STFT 相位声码器(变调)+ 倒谱包络 warp(共振峰),单次 FFT 内完成,基频与共振峰天然解耦,避免"花栗鼠机器人音"
- 音频参数:48kHz / 单声道 / FFT=1024 / hop=256,算法延迟 ≈21.3ms,端到端 ≈35ms
- 线程安全:音频回调内零锁、零内存分配、零 Qt;参数经
Queue(maxsize=1)传递,显示经预分配 RingBuffer + 30Hz QTimer - 降级兜底:特征提取三级降级
pyworld → librosa → scipy,缺包/无设备/损坏文件均优雅降级不崩溃 - 11 预设:基频偏移(半音)+ 共振峰偏移(%)+ 目标 F0 中心 + 音效链参数,男女源自适应
| 项 | 结果 |
|---|---|
| QA 独立测试 | 22/22 通过,0 个 P0/P1 缺陷 |
| 变调精度 | +7 半音 → 1498.2Hz(误差 0.01%) |
| 共振峰-基频解耦 | 单独 warp 时 F0 不变、包络峰正确移动 |
| 回调实时性 | 最坏块耗时 1.34ms(预算 5.33ms) |
| 导入 F0 精度 | 误差 0.31% |
| 无削波/无爆音 | 11 预设全有限、块边界无跳变 |
详见 docs/test-report.md(本地文档,未随仓库分发)。
依据
docs/architecture-voicequality.md(v1.1)与docs/prd-voicequality.md。 消除「金属声 / 谐波稀疏 / 空洞 / 鼻音」并新增两档质量模式。
| 档位 | 帧长/步进 | 回调块 | 瞬态相位重置 | 多帧谐波平滑 | 适用 |
|---|---|---|---|---|---|
| 音质优先(默认) | 2048 / 512(75%) | 512 | 开 | 开 | 追求干净、少伪影 |
| 低延迟 | 2048 / 512(75%) | 256 | 开 | 关 | 追求更低延迟 |
- 两档均用 N=2048/H=512(男源谐波间噪声底达标前提),差异仅在回调块长与增强开关;
- 端到端延迟换算见质量看板(档位 / 延迟 / 谐波间噪声底);
- 档位写入
%APPDATA%\VariableSound\settings.json,下次启动自动恢复;切换失败自动回滚上一档,不会静音。
| 参数 | 范围 | 默认 | 说明 |
|---|---|---|---|
| 频谱迁移量(原名「共振峰偏移」) | −30%~+50% | 0 | 整体移动共振峰位置,与音高解耦 |
| 谱倾斜 | −6~+6 dB/oct | 0 | 绕 1kHz 旋转,更亮 / 更暗 |
| 谐波丰富度 | 0~100 | 50(中性) | 更丰满 / 更单薄 |
| 去咝声 | 0~100 | 0 | 衰减 5–10kHz 咝声(净高频提升硬夹 ≤ +2dB) |
| 冲劲 (presence) | −6~+6 dB | 0 | 2–5kHz 抬升,近似「偏前」 |
- 谐波保真:幅度与瞬时频率插值由线性改三次(Catmull–Rom),谐波间噪声底显著下降;
- 相位质量:新增瞬态相位重置(谱通量+能量双判据),消除宽带瞬态 pre-echo;
- 频谱迁移:倒谱包络 warp 改三次 + 能量归一化,抑制空洞;
- 音色塑形:新增 STFT 域塑形层(默认恒等,不生效,旧预设与旧 JSON 完全兼容);
- 响度对齐:逐预设静态增益(无压缩感/无泵动),补偿下移变调的固有损失。
- 可调:音高 / 频谱迁移量 / 频谱倾斜 / 谐波丰富度 / 去咝声 / 冲劲;
- 不可塑造:鼻音共振峰等复杂共振结构(
presence仅为 2–5kHz 近似抬升); - 旧版预设 JSON(缺新字段)加载后新参数取默认值(= 不生效),行为与升级前一致。
本软件仅供娱乐与学习用途。请勿用于冒充他人、诈骗、违法或侵犯他人合法权益的活动。使用本软件产生的一切后果由使用者自行承担。
本项目为个人娱乐项目,暂未选择开源许可证。