C# MP3 伴奏

使用建议:

  1. 参数调节指南

    • 低频人声残留:降低CenterFrequency(800-1500Hz)

    • 高频人声残留:提高CenterFrequency(2500-3500Hz)

    • 消除力度不足:提高EliminationStrength(0.9-1.0)

    • 伴奏失真:降低EliminationStrength(0.7-0.9) 并提高GainCompensation(1.3-1.5)

using System;
using System.IO;
using NAudio.Wave;
using NAudio.Lame;public class AudioConverter
{public event EventHandler<int> ProgressChanged;public event EventHandler ConversionCompleted;public float EliminationStrength { get; set; } = 0.95f;    // 消除强度 0-1public void ConvertToAccompaniment(string inputPath, string outputPath){try{if (!File.Exists(inputPath)){throw new FileNotFoundException($"输入文件未找到: {inputPath}");}using (var mp3Reader = new Mp3FileReader(inputPath)){var sampleProvider = mp3Reader.ToSampleProvider();var originalFormat = sampleProvider.WaveFormat;if (originalFormat.Channels != 2){throw new InvalidOperationException("仅支持立体声音频文件");}// 创建16位PCM格式var pcm16Format = new WaveFormat(originalFormat.SampleRate, 16, originalFormat.Channels);long totalBytes = mp3Reader.Length;long processedBytes = 0;using (var pcmMemoryStream = new MemoryStream()){WaveFileWriter wavWriter = null;try{wavWriter = new WaveFileWriter(new IgnoreDisposeStream(pcmMemoryStream), pcm16Format);float[] buffer = new float[originalFormat.SampleRate * originalFormat.Channels];int samplesRead;while ((samplesRead = sampleProvider.Read(buffer, 0, buffer.Length)) > 0){ProcessVocalRemoval(buffer, samplesRead);// 将浮点数组转换为16位PCM字节数组byte[] pcm16Bytes = new byte[samplesRead * 2]; // 每个样本占2字节for (int i = 0; i < samplesRead; i++){// 钳制值并转换为16位整数float sample = Math.Max(-1.0f, Math.Min(1.0f, buffer[i]));short pcmSample = (short)(sample * short.MaxValue);pcm16Bytes[i * 2] = (byte)(pcmSample);pcm16Bytes[i * 2 + 1] = (byte)(pcmSample >> 8);}wavWriter.Write(pcm16Bytes, 0, pcm16Bytes.Length);processedBytes += pcm16Bytes.Length;// 计算进度时可能需要调整总长度,此处假设totalBytes为PCM数据估算长度int percent = (int)((double)processedBytes / (totalBytes * 2) * 100);ProgressChanged?.Invoke(this, percent);}}finally{wavWriter?.Dispose();}pcmMemoryStream.Position = 0;// 使用16位PCM格式初始化LAME编码器using (var mp3Writer = new LameMP3FileWriter(outputPath, pcm16Format, LAMEPreset.VBR_90)){pcmMemoryStream.CopyTo(mp3Writer);}}ProgressChanged?.Invoke(this, 100);ConversionCompleted?.Invoke(this, EventArgs.Empty);}}catch (FileNotFoundException ex){Console.WriteLine($"文件未找到: {ex.FileName}");}catch (InvalidOperationException ex){Console.WriteLine($"处理错误: {ex.Message}");}catch (Exception ex){Console.WriteLine($"发生未知错误: {ex.Message}");}}private void ProcessVocalRemoval(float[] buffer, int samplesRead){for (int i = 0; i < samplesRead; i += 2){float left = buffer[i];float right = buffer[i + 1];float difference = (left - right) * EliminationStrength;buffer[i] = difference;buffer[i + 1] = difference;}}// 修正4:添加流包装器防止WaveFileWriter关闭底层流private class IgnoreDisposeStream : Stream{private readonly Stream _baseStream;public IgnoreDisposeStream(Stream baseStream) => _baseStream = baseStream;public override bool CanRead => _baseStream.CanRead;public override bool CanSeek => _baseStream.CanSeek;public override bool CanWrite => _baseStream.CanWrite;public override long Length => _baseStream.Length;public override long Position{get => _baseStream.Position;set => _baseStream.Position = value;}public override void Flush() => _baseStream.Flush();public override int Read(byte[] buffer, int offset, int count) => _baseStream.Read(buffer, offset, count);public override long Seek(long offset, SeekOrigin origin) => _baseStream.Seek(offset, origin);public override void SetLength(long value) => _baseStream.SetLength(value);public override void Write(byte[] buffer, int offset, int count) => _baseStream.Write(buffer, offset, count);protected override void Dispose(bool disposing){// 不关闭底层流}}
}

效果对比表

参数组合适用场景副作用
Strength=0.9, Freq=1500清晰人声消除可能损失部分低频伴奏
Strength=0.8, Freq=2500保留贝斯/鼓点高频人声可能有残留
Strength=1.0, Freq=800消除低沉男声可能产生金属感失真

注意事项

  1. 源音频质量直接影响效果,推荐使用无损音源

  2. 复杂音乐(如交响乐)可能需要分层处理

  3. 完全消除人声可能伴随伴奏损失,需平衡参数

如果需要进一步优化,可以考虑集成AI人声分离模型(如Spleeter),但这需要额外部署机器学习框架。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/80025.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大模型面经 | 春招、秋招算法面试常考八股文附答案(四)

大家好,我是皮先生!! 今天给大家分享一些关于大模型面试常见的面试题,希望对大家的面试有所帮助。 往期回顾: 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题一) 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题二) 大模型面经 | 春招、秋招算法…

Springboot 集成 RBAC 模型实战指南

RBAC 模型核心原理 详情可参考之前的笔记&#xff1a;https://blog.csdn.net/qq_35201802/article/details/146036789?spm1011.2415.3001.5331 RBAC 定义与优势 RBAC&#xff08;Role-Based Access Control&#xff0c;基于角色的访问控制&#xff09;** 是一种通过角色关联…

如何收集用户白屏/长时间无响应/接口超时问题

想象一下这样的场景:一位用户在午休时间打开某电商应用,准备购买一件心仪已久的商品。然而,页面加载了数秒后依然是一片空白,或者点击“加入购物车”按钮后没有任何反馈,甚至在结算时接口超时导致订单失败。用户的耐心被迅速消耗殆尽,关闭应用,转而选择了竞争对手的产品…

用户需求报告、系统需求规格说明书、软件需求规格说明的对比分析

用户需求报告、系统需求规格说明书&#xff08;SyRS&#xff09;和软件需求规格说明书&#xff08;SRS&#xff09;是需求工程中的关键文档&#xff0c;分别对应不同层次和视角的需求描述。以下是它们的核心区别对比&#xff1a; ​​1. 用户需求报告&#xff08;User Requirem…

iostat指令介绍

文章目录 1. 功能介绍2. 语法介绍3. 应用场景4. 示例分析 1. 功能介绍 iostat (input/output statistics)&#xff0c;是 Linux/Unix 系统中用于监控 CPU 使用率和 磁盘 I/O 性能的核心工具&#xff0c;可实时展示设备负载、吞吐量、队列状态等关键指标。 可以使用 man iostat查…

神经网络 “疑难杂症” 破解指南:梯度消失与爆炸全攻略(六)

引言 在神经网络的发展历程中&#xff0c;梯度消失和梯度爆炸如同两座难以翻越的大山&#xff0c;阻碍着深层神经网络发挥其强大的潜力。尤其是在处理复杂任务时&#xff0c;这两个问题可能导致模型训练陷入困境&#xff0c;无法达到预期的效果。本文将深入探讨梯度消失和梯度…

“多模态SCA+DevSecOps+SBOM风险情报预警 “数字供应链安全最佳管理体系!悬镜安全如何用AI守护万亿数字中国?

夜深人静&#xff0c;程序员青丝盯着屏幕上自动生成的代码模块陷入沉思。在AI大模型的加持下&#xff0c;仅用一周团队就完成了原本需要半年的开发进度&#xff0c;但代码审查时却发现了不少高危漏洞。“生成效率提升了&#xff0c;但安全漏洞像定时炸弹一样藏在代码里”&#…

Node.js简介(nvm使用)

Node.js是一个基于Chrome V8 JavaScript引擎构建的开源、跨平台JavaScript运行环境。它允许开发者在服务器端运行JavaScript代码&#xff0c;从而实现前后端统一的开发语言。Node.js具有事件驱动、非阻塞I/O模型&#xff0c;使其非常适合于构建高性能的网络应用。 Node.js不是…

PHP日志会对服务器产生哪些影响?

PHP日志是服务器运维中非常重要的一部分&#xff0c;但处理不当会对服务器产生明显的负面影响。下面我们从多个维度深入分析&#xff1a;PHP日志的作用、类型、对服务器的正面与负面影响&#xff0c;以及优化建议&#xff0c;让你全面掌握这一问题。 一、PHP日志是什么? PHP…

Spring AI Alibaba-02-多轮对话记忆、持久化消息记录

Spring AI Alibaba-02-多轮对话记忆、持久化消息记录 Lison <dreamlison163.com>, v1.0.0, 2025.04.19 文章目录 Spring AI Alibaba-02-多轮对话记忆、持久化消息记录多轮对话对话持久-Redis 本次主要聚焦于多轮对话功能的实现&#xff0c;后续会逐步增加更多实用内容&…

分别配置Github,Gitee的SSH链接

文章目录 前言一、为第二个账号生成新的密钥对二、 配置 SSH config 文件1.引入库使用 Host 别名进行 clone/push/pull注意扩展 前言 之前已经在电脑配置过Github一个仓库ssh链接&#xff0c;今天想配一个Gitee仓库的ssh链接。运行 ssh-keygen -t rsa提示已经存在&#xff0c…

Python 获取淘宝买家订单详情(buyer_order_detail)接口的详细指南

在电商运营中&#xff0c;订单详情数据是商家进行数据分析、客户服务和营销策略制定的重要依据。淘宝提供了 buyer_order_detail 接口&#xff0c;允许开发者获取买家的订单详情数据。本文将详细介绍如何使用 Python 调用该接口获取订单详情&#xff0c;并解析返回的数据。 一、…

C语言实战:用Pygame打造高难度水果消消乐游戏

水果消消乐 - 困难模式 以下是一个基于Python和Pygame的水果消消乐游戏实现&#xff0c;包含困难模式的特点&#xff1a; import pygame import random import sys from pygame.locals import *# 初始化 pygame.init() pygame.mixer.init()# 游戏常量 FPS 60 WINDOW_WIDTH …

Doris-BrokerLoad任务监控

BrokeLoad监控 #!/bin/bash target_label$1 user$2 password$3looptrue echo "开始循环了----------------------" while ${loop} dolabel$(mysql -h FE_IP -P9030 -urealtime -ppassword -D offline -e "show load where label${target_label}")if [ -z &…

企业微信私域运营,基于http协议实现SCRM+AI完整解决方案

1、方案介绍 基于企业微信原生功能已实现全场景的能力覆盖&#xff0c;并提供标准化可直接调用的API接口&#xff0c;可以帮助企业轻松实现上层应用的开发及落地&#xff0c;方案采用模拟通信技术可实现PC&#xff0c;手机&#xff0c;ipad三端的同时在线&#xff0c;单服务器…

Oracle Linux8 安装 MySQL 8.4.3,搭建一主一从

文章目录 安装依赖获取安装包解压准备相关目录设置配置文件启动数据库连接数据库socket 文件优化同样方法准备 3307 数据库实例设置配置文件启动 3307 实例数据库连接并查看 3307 数据库实例基于 bin log 搭建主从模式 安装依赖 yum install -y numactl libaio ncurses-compat…

Dataway在Spring Boot中的引入以及使用教程

Dataway是Hasor生态中的接口配置工具&#xff0c;能帮助开发者快速配置数据接口。它支持DataQL和SQL两种语言模式&#xff0c;可将SQL转换为DataQL执行&#xff0c;简化数据查询与交互&#xff0c;无需编写大量代码。接口配置完成后&#xff0c;可进行自测、冒烟测试&#xff0…

进程互斥的软件实现方法

单标志法 算法思想&#xff1a;两个进程在访问完临界区后会把使用临界区的权限转交给另一个进程。也就是说每个进程进入临界区的权限只能被另一个进程赋予 int turn 0; //turn 表示当前允许进入临界区的进程号P0 进程&#xff1a; while (turn ! 0); ① //进入区 critical …

力扣150题-- 汇总区间和合并区间

Day 27 题目描述 思路 做法&#xff1a; 特殊处理空数组和数组只有一个元素的情况设置beg&#xff0c;end标记范围的起始和结束&#xff0c;x用来比较元素是否有序&#xff08;初始end和beg都指向nums[0[,x为nums[0]1&#xff09;遍历数组如果当前元素等于x&#xff0c;说明…

【c++深入系列】:万字string详解(附有sso优化版本的string模拟实现源码)

&#x1f525; 本文专栏&#xff1a;c &#x1f338;作者主页&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客励志语录&#xff1a; 当你想放弃时&#xff0c;想想为什么当初坚持走到了这里 ★★★ 本文前置知识&#xff1a; 类和对象&#xff08;上&#xff09; 类和对…