打造你的AI孙燕姿

884 阅读3分钟

整体原理:

  • Step1,收集歌手的声音素材
  • Step2,人声 和 背景音乐分离
  • Step3,对歌手的声音进行切分 5-15秒
  • Step4,模型训练
  • Step5,模型推理(to 其他歌曲)

语音转换系统Voice Conversion

  • A Comparison of Discrete and Soft Speech Units for Improved Voice Conversion. ieeexplore.ieee.org/document/97…
  • 语音转换的目标是将源语音转换为目标语音,保持 内容不变。提出了自监督表示学习用于语音转换
  • 离散内容编码表示会丢失一些语言内容,导致发音 不准确。为此,提出了通过预测离散单位分布学习 的软语音单位。通过建模,软语音单位捕捉更多的 内容,提高了转换语音的效果。

image.png

离散

粗语音的单位 离散内容编码器:将音频特征聚类,生成一系列离散的语音单位序列

软语音

衔接的过程 软内容编码器:被训练用于预测离散语音单位。Acoustic model将离散/软语音单位转换为目标声谱图。vocoder语音合成器将声谱图转换为音频波形

搭建Voice Conversion

colab.research.google.com/drive/12jL-…

步骤

step1 准备内容编码(包括离散内容和软语音)

Step1,下载 HuBERT content encoder

hubert = torch.hub.load("bshall/hubert:main", "hubert_soft").cuda()

Step2,下载 acoustic model

acoustic = torch.hub.load("bshall/acoustic-model:main", "hubert_soft").cuda()

Step3,下载 vocoder

hifigan = torch.hub.load("bshall/hifigan:main", "hifigan_hubert_soft").cuda()

Step4,准备 example.wav

source, sr = torchaudio.load("example.wav") 
source = torchaudio.functional.resample(source, sr, 16000) 
source = source.unsqueeze(0).cuda()

Step5,转换为目标speaker

with torch.inference_mode(): 
    # Extract speech units 
    units = hubert.units(source) 
    # Generate target spectrogram 
    mel = acoustic.generate(units).transpose(1, 2) 
    # Generate audio waveform 
    target = hifigan(mel)

如何训练自己的语音模型?

Step1,数据集准备

数据集 The LJ Speech Dataset, keithito.com/LJ-Speech-D… 每个音频文件是 单通道 16-bit PCM WAV格式,采 样率为 22050 Hz

Step2,提取声谱

用法

使用mels.py in-dir out-dir 

参数解释

in-dir: 数据集目录 out-dir: 输出目录

比如

python mel.py path/to/LJSpeech-1.1/wavs path/to/LJSpeech-1.1/mels

Step3,提取离散或软语音单位(DiscreteorSoftSpeech Units)

用法

    使encode.py [--extensionEXTENSION]{soft,discrete} in-dir out-dir

参数解释

in-dir: 数据集目录 out-dir: 输出目录

比如

python encode.py soft path/to/LJSpeech-1.1/wavs path/to/LJSpeech-1.1/soft --extension .wav

目录结构

--mels # 提取的内容
--wavs # 原始数据集
--soft/discrete # 离散或软语音单位

Step4,训练语音模型

使用

train.py [--resume RESUME] [--discrete] dataset-dir checkpoint-dir 

参数解释

dataset-dir: 数据目录 checkpoint-dir: 模型输出目录

AI Song 实际操作

Step1,歌曲视频下载

要求是wav格式 如 www.youtube.com/watch?v=Uiv…

Step2,切分歌曲 => vocals + accompaniment

github.com/facebookres…

    pip install -U demucs
    
<!---->

    AUDIO_INPUT = "/content/drive/MyDrive/so-vits-svcfork/youtubeaudio/audio.wav" #@param {type:"string"} !demucs --two-stems=vocals {AUDIO_INPUT}

Step3,vocals切分 => 多个小片段

input_file = "/content/drive/MyDrive/so-vits-svcfork/dataset_spleeter/vocals.wav" output_dir = "/content/drive/MyDrive/so-vits-svcfork/dataset_raw/{SPEAKER_NAME}"

其他工具

声音分离工具:

Step4,声音建模

github.com/voicepaw/so…

pip install -U so-vits-svc-fork

预训练模型: huggingface.co/models?sear… 切分好的声音文件,存放在: dataset_raw/{speaker_id}/**/{wav_file}.{any_format}

模型训练流程:
svc pre-resample 
svc pre-config 
svc pre-hubert 
svc train -t

第一步 预处理数

svc pre-resample -i /content/drive/MyDrive/so-vits-svcfork/dataset_raw

## TIPS:如果我们在 /content/drive/MyDrive/so-vits-svcfork目录下执行该 svc 命令,会在当前目录下面得到dataset

第二步 生成训练文件

svc pre-config

## TIPS:会在当前目录中生成filelists 和configs

通过 svc pre-config,生成了 train.txt, val.txt, test.txt 用于后续的训练,验证,测试

第三步 学习

```
svc pre-hubert -fm dio

svc train --model-path /content/drive/MyDrive/so-vits-svc-fork/logs/44k

## TIPS:模型训练时间较长,可以调整config.json的参数,epochs 默认为10000
````

第四步 声音推理

    AUDIO = "/content/drive/MyDrive/so-vits-svc-fork/mao/example_0" #@param {type:"string"} MODEL = "/content/drive/MyDrive/so-vits-svc-fork/logs/44k/G_300.pth" #@param{type:"string"} 
    
    CONFIG = "/content/drive/MyDrive/so-vits-svc-fork/logs/44k/config.json" #@param{type:"string"} 

    #@markdown Change According to Your Voice Tone. 12 = 1 Octave | -12 = -1 Octave 

    PITCH = 0 #@param {type:"integer"} !

    svc infer {AUDIO}.wav -c {CONFIG} -m {MODEL}