作者:微信小助手
发布时间:2025-02-19T17:02:26
大家好。今天给大家带来最近2款爆火语音克隆开源TTS模型阿里的CosyVoice2-0.5B和fish-audio团队的FishSpeech1.5模型。为了能够较客观的衡量2款模型在特定参考音频下克隆的效果,决定采用seed-tts的说话人相似度SS指标来衡量模型语音合成与对应参考音频的相似度;以便给大家带来更理性的判断~ 本文带你手把手实操部署2款模型,并提供对应的推理代码进行语音合成效果展示,下面进入本文的主题~ CosyVoice2-0.5B模型介绍 FishSpeech1.5模型介绍 实战篇:部署 CosyVoice2-0.5B模型和FishSpeech1.5模型进行语音克隆 配置 CosyVoice2-0.5B模型的运行环境 配置 FishSpeech1.5模型的运行环境 搭建CosyVoice2-0.5B模型语音合成推理函数 搭建 FishSpeech1.5模型语音合成推理函数 speaker Similarity(ss):字节Seed-TTS客观评估指标函数-衡量语音克隆相似度 效果篇: CosyVoice2-0.5B和Fish-Speech1.5语音克隆-性能客观评价 案例1:女音克隆-语音克隆效果展示(客观指标说话人相似度SS指标) 案例2:男音克隆-语音克隆效果展示(客观指标说话人相似度SS指标) 参考链接 CosyVoice系列是阿里开源关于TTS语音合成项目,目前最新已开源CosyVoice2-0.5B版本。更多详情可见之前给大家分享的文章:【TTS领域开源霸主模型更新啦】CosyVoice2来啦!超逼真的语音克隆,支持多种地方方言合成,真的好强!该文章的目录大纲如下,感兴趣的小伙伴可以访问上面的链接~ FishSpeech系列是fish-audio开源关于TTS语音合成项目,开源的版本路线: Fish Speech V1.2 —> Fish Speech V1.4->Fish Speech V1.5;目前最新已开源 V1.5版本。更多详情可见之前给大家分享的文章:【TTS领域王炸模型重磅升级】性能超过F5、CosySense,一文带你理论+实操多种语言克隆效果,效果炸裂,请谨慎使用!该文章的目录大纲如下,感兴趣的小伙伴可以访问上面的链接~ 今天决定给大家实操部署2款TTS模型并准备一些案例,从客观指标的角度来展示2款模型对语音克隆的效果对比~ 对于speaker Similarity(ss),使用在说话人验证任务上微调的 WavLM-large 来获取说话人embedding,用于计算每个测试话语的语音样本与参考语音的余弦相似度(0~1之间,越靠近1,说明克隆合成的语音效果接近参考音频的语音效果) 其中SS指标如下: 其中Fish-Speech1.5语音合成效果如下: 其中CosyVoice2-0.5B语音合成效果如下: 其中SS指标如下: 其中参考音频效果如下:
其中Fish-Speech1.5语音合成效果如下: 其中CosyVoice2-0.5B语音合成效果如下:前言
本文目录
CosyVoice2-0.5B模型介绍
FishSpeech1.5模型介绍
截止到目前1月22日, fish-speech-1.5模型在huggingface上权重下载量高达6,485次;CosyVoice2-0.5B模型在huggingface上权重下载量高达8,589次;从模型权重下载量就能看出,2款TTS模型在开源领域都比较火热。
实战篇:部署 CosyVoice2-0.5B模型和FishSpeech1.5模型进行语音克隆
配置 CosyVoice2-0.5B模型的运行环境
from IPython.display import *
!sudo apt-get install sox libsox-dev -y
clear_output()
%cd /kaggle/working/
!git clone --recursive https://github.com/FunAudioLLM/CosyVoice.git
%cd CosyVoice
!git submodule update --init --recursive
!apt-get update &&apt-get install -y imagemagick -o Dpkg::Options::="--force-confold"
!pip install moviepy==1.0.3 imageio==2.36.0
!npm install -g localtunnel
!pip install gradio==4.44.1
clear_output()配置 FishSpeech1.5模型的运行环境
%cd /kaggle/working/
from IPython.display import *
!pip install modelscope
!git clone https://github.com/fishaudio/fish-speech
%cd fish-speech
clear_output()
!apt install libsox-dev -y
!apt install build-essential \
cmake \
libasound-dev \
portaudio19-dev \
libportaudio2 \
libportaudiocpp0 -y
clear_output()
from modelscope import snapshot_download
#下载模型权重
model_dir = snapshot_download("fishaudio/fish-speech-1.5", cache_dir="/kaggle/working/")
clear_output()搭建CosyVoice2-0.5B模型语音合成推理函数
%cd /kaggle/input/cosyvoice2-0-5b/CosyVoice
!cp zero_shot_prompt.wav /kaggle/working/
import warnings
warnings.filterwarnings('ignore', category=FutureWarning)
warnings.filterwarnings('ignore', category=UserWarning)
from rich import print
import torchaudio
import os
import sys
import torch
import numpy as np
from IPython.display import *
sys.path.append("/kaggle/input/cosyvoice2-0-5b/CosyVoice/third_party/Matcha-TTS")
from cosyvoice.cli.cosyvoice import CosyVoice, CosyVoice2
from cosyvoice.utils.file_utils import load_wav
cosyvoice = CosyVoice2('pretrained_models/CosyVoice2-0.5B', load_jit=True, load_trt=False,fp16=True)
def voice_cloning_Synthesis(target_text,ref_audio,ref_text,output_audio_name ):
prompt_speech_16k = load_wav(ref_audio, 16000)
wavs=[]
for i, j in enumerate(cosyvoice.inference_zero_shot(target_text,ref_text,
prompt_speech_16k, stream=False,speed=1)):
wavs.append(j['tts_speech'])
torchaudio.save(output_audio_name, torch.tensor(np.concatenate(wavs,axis=-1)), cosyvoice.sample_rate)
print(output_audio_name)搭建 FishSpeech1.5模型语音合成推理函数
from IPython.display import *
def fish_speech15_infer(content,ref_audio,ref_text,output_path ):
# 从语音生成 prompt
!python tools/vqgan/inference.py \
-i "$ref_audio" \
-o "/kaggle/working/outputs/fake.wav" \
--checkpoint-path "/kaggle/working/fishaudio/fish-speech-1___5/firefly-gan-vq-fsq-8x1024-21hz-generator.pth"
!rm -rf /kaggle/working/outputs/codes_*.npy
# 从文本生成语义 token
!python tools/llama/generate.py \
--text "$content" \
--prompt-text "$ref_text" \
--prompt-tokens "/kaggle/working/outputs/fake.npy" \
--checkpoint-path "/kaggle/working/fishaudio/fish-speech-1___5" \
--num-samples 1 \
--temperature 0.3 \
--half
# clear_output()
# 从语义 token 生成人声
!python tools/vqgan/inference.py \
-i "codes_0.npy" \
--checkpoint-path "/kaggle/working/fishaudio/fish-speech-1___5/firefly-gan-vq-fsq-8x1024-21hz-generator.pth" \
-o "$output_path"speaker Similarity(ss):字节Seed-TTS客观评估指标函数-衡量语音克隆相似度
wavlm_ckpt_dir = "./models/wavlm_large_finetune.pth"
ss_model = ECAPA_TDNN_SMALL(feat_dim=1024, feat_type="wavlm_large", config_path=None)
state_dict = torch.load(wavlm_ckpt_dir, weights_only=True, map_location=lambda storage, loc: storage)
ss_model.load_state_dict(state_dict["model"], strict=False)
use_gpu = True if torch.cuda.is_available() else False
if use_gpu:
ss_model = ss_model.cuda()
ss_model.eval()
def run_sim(wav1_path,wav2_path ):
wav1, sr1 = torchaudio.load(wav1_path)
wav2, sr2 = torchaudio.load(wav2_path)
resample1 = torchaudio.transforms.Resample(orig_freq=sr1, new_freq=16000)
resample2 = torchaudio.transforms.Resample(orig_freq=sr2, new_freq=16000)
wav1 = resample1(wav1)
wav2 = resample2(wav2)
if use_gpu:
wav1 = wav1.cuda()
wav2 = wav2.cuda()
with torch.no_grad():
emb1 = ss_model(wav1)
emb2 = ss_model(wav2)
sim = F.cosine_similarity(emb1, emb2)[0].item()
return sim效果篇: CosyVoice2-0.5B和Fish-Speech1.5语音克隆-性能客观评价
案例1:女音克隆-语音克隆效果展示(客观指标说话人相似度SS指标)
%%time
content="""富人优先考虑的都是利益,而穷人优先考虑的永远都是感情和面子。
做人不需要太大方,因为你的感情和面子在利益面前一文不值。
穷人总是把很好的东西送人,还担心别人瞧不起,看不上。
而富人则是把不用的东西送给别人,还认为别人没有吃过,没有见
过,也没有用过!穷人是小心翼翼的大方,而富人却是大大方方的小气。
所以,请收起你的傻大方,你的感情和面子,在利益面前那是一文不值。
做人吝啬一些没有错,不需要太大方。
"""
ref_audio_path = "/kaggle/working/woman_2_ref.wav"
ref_text = "呃你这个梦属于超现实主义,狂想派的。"
fish_output_path = "/kaggle/working/fish1.5_output.wav"
cosyvoice2_output_path = "/kaggle/working/cosyvoice2_output.wav"
%cd /kaggle/working/fish-speech
fish_speech15_infer(content,ref_audio_path,ref_text,fish_output_path )
clear_output()
%cd /kaggle/input/cosyvoice2-0-5b/CosyVoice
voice_cloning_Synthesis(content,ref_audio_path,ref_text,cosyvoice2_output_path )
clear_output()其中参考音频效果如下:
案例2:男音克隆-语音克隆效果展示(客观指标说话人相似度SS指标)
%%time
content="""人为什么要读书? 读书不一定能前程似锦,功成名就
,但至少可以让你出言有尺,嬉闹有度,说话有德,做事有余。
读书,世界就在眼前,不读书,眼前就是世界!
人生没有白走的路,没有白读的书,你触碰过的那些文字,
会在不知不觉中帮你认识这个世界,会悄悄帮你擦去脸上的肤浅和无知。
读书不是为了一纸文凭,也不是为了一夜暴富,而是为了成为一个有温度、懂情趣、会思考的人,
是为了让你在跌宕起伏的生活中拥有处变不惊的内心,让你在未来能独自度过那些漫长幽暗的岁月而不怨天忧人。
"""
ref_audio_path = "/kaggle/working/man_ref.wav"
ref_text = "这个问题,嗯嘶,从另一个角度看,是不是对我们来说也是一件好事?"
fish_output_path = "/kaggle/working/fish1.5_output2.wav"
cosyvoice2_output_path = "/kaggle/working/cosyvoice2_output2.wav"
%cd /kaggle/working/fish-speech
fish_speech15_infer(content,ref_audio_path,ref_text,fish_output_path )
clear_output()
%cd /kaggle/input/cosyvoice2-0-5b/CosyVoice
voice_cloning_Synthesis(content,ref_audio_path,ref_text,cosyvoice2_output_path )
clear_output()参考链接