「AI 孙燕姿」火遍全网,你知道吗!

文摘   科技   2023-05-10 09:00   浙江  

关注我 带你康好康的


    chatgpt,AI画图火遍全网了大家都知道,但不知道大家最近在b站有没有刷到过AI孙燕姿翻唱的视频?这是继语言,图像之后的语音生成模型!小律最近经常刷到,也经常去听。。。真的很逼真!至少我一个外行人,你不和我说它是AI转换过来的,我是分辨不出来的。



虚假的AI进展:看CVPR,ICML,ACL等

真正的AI前沿:还得是哔哩哔哩,github,colab,huggingface等

事实上,这方面的技术,刚出没多久,我就去体验了。我还甚至为此写了一篇文章。感兴趣的可以看看,我还为此训练了一个自己的音色模型,但是因为缺少训练数据,其实效果不是很好,哈哈哈,叙利亚战损版音质,但是音色确实是我的能听出来~
五音不全也能翻唱?!【so-vits-svc】

这个模型说白了,就是一个翻唱模型,它没有无中生有的能力,只能把你提供的音频换成你指定的声音。


so-vits-svc号称是目前最厉害的语音模型啦,虽然它不能无中生有,只能翻唱,但发挥我们的脑洞,我们可以写好一篇文案,用一些软件自带的文本转语音功能,得到一段语音,再把这段语音输入到音色转换模型里面,就得到了我们音色讲话的语音了。。。完成无中生有。未来,如果我们因为某些原因不方便讲话,那不开口说话录制视频的方法也找到啦~



可能有人会和我一样,对这个很感兴趣。网上其实已经有不少小白向的教程了,下面给出一个不针对小白的,程序员向的教程~网上的教程由于过于小白,要下载一系列额外的GUI软件才行,加起来将近6,7个g的文件!我懒得下。这里的教程是自己摸索下来的完整流程,适用于有代码基础的盆友们,可以少下很多软件。

如果你需要小白教程,去b站搜索so-vits-svc即可,大佬们训练集多,可以得到丝滑的效果。


Part.1 准备工作


准备工作是最繁琐的,但我写很详细,请耐心阅读~


  1. 制作训练集


想做一个好点的模型,个人感觉最好提供800条以上的数据,每条数据5-15秒,总时长差不多要一小时以上,你可以先录个10分钟音频试试看,看效果再决定加时长,我就是找了个长篇小说念了十几分钟录的....再剪切成小片段。


剪切的话,这里涉及到两个包,pydub和ffmpeg,如果你是linux系统,两行命令搞定

sudo apt install ffmpegpip install pydub

如果是windows系统,需要自行去ffmpeg官网下载它的exe文件,放到你的代码同级的工作目录当中。


下面则是切分函数,把长语音切成8s的小片段,方便模型输入。这个函数在推理阶段也要用到,需要用把语音切成1分钟左右的片段,切记。

import osfrom pydub import AudioSegmentimport random
#手机录的音一般声音比较小,通过它增加音量,自行决定要不要用def match_target_amplitude(sound, target_dBFS): change_in_dBFS = target_dBFS - sound.dBFS return sound.apply_gain(change_in_dBFS)
def trans_m4a_to_other(filepath, index, hz): song = pydub.AudioSegment.from_file(filepath) db = song.dBFS #取得WAV文件的声音分贝值    song = match_target_amplitude(song, db+0)    #如果你嫌你录的音,声音太小了,就把这里改大点    print(song.duration_seconds)    #剪切音频 while song.duration_seconds > 8.: extra = song[:1000*8] song = song[1000*8:]
a = random.sample('1234567890zyxwvutsrqponmlkjihgfedcba',3) a = ''.join(a)        extra.export(f"./dataset/Newsound_{a}." + str(hz), format=str(hz)) else: a = random.sample('zyxwvutsrqponmlkjihgfedcba',3) a = ''.join(a) song.export(f"./dataset/Newsound_{a}." + str(hz), format=str(hz))
#假设你把你录的声音放到了audio中    path = "./audio"datas = os.listdir(path)datas = [path+f'/{data}' for data in datas]
#把你切好的片段放到dataset文件夹中!rm -rf datasetos.mkdir('./dataset')#做成wav格式for i, data in enumerate(datas): print(data) trans_m4a_to_other(data, i, "wav")


2.干声、背景音乐分离

前面说到,这个模型只能用作翻唱等地方,所以你要提供一段原声给模型,但音频中还有背景声,会影响模型的效果,所以你需要把人声从背景音乐中剥离出来,训练集也不能有背景音,如果你不是自己录的音,用的是有bgm的录音,也要这么操作。原来的步骤是要下载一个几个g的软件,需要有GPU,在自己电脑操作。我嫌麻烦,在colab上找到了相同功能,用它操作更省心。

网址:

https://colab.research.google.com/github/NaJeongMo/Colaboratory-Notebook-for-Ultimate-Vocal-Remover/blob/main/Vocal%20Remover%205_arch.ipynb#scrollTo=CT8TuXWLBrXF

进colab,无脑一路shift+enter,运行下去即可,它会自动链接你的google云盘,你点同意就好了,

加载完云盘之后,点开你左边的文件夹按钮,打开云盘目录,找到上图所示的tracks文件夹,把你要翻唱的歌拖拽进去。


再继续无脑运行colab,直至到达下图的inference小节,在input这一行添上你要分离的音频的文件名,xx.mp3类似这种格式,填好,运行,接着你的人声就可以在云盘的separate文件夹里面找到了,把它拉出来。



至此,最麻烦的前期工作完成!


Part.2 准备训练


训练这一步就不多说了,github上写很详细,无脑操作即可,不班门弄斧了。

值得一提的是,如果你和我一样,没有GPU的话,有两个方案:第一种,动手能力强的可以根据github要求,自己去colab搞,colab赠送的GPU够用了。第二种,嫌麻烦的可以用autodl,花点钱租一张显卡,我是这么训练的,训练一次差不多要花5块钱上下,这个方案有一个好处,就是它提供了镜像给你,不需要你安装额外的东西,进去点右上角的使用就好了。

网址如下:

https://www.codewithgpu.com/i/innnky/so-vits-svc/so-vits-svc-v4-Webui


Part.3 去噪+背景音


如果前两步你都顺利完成了,那接下来当然就是我们最期待的音色转换环节了!github同样有说,不赘述了。

这里要说的是去噪+背景音。因为我们训练集可能比较小,或者训练集自己录的时候,因为录音设备等问题,会有电流,气流音等,又或者你的干声去bgm去除的不彻底,都可能导致推理出来的声音同样也有噪声,专业的自行用专业音频处理软件效果更好.....这里就提供一个最简单的去噪方法。安装noisereduce这个包即可。

from pydub import AudioSegmentfrom noisereduce import reduce_noise
# Load the .wav file using pydubaudio = AudioSegment.from_wav("input.wav")
# Convert the audio to a numpy arrayaudio_array = audio.get_array_of_samples()
# Perform noise reduction on the audio arrayreduced_noise = reduce_noise(audio_array, audio.frame_rate)
# Create a new AudioSegment from the reduced noise arrayreduced_audio = AudioSegment( reduced_noise.tobytes(), frame_rate=audio.frame_rate, sample_width=audio.sample_width, channels=audio.channels)
# Export the reduced noise audio as a .wav filereduced_audio.export("output.wav", format="wav")

到这还不算完....还差最后一步,如果你的人声你足够满意了,那就要把背景音加回来,我们的推理结果是没有背景音的,那背景音从哪里来呢?就是前面的colab的separate文件夹里面!它除了有一个人声的文件,还有一个背景音的文件!把这两个文件重新合并回去就ok

代码如下:

song = AudioSegment.from_file('./output.wav')ground = AudioSegment.from_file('bgm.wav')print(song.duration_seconds, ground.duration_seconds)
def match_target_amplitude(sound, target_dBFS): change_in_dBFS = target_dBFS - sound.dBFS return sound.apply_gain(change_in_dBFS)
db = ground.dBFS #取得WAV文件的声音分贝值song = match_target_amplitude(song, db+5)normalized_sound = match_target_amplitude(ground, db+0) #db+10表示比原来的声音大10db,需要加大音量就加多少,反之则减多少hz='mp3'output = song.overlay(normalized_sound) # 把sound2叠加到sound1上面output.export(f"111." + str(hz), format=str(hz))


至此,就完成了全部流程!!!可以听听你翻唱歌曲的效果啦~~~

上次的音频,因为自己偷懒,其实做的不是很好,现在又太忙了,也不想尝试。。。等我闲下来,一定要立志做一个自己的音色模型!以后就可以用它,解放自己的嗓子了!说不定我那天暴毙了,他就是我实现数字生命的契机~

      你好,我是小律,一位数学专业转AI,热爱技术,思考新事物的算法工程师。在多家大厂呆过,目前就职于一家行业独角兽公司。

      这里,不止有算法干货,AI竞赛方案,还有劲燃鼓励,点滴分享!

      我每周至少更新一篇原创文章,也正在努力实现自己的人生目标,期待与你一起进步!



点个在看你最好看



不摸鱼的小律
互联网大厂算法工程师一枚,分享各种技术、职场热点和感悟。不做每日打卡的路人。
 最新文章