【2款爆火TTS语音克隆模型效果对比】Fish-Speech1.5和CosyVoice2-0.5B模型-语音合成客观指标对比

作者:微信小助手

发布时间:2025-02-19T17:02:26

前言

大家好。今天给大家带来最近2款爆火语音克隆开源TTS模型阿里的CosyVoice2-0.5Bfish-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指标)

  • 参考链接

CosyVoice2-0.5B模型介绍

CosyVoice系列是阿里开源关于TTS语音合成项目,目前最新已开源CosyVoice2-0.5B版本。更多详情可见之前给大家分享的文章:【TTS领域开源霸主模型更新啦】CosyVoice2来啦!超逼真的语音克隆,支持多种地方方言合成,真的好强!该文章的目录大纲如下,感兴趣的小伙伴可以访问上面的链接~

FishSpeech1.5模型介绍

FishSpeech系列是fish-audio开源关于TTS语音合成项目,开源的版本路线: Fish Speech V1.2 —> Fish Speech V1.4->Fish Speech V1.5;目前最新已开源 V1.5版本。更多详情可见之前给大家分享的文章:【TTS领域王炸模型重磅升级】性能超过F5、CosySense,一文带你理论+实操多种语言克隆效果,效果炸裂,请谨慎使用!该文章的目录大纲如下,感兴趣的小伙伴可以访问上面的链接~截止到目前1月22日, fish-speech-1.5模型在huggingface上权重下载量高达6,485次;CosyVoice2-0.5B模型在huggingface上权重下载量高达8,589次;从模型权重下载量就能看出,2款TTS模型在开源领域都比较火热。

今天决定给大家实操部署2款TTS模型并准备一些案例,从客观指标的角度来展示2款模型对语音克隆的效果对比~

实战篇:部署 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客观评估指标函数-衡量语音克隆相似度

对于speaker Similarity(ss),使用在说话人验证任务上微调的 WavLM-large 来获取说话人embedding,用于计算每个测试话语的语音样本与参考语音的余弦相似度(0~1之间,越靠近1,说明克隆合成的语音效果接近参考音频的语音效果

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()

其中SS指标如下:其中参考音频效果如下:

其中Fish-Speech1.5语音合成效果如下:


其中CosyVoice2-0.5B语音合成效果如下:


案例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()

其中SS指标如下:

其中参考音频效果如下:

其中Fish-Speech1.5语音合成效果如下:

其中CosyVoice2-0.5B语音合成效果如下:

参考链接

  1. https://github.com/BytedanceSpeech/seed-tts-eval
  2. https://www.modelscope.cn/models/iic/CosyVoice2-0.5B
  3. https://hf-mirror.com/fishaudio/fish-speech-1.5
  4. https://github.com/fishaudio/fish-speech