最新开源TTS语音克隆,本地部署实测!跨语言、高保真。。。

技术

picture.image

猴哥的第 158 期分享,欢迎追看

最近,语音克隆领域精彩迭出!

前段时间刚分享过升级版 CosyVoice2:

阿里开源TTS CosyVoice 再升级!语音克隆玩出新花样,支持流式输出

最近,又看到一款开源的语音合成(TTS)系统。

今日分享,将介绍 Spark-TTS,并带大家本地部署体验,为本地 TTS 选型提供参考。

  1. Spark-TTS 简介

项目简介:https://sparkaudio.github.io/spark-tts/

picture.image

与已有 TTS 方案相比,Spark-TTS 主要解决的是:控制能力有限、跨语言表现较差、声音风格固定等问题。

老规矩,简要介绍下项目亮点:

  • 零样本语音克隆 :实测 3 秒音频就足够;
  • 跨语言支持 :支持中文和英文;
  • 可控音频生成 ::结合 Qwen-2.5,自动调整语气、停顿、强调等语音表达。

下图分别展示了 语音克隆可控生成 的技术架构:

picture.image

从技术报告上看,各项指标还是 SOTA,尤其是语音保真度:

picture.image

picture.image

不吹不擂,下面本地部署实测下,看看效果如何?

  1. 本地部署

项目地址:https://github.com/SparkAudio/Spark-TTS

首先,下载项目仓库,安装环境依赖。

  
git clone https://github.com/SparkAudio/Spark-TTS  
cd Spark-TTS  

然后,拉取模型权重(国内用户推荐直接从 modelscope 下载):

  
pip install modelscope  
modelscope download --model SparkAudio/Spark-TTS-0.5B --local\_dir ./pretrained\_models/Spark-TTS-0.5B  

下载的模型权重保存到当前目录./pretrained\_models/Spark-TTS-0.5B,大约占用 3.7G 空间,耗时 5min 左右。

2.1 速度测试

Spark-TTS 支持两种推理方式:

  • 音色克隆
  • 可控生成

我们先来测试下推理速度:

1. 音色克隆

推理代码如下:

  
import time  
import soundfile as sf  
from cli.SparkTTS import SparkTTS  
  
model = SparkTTS('./pretrained\_models/Spark-TTS-0.5B')  
  
start\_time = time.time()  
wav = model.inference(  
    text='你好,欢迎使用语音合成服务。',  
    prompt\_speech\_path='src/demos/trump/trump\_en.wav',  
)  
speech\_len = len(wav) / 16000  
print('yield speech len {}, rtf {}'.format(speech\_len, (time.time() - start\_time) / speech\_len))     
sf.write('output.wav', wav, 16000)  

  
yield speech len 2.82, rtf 1.9358745703460478  
yield speech len 16.72, rtf 1.1224767950733314  

2. 可控生成

推理代码只需修改请求参数如下:

  
wav = model.inference(  
    text='你好,欢迎使用语音合成服务。',  
    gender='female',  
    pitch='moderate',  
    speed='moderate',  
)  

  
yield speech len 2.38, rtf 1.649330443694812  
yield speech len 12.84, rtf 1.222021631734022  

TTS 通用的评估指标为 rtf,也即 推理耗时/生成音频耗时指标越低 ,代表推理速度越快!

可以发现,两种推理的 rtf 均大于 1

2.2 显存占用

首先,模型加载后的显存占用:

picture.image

推理时显存占用:

picture.image

相比 CosyVoice2 依然不占优势!

2.3 效果展示

由于插入音频比较麻烦,感兴趣的朋友可前往官网查看:https://sparkaudio.github.io/spark-tts/

这里只说一点:对于数字播报这一老大难问题,翻车了!

测试文本如下:

  
2024年12月21日,你好,欢迎使用语音合成服务,共收录2000余种语言。  

不知各位体验如何,欢迎评论区聊!

2.4 服务端部署

项目中没有提供部署代码,这里采用 FastAPI 完成服务端。(完整代码,可在文末自取

首先,定义一个数据模型,用于接收POST请求中的数据:

  
class TTSRequest(BaseModel):  
    tts\_text: str                       # 待合成的文本  
    voice\_id: Optional[str] = None      # 参考语音的id  
    voice\_text: Optional[str] = None    # 参考语音的文本  
    gender: Optional[str] = None        # 性别 female | male  
    pitch: Optional[str] = None         # 音高 very\_low | low | moderate | high | very\_high  
    speed: Optional[str] = None         # 语速 very\_low | low | moderate | high | very\_high  

接口功能函数:

  
@app.post("/sparktts")  
def tts(request: TTSRequest):  
    with torch.no\_grad():  
        if not request.tts\_text:  
            return JSONResponse(status\_code=400, content={'message': 'tts\_text is required'})  
        if request.voice\_id:  
            speech\_path = f'{current\_dir}/src/demos/{request.voice\_id}.wav'  
            if not os.path.exists(speech\_path):  
                return JSONResponse(status\_code=400, content={'message': f'voice\_id {request.voice\_id} not found'})  
            wav = model.inference(  
                request.tts\_text,  
                prompt\_speech\_path=speech\_path,  
            )  
        elif request.gender:  
            wav = model.inference(  
                request.tts\_text,  
                gender=request.gender,  
                pitch=request.pitch,  
                speed=request.speed,  
            )  
        else:  
            return JSONResponse(status\_code=400, content={'message': 'voice\_id or gender is required'})  
        headers = {  
            "Content-Type": "audio/pcm",  
            "X-Sample-Rate": "16000",  # 假设采样率是 16kHz  
            "X-Channel-Count": "1"     # 假设单声道  
        }  
        wav = (wav * 32767).astype(np.int16)  
        wav\_bytes = io.BytesIO()  
        wav\_bytes.write(wav.tobytes())  
        wav\_bytes.seek(0)  
        return StreamingResponse(wav\_bytes, media\_type='audio/pcm', headers=headers)  

注意:模型原始输出为 numpy,可转成 int16 以 pcm 格式输出。

最后,启动服务:

  
export CUDA\_VISIBLE\_DEVICES=0  
nohup uvicorn spark\_server:app --host 0.0.0.0 --port 3008 > server.log 2>&1 &  
echo "Server started"  

写在最后

本文分享了最新的开源语音克隆工具:Spark-TTS,并进行了本地部署实测。

有一说一,Spark-TTS 的生成保真度还是 OK 的,但就推理速度,相比 fish-speech / cosyvoice2,毫无优势可言。

如果对你有帮助,欢迎点赞收藏 备用。

本文服务部署代码已上传云盘,有需要的朋友,公众号后台回复spark自取!


为方便大家交流,新建了 AI 交流群,公众号后台「联系我」,拉你进群。

👇 关注猴哥,快速入门AI工具

picture.image

# AI 工具:

本地部署大模型?看这篇就够了,Ollama 部署和实战

盘点9家免费且靠谱的AI大模型 API,统一封装,任性调用!

免费GPU算力本地跑DeepSeek R1,无惧官方服务繁忙!

# AI应用** :**

弃坑 Coze,我把 Dify 接入了个人微信,AI小助理太强了

我把「FLUX」接入了「小爱」,微信直接出图,告别一切绘画软件!

202K 下载!最强开源OCR:本地部署,邀你围观体验

阿里开源TTS CosyVoice 再升级!语音克隆玩出新花样,支持流式输出

借 WeChatFerry 东风,我把微信机器人复活了!

成本不到50的AI对话机器人,如何自建服务端?自定义角色+语音克隆

0
0
0
0
关于作者

文章

0

获赞

0

收藏

0

相关资源
DataSail CDC 数据整库实时入仓入湖实践
在线数据库数据导入到数仓分析的链路已经存在多年,随着近年来实时计算的发展,业务希望有延迟更低、运维更便捷、效率更高的CDC同步通道。本次分享主要介绍DataSail实现CDC整库实时同步的技术方案和业务实践。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论