[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-83846":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":15,"stars7d":16,"stars30d":16,"stars90d":15,"forks30d":15,"starsTrendScore":16,"compositeScore":17,"rankGlobal":10,"rankLanguage":10,"license":18,"archived":19,"fork":19,"defaultBranch":20,"hasWiki":21,"hasPages":19,"topics":22,"createdAt":10,"pushedAt":10,"updatedAt":23,"readmeContent":24,"aiSummary":10,"trendingCount":15,"starSnapshotCount":15,"syncStatus":13,"lastSyncTime":25,"discoverSource":26},83846,"zipEnhancer","gyj1201\u002FzipEnhancer","gyj1201","将 ZipEnhancer 模型从 ModelScope pipeline 中剥离，用纯 PyTorch 重新实现推理流程，并封装为高性能 FastAPI 批量语音降噪服务。","",null,"Python",59,2,1,0,8,1.43,"MIT License",false,"master",true,[],"2026-06-12 02:04:35","\u003Cdiv align=\"center\">\n\n\u003Cpre>\n ______       _____       _                               \n|__  (_)_ __ | ____|_ __ | |__   __ _ _ __   ___ ___ _ __ \n  \u002F \u002F| | '_ \\|  _| | '_ \\| '_ \\ \u002F _` | '_ \\ \u002F __\u002F _ \\ '__|\n \u002F \u002F_| | |_) | |___| | | | | | | (_| | | | | (_|  __\u002F |   \n\u002F____|_| .__\u002F|_____|_| |_|_| |_|\\__,_|_| |_|\\___\\___|_|   \n       |_|                                                \n\u003C\u002Fpre>\n\n\u003C\u002Fdiv>\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fpython-3.10-blue?style=flat-square&logo=python\" alt=\"Python 3.10\">\n  \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FFastAPI-0.115+-teal?style=flat-square&logo=fastapi\" alt=\"FastAPI\">\n  \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FPyTorch-2.0+-ee4c2c?style=flat-square&logo=pytorch\" alt=\"PyTorch\">\n  \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-MIT-green?style=flat-square\" alt=\"MIT License\">\n  \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FModelScope-达摩院-6240ff?style=flat-square\" alt=\"ModelScope\">\n\u003C\u002Fp>\n\n\n\n### 做了什么\n\n- **模型剥离** — 从 ModelScope 黑盒 pipeline 中提取出 ZipEnhancer，用原生 PyTorch 加载权重推理，不再依赖 pipeline 封装\n- **FP16 半精度推理** — 仅模型计算部分使用 FP16，STFT\u002FiSTFT 保持 FP32 避免 cuFFT 精度问题，显存占用降低 ~40%\n- **长音频分段** — 4s 滑动窗口 + 75% 重叠的 overlap-add 策略，支持任意时长音频，彻底解决 CUDA OOM\n- **多模型切换** — 同时支持 ZipEnhancer（轻量）、FRCRN（实时）、MossFormer2（高质）三种模型\n- **声道\u002F位深保持** — 立体声输入 → 立体声输出，32-bit float \u002F 16-bit PCM 自动适配\n\n### 它能做什么？\n\n- 清除录音中的**环境噪声**（空调声、风扇声、键盘声、街道噪音等）\n- 支持**单文件**和**批量处理**两种模式\n- 多种降噪模型**一键切换**\n- GPU 加速，实时率可达 **20x 以上**（RTX 4090）\n\n无需 ModelScope pipeline 黑盒，一行命令启动服务，适合集成到语音处理流程、会议录音后处理、音频预处理管道等场景。\n\n## 快速开始\n\n### 1. 创建虚拟环境\n\n```bash\nconda create -n zipenhancer python=3.10 -y\nconda activate zipenhancer\n```\n\n### 2. 安装依赖\n\n```bash\npip install -r requirements.txt\n```\n\nGPU 加速（NVIDIA 显卡，**先于上一步**安装 CUDA 版 PyTorch）：\n\n```bash\npip install torch torchaudio --index-url https:\u002F\u002Fdownload.pytorch.org\u002Fwhl\u002Fcu124\npip install -r requirements.txt\n```\n\n### 3. 配置\n\n复制 `.env.example` 为 `.env`，按需求修改：\n\n```bash\ncp .env.example .env\n```\n\n### 4. 启动\n\n```bash\nuvicorn app:app --host 0.0.0.0 --port 8765\n```\n\n## API 接口\n\n### 健康检查\n\n```bash\ncurl http:\u002F\u002F127.0.0.1:8765\u002Fhealth\n```\n\n![健康检查](images\u002F健康检查.png)\n\n### 查看可用模型\n\n```bash\ncurl http:\u002F\u002F127.0.0.1:8765\u002Fmodels\n```\n\n![查看可用模型](images\u002F查看可用模型.png)\n\n### 语音降噪（单个文件）\n\n上传音频文件，指定输出文件夹，降噪后的文件自动保存到该目录。\n\n```bash\ncurl -X POST http:\u002F\u002F127.0.0.1:8765\u002Fdenoise ^\n  -F \"file=@input.wav\" ^\n  -F \"output_dir=.\u002Foutput\" ^\n  -F \"output_format=mp3\" ^\n  -F \"bitrate=192k\"\n```\n\n**参数说明：**\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `file` | 是 | 音频文件（wav\u002Fmp3\u002Fm4a\u002Fflac\u002Fogg） |\n| `output_dir` | 是 | 输出文件夹路径 |\n| `model` | 否 | 模型名称（默认 .env 中配置） |\n| `normalize` | 否 | 是否自动音量归一化（默认 true） |\n| `target_sr` | 否 | 输出采样率，0=保持原始采样率（默认 0） |\n| `output_format` | 否 | 输出格式: wav \u002F flac \u002F mp3 \u002F ogg（默认 wav） |\n| `bitrate` | 否 | 比特率，仅 mp3\u002Fogg，如 \"192k\" |\n| `compression_level` | 否 | 压缩级别，仅 flac (0-8) |\n\n**返回结果：**\n\n```json\n{\n  \"code\": 0,\n  \"message\": \"success\",\n  \"data\": {\n    \"output_path\": \".\u002Foutput\u002Finput_denoised.mp3\",\n    \"sample_rate\": 48000,\n    \"output_format\": \"mp3\",\n    \"output_subtype\": \"mp3_mf\",\n    \"bitrate\": \"192k\",\n    \"compression\": null,\n    \"processing_time\": \"0.62s\",\n    \"real_time_factor\": \"22.0x\",\n    \"model\": \"iic\u002Fspeech_zipenhancer_ans_multiloss_16k_base\"\n  }\n}\n```\n\n![音频降噪](images\u002F音频降噪.png)\n\n### 语音降噪（批量处理）\n\n扫描输入文件夹中的所有音频文件，逐个降噪并保存到输出文件夹。\n\n```bash\ncurl -X POST http:\u002F\u002F127.0.0.1:8765\u002Fdenoise\u002Fbatch ^\n  -F \"input_dir=.\u002Finput_folder\" ^\n  -F \"output_dir=.\u002Foutput_folder\"\n```\n\n**参数说明：**\n\n| 参数 | 必填 | 说明 |\n|------|------|------|\n| `input_dir` | 是 | 输入文件夹路径 |\n| `output_dir` | 是 | 输出文件夹路径 |\n| `model` | 否 | 模型名称（默认 .env 中配置） |\n| `normalize` | 否 | 是否自动音量归一化（默认 true） |\n| `target_sr` | 否 | 输出采样率，0=保持原始采样率（默认 0） |\n| `output_format` | 否 | 输出格式: wav \u002F flac \u002F mp3 \u002F ogg（默认 wav） |\n| `bitrate` | 否 | 比特率，仅 mp3\u002Fogg，如 \"192k\" |\n| `compression_level` | 否 | 压缩级别，仅 flac (0-8) |\n\n**返回结果：**\n\n```json\n{\n  \"code\": 0,\n  \"message\": \"success\",\n  \"data\": {\n    \"input_dir\": \".\u002Finput_folder\",\n    \"output_dir\": \".\u002Foutput_folder\",\n    \"total\": 10,\n    \"success\": 10,\n    \"failed\": 0,\n    \"total_time\": \"5.23s\",\n    \"model\": \"iic\u002Fspeech_zipenhancer_ans_multiloss_16k_base\",\n    \"output_format\": \"flac\",\n    \"results\": [\n      {\n        \"filename\": \"audio1.wav\",\n        \"output_path\": \".\u002Foutput_folder\u002Faudio1_denoised.flac\",\n        \"sample_rate\": 48000,\n        \"output_format\": \"flac\",\n        \"output_subtype\": \"PCM_16\",\n        \"compression\": 5,\n        \"processing_time\": \"0.52s\",\n        \"real_time_factor\": \"28.0x\",\n        \"status\": \"success\"\n      }\n    ]\n  }\n}\n```\n\n### 输出格式说明\n\n输出文件会尽可能保留原始音频的参数：\n- **采样率**：默认与原始文件一致（传 `target_sr` 可覆盖）\n- **声道数**：立体声输入 → 立体声输出，单声道输入 → 单声道输出\n- **位深**：32-bit float 输入 → 32-bit float 输出，16-bit → 16-bit\n- **输出格式**：可通过 `output_format` 参数选择\n\n#### 格式支持矩阵\n\n| 格式 | 编码选项 | 压缩率参考 | 依赖 |\n|------|---------|-----------|------|\n| WAV | PCM_16 \u002F PCM_24 \u002F PCM_32 \u002F FLOAT | 无损（基准） | soundfile |\n| FLAC | PCM_16 \u002F PCM_24，compression 0-8 | ~40-60% | soundfile |\n| MP3 | 32-320 kbps | ~15-25% | ffmpeg |\n| OGG Opus | 6-510 kbps | ~15-25% | ffmpeg |\n\n> 压缩率参考基于 48kHz 16-bit 单声道音频，实际因内容而异。\n> MP3\u002FOGG 依赖 ffmpeg，系统未安装时将返回错误。\n> FLAC 输出时不支持的编码（FLOAT\u002FDOUBLE\u002FPCM_32）自动降级为 PCM_16。\n\n### 切换模型\n\n```bash\ncurl -X POST http:\u002F\u002F127.0.0.1:8765\u002Fdenoise ^\n  -F \"file=@input.wav\" ^\n  -F \"output_dir=.\u002Foutput\" ^\n  -F \"model=iic\u002Fspeech_frcrn_ans_cirm_16k\"\n```\n\n## 可用模型\n\n| 模型 ID | 说明 |\n|---------|------|\n| `iic\u002Fspeech_zipenhancer_ans_multiloss_16k_base` | ZipEnhancer（轻量） |\n| `iic\u002Fspeech_frcrn_ans_cirm_16k` | FRCRN（实时降噪） |\n| `iic\u002Fspeech_mossformer2_ans_48k` | MossFormer2（高质量） |\n\n## Roadmap\n\n### 已完成\n- [x] 单文件语音降噪\n- [x] 批量文件语音降噪\n- [x] 多模型切换（ZipEnhancer \u002F FRCRN \u002F MossFormer2）\n- [x] 音量归一化\n- [x] 自定义输出采样率\n- [x] 声道\u002F位深保持\n- [x] FP16 半精度推理\n\n### 计划中\n\n#### P0 — 短期（5-8 周）\n- [x] 输出格式选择（WAV \u002F MP3 \u002F FLAC \u002F OGG，编码参数可配）\n- [ ] 输入音频信息预览（波形峰值、LUFS 响度、削波检测、完整性校验）\n- [ ] 降噪强度控制（频域 Dry\u002FWet Mix，0~100% 可调）\n\n### P1 — 中期（4-6 个月）\n- [ ] Noise Gate（Attack \u002F Release \u002F Hold \u002F Hysteresis \u002F Look-ahead）\n- [ ] 残差监听（延迟对齐 + 位深统一，输出原始与降噪的差值信号）\n- [ ] 频段选择降噪（Linkwitz-Riley 分频，各频段独立降噪强度）\n- [ ] VAD 自动静音切除（Silero VAD + 状态机 + 自适应阈值 + Cross-fade 拼接）\n\n### P2 — 中后期（5-7 个月）\n- [ ] CLI 命令行工具（多命令、管道、进度条、配置文件）\n- [ ] Docker 一键部署（多阶段构建、GPU 直通、健康检查、优雅关闭）\n- [ ] 噪声轮廓学习（基于 VAD 的自适应谱减法后处理、音乐噪声抑制）\n- [ ] 质量评估指标（PESQ \u002F STOI \u002F Si-SNR \u002F DNSMOS，离线评测管线）\n- [ ] 音频格式转换（ffmpeg 封装，格式兼容矩阵，元数据透传）\n\n### P3 — 长期\n- [ ] 异步任务 + 进度查询（2-3 个月，任务持久化、队列调度、Worker 池、Webhook）\n- [ ] Web UI 界面（3-4 个月，拖拽上传 + 波形\u002F频谱可视化 + 在线试听 + Before\u002FAfter 对比）\n- [ ] 去混响（4-8 个月，WPE + DNN，场景分类 + 参数矩阵）\n- [ ] 实时流式降噪（4-8 个月，WebSocket + 因果模型 + Jitter Buffer + AEC）\n\n### 已评估放弃\n- ~~超分（低采样率 → 高采样率）~~ — 研究级难题，和降噪正交\n- ~~模型量化 int8~~ — 模型架构（自定义算子）不支持\n- ~~语音识别（ASR）~~ — 另一个产品领域\n- ~~说话人分离~~ — 重叠说话人问题当前无工业级开源方案\n\n\n## 项目结构\n\n```\n├── app.py                 # FastAPI 服务主程序\n├── log.py                 # 日志管理模块\n├── API.md                 # API 接口文档（含 curl 测试示例）\n├── pyproject.toml          # Python 包配置\n├── zipenhancer\u002F           # 降噪核心包\n│   ├── __init__.py\n│   ├── codec.py           # 音频编码模块（WAV\u002FFLAC\u002FMP3\u002FOGG）\n│   ├── denoise.py         # 降噪核心函数\n│   ├── standalone.py      # 剥离版推理（纯 PyTorch）\n│   ├── models\u002F            # 模型架构\n│   │   ├── zipenhancer.py\n│   │   └── layers\u002F\n│   │       ├── generator.py\n│   │       ├── scaling.py\n│   │       ├── zipenhancer_layer.py\n│   │       └── zipformer.py\n│   └── configs\u002F\n│       ├── configuration.json\n│       └── train_config.json\n├── tests\u002F                 # 测试\n│   ├── conftest.py\n│   ├── test_codec.py\n│   ├── test_denoise.py\n│   ├── generate_test_data.py\n│   └── audio\u002F             # 测试音频文件\n├── images\u002F                # README 截图\n├── requirements.txt       # 依赖列表\n├── LICENSE                # MIT 开源许可证\n├── .env                   # 环境配置（不上传）\n├── .env.example           # 环境配置模板\n├── .gitignore             # Git 忽略规则\n├── README.md              # 使用文档\n└── logs\u002F                  # 日志输出目录\n    ├── app\u002F               # 全部日志\n    └── error\u002F             # 错误日志\n```\n\n## Credits\n\n- 降噪模型：[阿里达摩院 ZipEnhancer](https:\u002F\u002Fmodelscope.cn\u002Fmodels\u002Fiic\u002Fspeech_zipenhancer_ans_multiloss_16k_base)（Apache 2.0）\n- 模型提取参考：[boreas-l\u002FzipEnhancer](https:\u002F\u002Fgithub.com\u002Fboreas-l\u002FzipEnhancer)\n\n## License\n\n[MIT](LICENSE) © 2024 gao yi jun\n","2026-06-11 04:11:38","CREATED_QUERY"]