丹摩征文活动 |【AI落地应用实战】文本生成语音Parler-TTS + DAMODEL复现指南

目录

  • 一、Parler-TTS简介
    • 1.1、TTS 模型
    • 1.2、Parler-TTS
  • 二、Parler-TTS复现流程
    • 2.1、创建实例
    • 2.2、配置代码与环境
    • 2.3、配置预训练模型
    • 2.4、Parles-TTS使用

Parler-TTS 是一个由 Hugging Face 开源的文本生成语音 (Text-to-Speech, TTS) 模型。它的设计目的是生成高质量的语音输出,支持自然的语调和流畅的语音合成。Parler-TTS 能够将输入的文本转化为逼真的语音,适用于各种语音生成应用场景,如虚拟助理、有声书、语音生成内容等。

代码仓库:https://github.com/huggingface/parler-tts
论文地址:https://arxiv.org/html/2402.01912v1
本篇将解析Parler-TTS原理,并使用丹摩服务器进行部署复现与初步体验。

一、Parler-TTS简介

1.1、TTS 模型

传统的 TTS 模型在处理语音合成时,通常依赖大规模的语音数据集,并采用人类标注的音素、音节等细粒度信息。然而,这种方式存在标注过程耗时且昂贵和人工标注可能带有主观性和误差的问题

为了解决这些问题,Dan Lyth和Simon King的研究论文Natural language guidance of high-fidelity text-to-speech with synthetic annotations提出使用自然语言的指导信息结合合成标注,使模型更好地理解上下文语境,从而生成更加高保真的语音。

该方法的核心在于用自然语言注释驱动 TTS 模型。即,通过自然语言描述声音属性(如情感、重音、语气等)来指导语音合成。这些描述会生成相应的合成标注,从而使模型能够灵活地根据不同的语境和情感需求生成语音。
在这里插入图片描述
论文提出的模型结构如上所示,主要包括以下模块:

  • 文本编码器:负责将输入的文本转化为文本特征向量,并结合自然语言注释生成上下文向量。
  • 注释生成器:该模块根据输入的文本生成一系列合成注释,包括情感、语气、音调等多种特征。注释生成器会自动学习文本中的关键情感信息和重音信息。
  • 解码器(语音生成器):负责将编码器生成的上下文特征与注释信息结合,生成高质量的语音输出。该解码器通常采用基于卷积和自注意力机制的架构,以确保语音合成的高保真度和流畅度。

1.2、Parler-TTS

基于这样的原理,Parler-TTS开发了一款轻量级的文本转语音模型,能够生成高质量、自然的声音,模仿特定说话者的风格(如性别、音调、说话风格等)。与其他TTS模型不同,Parler-TTS是一个完全开源的项目,包括数据集、预处理、训练代码和权重,均在宽松的许可下公开发布,鼓励社区在此基础上进一步开发和创新。其主要特点有:

  1. 多语种支持:Parler-TTS 具备多种语言和方言支持,可以合成不同语种的语音,这让它在跨语言应用中具有很高的实用性。
  2. 高质量音频输出:模型经过优化,能够生成接近真实的语音,带有自然的语调、停顿、重音和情感变化。
  3. 开源社区支持:Parler-TTS 依托 Hugging Face 社区,用户可以对其进行二次开发和调整,以适应特定需求,并在 GitHub 仓库上找到相关代码和模型权重。
  4. 兼容 Hugging Face 生态系统:模型可以轻松地集成到 Hugging Face 的 Transformers 和 Datasets 等库中,便于模型调用和训练。

二、Parler-TTS复现流程

本次实验选择了DAMODEL(丹摩智算)平台,丹摩平台一直致力于提供丰富的算力资源与基础设施助力AI应用的开发、训练、部署。

2.1、创建实例

首先进入丹摩控制台,点击创建实例:
在这里插入图片描述
本次实验采用的文本转语音模型为轻量级模型,基本上选择Tesla-P40或者3090就可以满足条件
在这里插入图片描述
数据硬盘上可以选择默认的50GB,镜像上可以直接选择PyTorch1.13.1、Python3.10.8、CUDA11.6版本:
在这里插入图片描述

2.2、配置代码与环境

首先打开Jupyter,在终端输入git clone https://gitee.com/ctllin/parler-tts克隆仓库代码,完整的项目结构如左侧所示:
在这里插入图片描述
其次输入pip install git+https://gitee.com/ctllin/parler-tts安装依赖环境:
在这里插入图片描述
然后我们在项目目录下新建一个test.py文件,在其中编写以下代码:

from parler_tts import ParlerTTSForConditionalGeneration
from transformers import AutoTokenizer
import soundfile as sf
import torchdevice = "cuda:0" if torch.cuda.is_available() else "cpu"model = ParlerTTSForConditionalGeneration.from_pretrained("parler-tts/parler_tts_mini_v0.1").to(device)
tokenizer = AutoTokenizer.from_pretrained("parler-tts/parler_tts_mini_v0.1")prompt = "Hey, how are you doing today?"
description = "A female speaker with a slightly low-pitched voice delivers her words quite expressively, in a very confined sounding environment with clear audio quality. She speaks very fast."input_ids = tokenizer(description, return_tensors="pt").input_ids.to(device)
prompt_input_ids = tokenizer(prompt, return_tensors="pt").input_ids.to(device)generation = model.generate(input_ids=input_ids, prompt_input_ids=prompt_input_ids)
audio_arr = generation.cpu().numpy().squeeze()
sf.write("parler_tts_out.wav", audio_arr, model.config.sampling_rate)

代码使用 Parler-TTS 模型将带有风格描述的文本输入转换成语音,生成一段语音文件parler_tts_out.wav

2.3、配置预训练模型

配置好代码与环境后,可以输入python test.py进行运行,但是此时一般会碰见以下报错:

OSError: We couldn't connect to 'https://huggingface.co' to load this file, couldn't find it in the cached files and it looks like parler-tts/parler_tts_mini_v0.1 is not the path to a directory containing a file named config.json.
Checkout your internet connection or see how to run the library in offline mode at 'https://huggingface.co/docs/transformers/installation#offline-mode'.

这个报错是因为因为网络原因,from_pretrained 方法在 Hugging Face Hub 上找不到指定的模型文件,模型加载失败,所以我们需要去huggingface上下载预训练模型。

进入https://hf-mirror.com/parler-tts/parler_tts_mini_v0.1/tree/main,可以看到预训练模型的结构如下:

在这里插入图片描述
将其全部下载并上传到服务器当中(也可以使用wget命令进行下载)放入到新建的model文件夹里,当然这里仅仅演示miniv0.1模型的效果,该项目后续还推出了large模型以及miniv1.0、1.1版本,可以进行体验。下载完成后,模型结构如下图所示:

在这里插入图片描述
并将test.py代码中加载预训练模型的两句改为从本地加载:

在这里插入图片描述

2.4、Parles-TTS使用

cd进入Parler-tts项目,然后终端输入python test.py
在这里插入图片描述
如果遇到ValueError: 'dac' is already used by a Transformers config, pick another name.错误,说明transformers的版本没有安装正确,需要安装transformers4.40.0版本,可以终端输入pip install transformers==4.40.0解决该问题。

在这里插入图片描述
项目成功运行后,会生成一个wav的录音文件,可以下载到本地播放,效果非常的不错,而且可以控制音色,看起来有很大的商用价值当然如果想要生成长语音、别的音色、AI配音讲故事,可以修改test.py代码中的prompt和description

prompt = "Hey, how are you doing today?"
description = "A female speaker with a slightly low-pitched voice delivers her words quite expressively, in a very confined sounding environment with clear audio quality. She speaks very fast."

另外,其还提供了训练的策略及方法,可以通过引入高质量的语音数据和语音描述来生成更具表现力的语音输出,具体步骤可以查看官方仓库。

在这里插入图片描述
最后,感谢丹摩为本文提供算力支持,除了常规的4090显卡和P40显卡,DAMODEL(丹摩智算)还具备A800、H800系列显卡,目前双十一活动火热进行中,值得关注!
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/9625.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【QT项目】QT6项目之基于C++的通讯录管理系统(联系人/学生管理系统)

目录 一.项目背景 二.创建工程 工程创建 添加文件 联系人类 功能类 三.功能实现 联系人类 person.cpp person.h 查 查询按钮槽函数 返回按钮槽函数 findperson.cpp: 增 addperson.cpp: 删 deleteperson.cpp: 改 changeperson.cpp&#xff1a…

一文详谈领域驱动设计实践

作者:泊静 阿里云开发者 导读 本文作者结合在团队的实践过程,分享了自己对领域驱动设计的一些思考。 了解过领域驱动设计的同学都知道,人们常常把领域驱动设计分为两部分:战术设计和战略设计。这两个概念本身都是抽象的&#xff…

单链表OJ思路

目录 前言 一、移除链表元素 二、反转链表 三、链表的中间结点 四、返回倒数第k个结点 五、合并两个有序链表 六、链表分割 七、链表的回文结构 八、相交链表 九、环形链表 十、环形链表|| 十一、随机链表的赋值 前言 11道单链表OJ题的解题思路。 一、移除链表元素 链接&#…

数据结构与算法——Java实现 54.力扣1008题——前序遍历构造二叉搜索树

不要谩骂以前的自己 他当时一个人站在雾里也很迷茫 ​​​​​​​ ​​​​​​​ ​​​​​​​—— 24.11.6 1008. 前序遍历构造二叉搜索树 给定一个整数数组,它表示BST(即 二叉搜索树 )的 先序遍历 ,构造树并返回其根。 保证 对于给定…

【Qt聊天室客户端】单聊与群聊

1. 区分单聊和群聊 逻辑分析 具体实现逻辑 主窗口完善判断单聊还是群聊的逻辑 单聊会话详情入口中,设置头像和昵称 2. 删除好友 直接找到删除好友的按钮,然后实现其删除逻辑即可 具体实现 无法删除好友BUG处理 问题复现,点击好友删除后&…

1.集合体系补充(1)

1.接口式引用 集合的构造,我们需要采用接口类型引用的的方式,这样做的好处就是方便根据业务或者设计上的变化,快速更换具体的实现。 事实上,Java集合设计体系者也是支持我们这样做的,并且集合体系的设计也是如此的。 创…

枚举及优化(一)

第1题 百钱买百鸡 查看测评数据信息 百钱买百鸡问题:公鸡五文钱一只,母鸡三文钱一只,小鸡三只一文钱,用 100 文钱买 100只鸡,公鸡、母鸡、小鸡各买多少只?本程序要求解的问题是:给定一个正整…

自注意力机制

当输入一系列向量,想要考虑其中一个向量与其他向量之间的关系,决定这个向量最后的输出 任意两个向量之间的关系计算 计算其他向量对a1的关联性 多头注意力机制 图像也可以看成一系列的向量,交给自注意力机制处理,CNN是特殊的自注意…

RabbitMQ的死信队列

1.死信的概念 死信简单理解就是因为种种原因,无法被消费的消息. 有死信自然就有死信队列,消息再一个队列中编程死信之后,它能被重新发送到另一个交换器中,这个交换器就是DLX,绑定DLX的队列,就被称为死信队…

十六 MyBatis使用PageHelper

十六、MyBatis使用PageHelper 16.1 limit分页 mysql的limit后面两个数字: 第一个数字:startIndex(起始下标。下标从0开始。)第二个数字:pageSize(每页显示的记录条数) 假设已知页码pageNum&…

SpringBoot框架在共享汽车管理中的应用

3系统分析 3.1可行性分析 通过对本共享汽车管理系统实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本共享汽车管理系统采用SSM框架,JAVA作为开发语…

数字化转型助手 快鲸SCRM系统为企业营销赋能

内容概要 在当今这个快速变化的商业环境中,数字化转型已经成为企业生存与发展的关键要素。无论是零售、制造还是服务行业,企业都深刻意识到传统工作模式的局限性,必须借助先进的技术来优化运营和提升客户体验。快鲸SCRM系统就是这样一款数字…

ZooKeeper在kafka集群中有何作用

Zookeeper 存储的 Kafka 信息 (1)启动 Zookeeper 客户端。 bin/zkCli.sh (2)通过 ls 命令可以查看 kafka 相关信息。 [zk: localhost:2181(CONNECTED) 2] ls /kafkazk中有一个节点 consumers 这个里面,老版本0.9版…

Linux操作系统:学习进程_对进程概念的深入了解

目录 前言 开篇 一、进程概念 二、进程的描述与管理 1、如何描述与管理 2、Linux中的PCB-task_struct 3、对进程组织的理解 三、进程的属性 1、系统创建进程 2、查看进程 3、进程的标识符 4、退出进程 1>ctrlc 2>kill命令杀死进程 5、用户进程的创建方式…

Embedding 技术在推荐系统中的应用

参考自《深度学习推荐系统》——王喆,用于学习和记录。 介绍 Embedding,中文直译为“嵌入”,常被翻译为“向量化”或者“向量映射”。它的主要作用是将稀疏向量转换成稠密向量,便于上层深度神经网络处理。事实上,Emb…

Kafka面试题

1、kafka消息发送的流程? 在消息发送时涉及到了两个线程,main 线程 和 sender 线程 ,在main线程里面创建了一个双端队列(RecordAccumulator) ,当双端队列里面的信息满足 一定的条件后, sender线程会拉取双端…

RabbitMQ延迟队列(重要)

RabbitMQ延迟队列 1、延迟队列1.1、延迟队列使用场景1.2、延迟队列实现原理 2、使用rabbitmq-delayed-message-exchange 延迟插件2.1、下载2.2、安装2.2.1、解压2.2.2、启用插件2.2.3、查询安装情况 2.4、示例2.4.1、RabbitConfig配置类(关键代码)2.4.2、…

机器学习—神经网络如何高效实现

深度学习研究人员能够扩展神经网络的原因之一,在过去的十年里建立了非常大的神经网络,是因为神经网络可以向量化,它们可以使用矩阵乘法非常有效的实现,事实证明,并行计算硬件,包括gpus,但也有一…

【数据集】【YOLO】【目标检测】水面船只识别数据集 9798 张,YOLO船只识别算法实战训练教程!

一、数据集介绍 【数据集】水面船只识别数据集 9798 张,目标检测,包含YOLO/VOC格式标注。 数据集中包含1种分类:{0: ship},代表水面船只。 数据集来自国内外图片网站和视频截图; 可用于无人机船只检测、监控灯塔船…

斜坡函数功能块(支持正常停机和紧急停机切换)

1、CODESYS斜坡函数功能块 CODESYS斜坡函数功能块(ST源代码)_用plc难能写一个斜坡加减速度吗-CSDN博客文章浏览阅读1k次。本文介绍了如何在CODESYS平台上创建斜坡函数功能块(FC),用于PID闭环控制中的给定值平滑处理。通过ST源代码实现,详细步骤包括仿真测试、变量修改、FC…