CosyVoice 默认提供了几个音色,现在新的需求希望增加新的音色。研究一下了发现可以在不训练模型的情况下完成新音色的增加。

预置音色
准备工作
首先需要准备包含音色的音频文件,音频时长最好长一些,内容丰富一些,这样提取 embedding 的时候也会丰富一些。另外需要准备语音对应的标注文字。
CosyVoice 工程 example 路径下提供了训练模型的代码,我们虽然不需要训练模型,但是里面的脚本文件包括一些提取音色的依赖项。将 example/libritts/cosyvoice/run.sh 文件在相同目录下另外拷贝一份,命名为 new.sh。
打开新建的文件,修改如下代码。这样就会只运行这个脚本的前两步,后面训练模型的部分我们不需要。data_dir 存放的是训练数据。准备好这些之后就可以开始提取音色了。
stage=0
stop_stage=1
data_dir=/test/workspace/CosyVoice/input
生成语音嵌入文件
接下来,运行新建的new.sh文件,生成 embedding 文件。文件存放在 example/libritts/cosyvoice/data 目录。
sh new.sh
该文件实际为一个 python 字典的 pickle 序列化。里面存放的语音 embedding 就是我们需要的音色。
音色提取
通过以下实例代码提取音色
import torch
device = torch.device('cuda')
model_dir = '/test/workspace/CosyVoice/pretrained_models/CosyVoice-300M-train/'
spk_path = '{}spk2info.pt'.format(model_dir)
spk2info = torch.load(spk_path, map_location=device)
wl_path = '/test/workspace/CosyVoice/examples/libritts/cosyvoice/data/train_data/spk2embedding.pt'
wl = torch.load(wl_path, device)
tensor = torch.tensor(wl['audio_file_name.WAV'])
tensor = tensor.view(1, 192)
spk2info['user_name'] = {'embedding': tensor}
torch.save(spk2info,'spk2info_new.pt')
通过这种方式生成新的 spk2info 字典,将其保存下来替换掉原来的文件重新启动 webui 就能加载新的音色选项了。