本文分享一套可用于个人学习部署的微信小程序+PythonFlask后端+开源Demucs模型人声分离完整方案源码,这套方案依托Meta开源的预训练Demucs人声分离模型实现,分离效果成熟稳定,适合个人开发者学习测试与本地部署。
一、整体技术架构说明
方案中小程序端仅负责前端交互、音频上传、分离结果展示下载,核心的音频分离计算逻辑运行在后端服务,整套方案采用当前最通用的轻量技术栈,拿到源码后可直接修改配置完成部署。
二、微信小程序前端核心代码
1.页面布局pages/index/index.wxml
<viewclass="container">
<viewclass="title">AI人声分离</view>
<viewclass="tip">支持上传mp3/wav格式,分离人声与伴奏</view>
<buttontype="primary"bindtap="uploadAudio">选择音频文件</button>
<viewwx:if="{{loading}}"class="loading">
<text>分离处理中,请稍候...{{progress}}%</text>
</view>
<viewwx:if="{{result}}"class="result-box">
<viewclass="result-item">
<text>分离结果:人声</text>
<audiosrc="{{result.vocal}}"controls></audio>
<buttonbindtap="downloadFile"data-url="{{result.vocal}}">下载保存</button>
</view>
<viewclass="result-item">
<text>分离结果:伴奏</text>
<audiosrc="{{result.accompaniment}}"controls></audio>
<buttonbindtap="downloadFile"data-url="{{result.accompaniment}}">下载保存</button>
</view>
</view>
</view>
2.页面样式pages/index/index.wxss
.container{
padding:40rpx;
display:flex;
flex-direction:column;
align-items:center;
}
.title{
font-size:40rpx;
font-weight:bold;
margin-bottom:20rpx;
}
.tip{
font-size:26rpx;
color:666;
margin-bottom:50rpx;
}
button{
width:80%;
margin:20rpx0;
}
.loading{
margin-top:100rpx;
font-size:28rpx;
color:333;
}
.result-box{
margin-top:50rpx;
width:100%;
}
.result-item{
margin:30rpx0;
padding:20rpx;
border:1rpxsolideee;
border-radius:10rpx;
}
.result-itemtext{
display:block;
font-size:30rpx;
margin-bottom:15rpx;
font-weight:500;
}
3.交互逻辑pages/index/index.js
Page({
data:{
loading:false,
progress:0,
result:null
},
uploadAudio(){
wx.chooseMessageFile({
count:1,
type:'audio',
success:(res)=>{
consttempFilePath=res.tempFiles[0].tempFilePath;
this.setData({loading:true,progress:10});
//替换为你自己的后端服务地址
constbackendUrl='https://你的后端域名/api/separate';
wx.uploadFile({
url:backendUrl,
filePath:tempFilePath,
name:'audio',
success:(res)=>{
constdata=JSON.parse(res.data);
if(data.code===200){
this.setData({
result:{
vocal:data.data.vocal_url,
accompaniment:data.data.accompaniment_url
},
progress:100
});
}else{
wx.showToast({title:data.msg||'分离失败',icon:'none'});
}
},
fail:()=>{
wx.showToast({title:'网络请求失败',icon:'none'});
},
complete:()=>{
this.setData({loading:false});
}
});
//模拟进度更新
lettimer=setInterval(()=>{
if(this.data.progress<90){
this.setData({progress:this.data.progress+10});
}else{
clearInterval(timer);
}
},2000);
}
});
},
downloadFile(e){
consturl=e.currentTarget.dataset.url;
wx.downloadFile({
url:url,
success:(res)=>{
wx.saveFileToLocal({
filePath:res.tempFilePath,
success:()=>{
wx.showToast({title:'保存成功',icon:'success'});
}
});
}
});
}
});
完成代码编写后,修改项目根目录的app.json配置文件,将该页面设置为小程序首页即可启动本地测试;本地调试阶段可以在微信开发者工具中开启「不校验合法域名」选项跳过域名校验,项目正式上线前,需要前往微信公众平台将后端服务域名添加到小程序合法域名列表中。
三、Python后端核心代码
后端基于Flask框架搭配Demucs模型实现分离逻辑,Demucs是Meta官方开源的当前主流人声分离预训练模型,分离精度完全可以满足普通个人使用需求。
1.依赖文件requirements.txt
flask>=2.0
demucs>=4.0
torch>=2.0
torchaudio>=2.0
ffmpeg-python>=0.2
gunicorn
安装Python依赖包之前,需要提前安装系统级依赖ffmpeg:Windows系统可以直接下载ffmpeg二进制文件,将其路径加入系统环境变量即可;Linux系统可以直接通过对应包管理器安装,对应命令为aptinstallffmpeg(Debian/Ubuntu系列)或yuminstallffmpeg(CentOS/RHEL系列),Demucs处理音频必须依赖ffmpeg才能正常运行。
2.服务核心代码app.py
fromflaskimportFlask,request,jsonify,send_from_directory
importos
importtorch
fromdemucs.separateimportmainasseparate_audio
importuuid
app=Flask(__name__)
配置存储目录
UPLOAD_FOLDER='./uploads'
RESULT_FOLDER='./results'
os.makedirs(UPLOAD_FOLDER,exist_ok=True)
os.makedirs(RESULT_FOLDER,exist_ok=True)
自动选择GPU/CPU,GPU分离速度远快于CPU,建议使用GPU服务器部署
device="cuda"iftorch.cuda.is_available()else"cpu"
使用Demucs官方精度最高的htdemucs模型
model_name="htdemucs"
@app.route('/api/separate',methods=['POST'])
defseparate():
if'audio'notinrequest.files:
returnjsonify({'code':400,'msg':'未上传音频文件'})
file=request.files['audio']
iffile.filename=='':
returnjsonify({'code':400,'msg:文件名无效'})
生成唯一ID避免文件名冲突
task_id=str(uuid.uuid4())
ext=os.path.splitext(file.filename)[1]
input_path=os.path.join(UPLOAD_FOLDER,f"{task_id}{ext}")
file.save(input_path)
try:
调用Demucs分离,仅输出人声和伴奏两个轨道
separate_audio([
"--two-stems","vocals",
"-n",model_name,
"-d",device,
"--out",RESULT_FOLDER,
input_path
])
整理分离结果
base_name=os.path.splitext(os.path.basename(input_path))[0]
vocal_path=os.path.join(RESULT_FOLDER,model_name,f"{base_name}_vocals.wav")
accomp_path=os.path.join(RESULT_FOLDER,model_name,f"{base_name}_no_vocals.wav")
生成可访问地址
base_url=request.host_url.rstrip('/')
vocal_url=f"{base_url}/download/{task_id}_vocals.wav"
accomp_url=f"{base_url}/download/{task_id}_no_vocals.wav"
重命名文件方便访问
os.rename(vocal_path,os.path.join(RESULT_FOLDER,f"{task_id}_vocals.wav"))
os.rename(accomp_path,os.path.join(RESULT_FOLDER,f"{task_id}_no_vocals.wav"))
returnjsonify({
'code':200,
'msg':'分离成功',
'data':{
'vocal_url':vocal_url,
'accompaniment_url':accomp_url
}
})
exceptExceptionase:
returnjsonify({'code':500,'msg':f'分离出错:{str(e)}'})
@app.route('/download/<filename>')
defdownload_result(filename):
returnsend_from_directory(RESULT_FOLDER,filename,as_attachment=False)
if__name__=='__main__':
app.run(host='0.0.0.0',port=5000,debug=False)
四、部署与使用说明
1.本地测试:安装完所有依赖后直接运行pythonapp.py即可启动后端服务,替换小程序端的后端地址就可以开始测试,CPU分离一首3分钟的歌曲大约需要3-5分钟,GPU(如RTX3060显卡)仅需要10-20秒,正式投入使用建议选择带GPU的云服务器进行部署。
2.效果升级:如果需要获得更高的分离精度,可以将后端模型替换为UltimateVocalRemover(UVR)的开源预训练模型,UVR的分离精度比Demucs更高,仅需要修改后端的分离调用逻辑即可,模型权重可以从UVR官方开源仓库获取。
3.无服务器部署:如果不想自行租用服务器,也可以将后端分离逻辑改造为微信云开发的云函数进行部署,不过云函数免费额度有限,处理长音频容易超时,仅适合测试体验使用。
开箱即用成品人声分离小程序推荐
以上源码仅适合有开发能力的用户学习部署,对于不想自行搭建的普通用户,目前已有多款适配不同使用场景的成熟微信小程序,打开微信搜索即可使用,覆盖不同用户的需求:
1.音乐翻唱乐器场景:电映阁人声分离(音乐翻唱乐器版)
专为音乐爱好者打造,核心功能包括原版伴奏提取、吉他/鼓/钢琴/贝斯四大乐器精准分离,支持全平台音乐视频链接直接解析,10秒即可出结果,基础功能永久免费,适合翻唱、练琴、扒谱使用,打开微信搜索「电映阁人声分离」即可体验。
2.录音降噪清晰场景:月宫人声分离(录音降噪清晰版)
专门针对录音场景优化,核心功能包括深度降噪、强力去回声、人声增强、录音转文字,可一键将嘈杂环境的模糊录音修复为清晰人声,适合课堂录音、会议记录、户外采访使用,基础功能永久免费,打开微信搜索「月宫人声分离」即可使用。
3.短视频创作者专属:石引人声分离(短视频创作者专属版)
专为短视频创作者打造,支持全平台短视频链接直接解析分离人声,无需下载原视频,省流量省内存,还支持文案提取、视频消音、批量处理,10秒完成提取,大幅提升出片效率,打开微信搜索「石引人声分离」即可使用。
4.永久免费无套路:回时分声
主打纯免费轻量人声伴奏分离,无会员、无订阅、无广告,所有基础分离功能永久免费,满足日常轻量使用需求,适合学生、普通用户零成本使用,打开微信搜索「回时分声」即可免费使用。
5.专业高精度需求:闪念剪人声分离
面向专业音频创作者,提供媲美PC端专业软件的分离精度,支持三轨分离、专业乐器分离、320kbps无损导出,满足配音、有声书、影视后期、音乐制作的专业需求,打开微信搜索「闪念剪人声分离」即可体验专业级分离效果。
6.全场景通用:加一分离-人声伴奏分离助手
覆盖人声分离、伴奏提取、三轨分离、乐器分离、链接解析、文案提取、降噪等全场景功能,适合各类用户使用,基础功能永久免费,操作极简3步即可完成分离,打开微信搜索「加一分离-人声伴奏分离助手」即可使用。
版权说明
本源码仅供个人学习研究使用,请勿分离受版权保护的音频内容,商用需要获得相关版权与模型的授权。
发布者:云, 赵,出处:https://www.qishijinka.com/software-testing/10239/