前言
moviepy官方中文API
对于AudioClip和VideoClip能够close()的尽量close()来释放资源,虽然不进行close()一般也不会报错
spleeter尽量在CPU上跑(运行时会出现Could not load dynamic library ‘libcudart.so.11.0’),环境比较好配置,若是GPU跑bug比较多,详细参考google问题描述
所有可能用到的文件同时放在百度网盘
链接:https://pan.baidu.com/s/1jyKsR65QI7dpo9NIObGlhA?pwd=xyvk 提取码:xyvk
安装包
conda create -n moviedeal python=3.7
conda activate moviedeal
pip install moviepy
pip install spleeter
conda install ffmpeg
分离人声和背景声
命令行执行
准备一个含有人声和背景声的音乐文件(.mp3、.wav都可以,可以使用spleeter官方github提供的文件audio_example.mp3)
新建一个文件夹spleeter_test,将audio_example.mp3复制到该文件夹中
在Anaconda Prompt中进入该目录,例如cd C:\Users\shang\Desktop\spleeter_test
执行命令spleeter separate audio_example.mp3 -p spleeter:2stems -o . 该命令会在spleeter_test文件夹中新建pretrained_models/2stems文件夹并下载预训练文件 (如果网络下载很慢,则在该地址下载压缩包,然后将里面的四个文件复制出来,手动新建两级文件夹pretrained_models/2stems,将这4个文件复制进去即可)
执行成功后,当前目录下(因为我们使用的参数-o为".")会创建一个audio_example文件夹,文件夹中vocals.wav为人声,accompaniment.wav为背景声。
代码执行
在spleeter_test文件夹下新建main.py
from moviepy.editor import *
from moviepy.audio.AudioClip import AudioArrayClip
from spleeter.separator import Separator
if __name__ == '__main__':
audio = AudioFileClip('audio_example.mp3')
audiodata = audio.to_soundarray()
prediction = Separator('spleeter:2stems').separate(audiodata)
vocals = AudioArrayClip(prediction['vocals'], 44100)
vocals.write_audiofile('vocals.wav')
accompaniment = AudioArrayClip(prediction['accompaniment'], 44100)
accompaniment.write_audiofile('accompaniment.wav')
audio.close()
vocals.close()
accompaniment.close()
生成的vocals.wav为人声,accompaniment.wav为背景声。
视频降噪
from moviepy.editor import *
from moviepy.audio.AudioClip import AudioArrayClip
from spleeter.separator import Separator
def audioNoiseReduction(audio):
"""
音频降噪(去除背景声保留人声)
注:AudioClip包含AudioFileClip和AudioArrayClip两个子类
:param audio: AudioClip或其子类对象
:return: AudioClip或其子类对象
"""
audiodata = audio.to_soundarray(fps=44100)
prediction = Separator('spleeter:2stems').separate(audiodata)
vocals = AudioArrayClip(prediction['vocals'], 44100)
return vocals
def videoNoiseReduction(video):
"""
视频降噪(去除背景声保留人声)
注:VideoClip包含VideoFileClip和DataVideoClip两个子类
:param video: VideoClip或其子类对象
:return: VideoClip或其子类对象
"""
audio = audioNoiseReduction(video.audio)
video_no = video.without_audio()
video_red = video_no.set_audio(audio)
audio.close()
video_no.close()
return video_red
if __name__ == '__main__':
video = VideoFileClip('video_example.mp4')
newVideo = videoNoiseReduction(video)
newVideo.write_videofile('new_video.mp4')
video.close()
newVideo.close()
|