热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

我用飞桨Parakeet仅六步实现了一个语音合成模型

我用,飞,桨,parakeet,仅,六,步,实现,了,一

【飞桨开发者说】顾茜,PPDE飞桨开发者技术专家,烟草行业开发工程师,毕业于厦门大学数学科学学院,研究方向为:人工智能在烟草行业的应用。

该项目使用WaveFlow(Github地址:

https://github.com/PaddlePaddle/Parakeet/blob/develop/examples/waveflow/train.py)作为语音合成模型示例任务,并结合Transformer TTS验证语音合成效果。

 下载安装命令 ## CPU版本安装命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/cpu paddlepaddle ## GPU版本安装命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/gpu paddlepaddle-gpu

Parakeet是飞桨近期上新的语音合成套件,用于实现端到端的语音合成。如果您使用过各类读书app或者某些浏览器、插件的朗读功能,这些都是典型的TTS(Text To Speech)场景。本项目将使用WaveFlow语音合成模型完成相关任务,并结合Transformer TTS验证语音合成效果,比如输入“Hello World”,文字转语音效果如下。

WaveFlow模型介绍

WaveFlow来自百度研究院的论文WaveFlow: A Compact Flow-based Model for Raw Audio,飞桨复现了该语音合成模型。根据官网介绍,模型只有5.9M参数量,比经典的WaveGlow语音合成模型小了15倍,同时语音合成效果也非常好。WaveFlow和WaveGlow都是基于流的生成模型,它们和GAN都属于生成模型家族。

需要注意的是,WaveFlow是个vocoder(声码器,一种将声学参数转换成语音波形的工具),不能直接实现文字转语音,需要与Parakeet库中的TTS模型DeepVoice 3、Transformer TTS或FastSpeech模型结合,实现文字转语音的语音合成。

关于模型的详细介绍请参考:

  • WaveFlow论文地址:

    https://arxiv.org/abs/1912.01219

  • WaveFlow: A Compact Flow-Based Model for Raw Audio:

    http://research.baidu.com/Blog/index-view?id=139

  • 参考资料:理解基于流的生成模型

  • WaveGlow: a Flow-based Generative Network for Speech Synthesis:

    https://github.com/NVIDIA/waveglow

 

Transformer TTS文字转语音模型

 

Parakeet使用飞桨核心框架的动态图方式复现了Transformer TTS文字转语音模型,根据论文Neural Speech Synthesis with Transformer Network实现了基于Transformer的语音合成系统。

在这篇论文中,作者把Transformer和Tacotron2融合,形成了TransformerTTS。

"模型的主体还是Original Transformer,只是在输入阶段和输出阶段为了配合语音数据的特性做了改变。首先是Encoder的Input阶段,先将text逐字符转化为编号,方便Embedding,然后进入Encoder PreNet,这层网络由一个Embedding layer和三层卷积层构成,转化为512维的向量后,进入Transformer Encoder。

其次是Transformer的Decoder部分,分为Input和Output。Input通过一个PreNet,将80维的梅尔声谱图转化为512维向量,这里的PreNet是一个三层的全连接网络(个人认为论文中应当解释一下为什么Encoder的PreNet是用卷积设计的,而Decoder的PreNet由全连接网络就可以解决问题);Output部分与Tacotron2的设计完全一致。"

——摘自:基于Transformer的语音合成系统

Parakeet库中Transformer TTS支持两种vocoder,分别是Griffin-Lim algorithm和WaveFlow。WaveFlow属于基于深度神经网络的声码器,而Griffin-Lim是在仅知幅度谱、不知道相位谱的条件下重建语音的算法,属于经典声码器,算法简单,高效,但是合成的声音比较颤抖,机器感较强。

关于模型和声码器的详细介绍请参考:

  • Transformer TTS论文地址:

https://arxiv.org/abs/1809.08895

  • 基于Transformer的语音合成系统:

https://zhuanlan.zhihu.com/p/66931179

  • Griffin-lim算法:

https://blog.csdn.net/CSDN_71560364126/article/details/103968034

 

数据集介绍

 

本文实验中将会使用LJ Speech语音数据集。这个数据集由13100句短语音组成,时长共计24小时。所有语音由同一名说话人录制,录制设备是Macbook Pro的内建麦克风,采样率为22050Hz。LJSpeech数据集的地址:

https://keithito.com/LJ-Speech-Dataset/。

开发基于Parakeet的语音合成模型方法

下面咱们开始基于AI Studio开发基于Parakeet的语音合成模型。由于AI Studio上是Notebook的环境,所以在运行cd命令的时候前面需要加上百分号,而运行其它shell命令的时候,前面需要加上叹号。

第一步:下载Parakeet模型库

和PaddleDetection不同,目前Parakeet模型库目前文件还是比较少的,因此尽管在Gitee上没有镜像,直接去Github上拉取不需要花太长时间(一般也不会中断)。

 !git clone https://github.com/PaddlePaddle/Parakeet 

 

第二步:安装依赖库

安装 libsndfile1:

在Ubuntu上安装libsndfile1库。以Ubuntu操作系统为例,一定要装有libsndfile1这个开源声音文件格式处理库。libsndfile1库在其他平台上包名可能不同,比如在 centos 上包名为 libsndfile,可以用“sudo yum install libsndfile”安装。目前AI Studio已经内置了该处理库,无需额外安装。

 !sudo apt-get install libsndfile1 

安装 PaddlePaddle:

在AI Studio上,用户在创建项目过程中可以选择PaddlePaddle1.8.0环境,在该环境上WaveFlow可以正常训练。

安装 Parakeet:

 !git clone https://github.com/PaddlePaddle/Parakeet %cd Parakeet !pip install -e . 

安装 nltk中的美国英语CMU发音词典

 import nltk nltk.download("punkt") nltk.download("cmudict") 

在Notebook环境都比较简单,照做就行。如果执行nltk.download()时出现网络不通的报错,可以参考如下链接解决:

https://www.cnblogs.com/webRobot/p/6065831.html

 

第三步:准备数据集和预训练模型

Parakeet项目提供了WaveFlow模型在64, 96和128隐藏层大小(比如 128 则意味着每个隐藏层的大小是 128)下的预训练模型。本文将使用隐藏层大小为128的模型。

 !mkdir examples/waveflow/data !tar xjvf /home/aistudio/data/data35036/LJSpeech.tar.bz2 -C examples/waveflow/data/ !unzip /home/aistudio/data/data45064/waveflow_128.zip -d  examples/waveflow/ 

第四步:环境配置和YAML文件准备

1. 执行“export CUDA_VISIBLE_DEVICES=0”指定GPU

2.根据个人的任务需要修改配置文件。配置文件的位置在

Parakeet/examples/waveflow/configs/waveflow_ljspeech.yaml。读者可以根据需要改动一些超参数,例如使用预训练模型、调整learning_rate、batch_size等。

 

第五步:开始训练

执行如下命令调用train.py脚本启动训练。

 !cd examples/waveflow /home/aistudio/Parakeet/examples/waveflow !python train.py \     --cOnfig=./waveflow_res128_ljspeech_ckpt_1.0/waveflow_ljspeech.yaml \     --root=./data/LJSpeech-1.1 \     --name=finetune \     --checkpoint=./waveflow_res128_ljspeech_ckpt_1.0/step-2000000 \     --batch_size=8 \     --use_gpu=true 

查看评估指标:

1. Train-Loss 训练集上loss变化趋势:

2. Valid-Avg-Loss 验证集上loss变化趋势:

3. Valid-7th-Flow-Log_s 模型中的第7个流生成的log scale:

第六步:使用Transformer TTS + WaveFlow实现文字转语音(TTS)

在Parakeet模型库中,Deep Voice 3、Transformer TTS或FastSpeech是TTS模型,下面演示如何使用训练好的WaveFlow模型权重作为声码器,通过Transformer TTS实现文字转语音。

Transformer TTS的训练过程与WaveFlow非常类似,本文直接使用Parakeet项目中提供的预训练模型演示效果,使用时需要同时配置Transformer TTS和WaveFlow的预训练模型权重。

在Transformer TTS的示例中,最终会将下面这段文字转为语音:

“Life was like a box of chocolates, you never know what you're gonna get.”

也可以修改

Parakeet/examples/transformer_tts/synthesis.py文件中synthesis()方法的输入,合成我们想要的其它英文,比如Hello world!

 if __name__ == '__main__':     parser = argparse.ArgumentParser(description="Synthesis model")     add_config_options_to_parser(parser)     args = parser.parse_args()     # Print the whole config setting.     pprint(vars(args))     synthesis(         "Hello world!",         args) 

切换目录到TransformerTTS示例

 !cd /home/aistudio/Parakeet/examples/transformer_tts 

下载并解压Transformer TTS预训练模型

 !wget https://paddlespeech.bj.bcebos.com/Parakeet/transformer_tts_ljspeech_ckpt_1.0.zip !unzip transformer_tts_ljspeech_ckpt_1.0.zip -d transformer_tts_ljspeech_ckpt_1.0/ !python synthesis.py \     --use_gpu=1 \     --output='./synthesis' \     --cOnfig='transformer_tts_ljspeech_ckpt_1.0/ljspeech.yaml' \     --checkpoint_transformer='./transformer_tts_ljspeech_ckpt_1.0/step-120000' \     --vocoder='waveflow' \     --config_vocoder='../waveflow/waveflow_res128_ljspeech_ckpt_1.0/waveflow_ljspeech.yaml' \     --checkpoint_vocoder='../waveflow/runs/waveflow/finetune/checkpoint/step-2010000' 
 {'checkpoint_transformer''./transformer_tts_ljspeech_ckpt_1.0/step-120000', 'checkpoint_vocoder''../waveflow/runs/waveflow/finetune/checkpoint/step-2010000', 'config''transformer_tts_ljspeech_ckpt_1.0/ljspeech.yaml', 'config_vocoder''../waveflow/waveflow_res128_ljspeech_ckpt_1.0/waveflow_ljspeech.yaml', 'max_len'1000, 'output''./synthesis', 'stop_threshold'0.5, 'use_gpu'1, 'vocoder''waveflow'} [checkpoint] Rank 0: loaded model from ./transformer_tts_ljspeech_ckpt_1.0/step-120000.pdparams [checkpoint] Rank 0: loaded model from ../waveflow/runs/waveflow/finetune/checkpoint/step-2010000.pdparams Synthesis completed !!! 

使用如下代码即可在Notebook中试听音频效果:

 import IPython IPython.display.Audio('./synthesis/samples/waveflow.wav') 
 下载安装命令 ## CPU版本安装命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/cpu paddlepaddle ## GPU版本安装命令 pip install -f https://paddlepaddle.org.cn/pip/oschina/gpu paddlepaddle-gpu 

>> 访问 PaddlePaddle 官网,了解更多相关内容


推荐阅读
  • jQuery Flot 数据可视化插件:高效绘制图表的专业工具
    jQuery Flot 是一款高效的数据可视化插件,专为绘制各种图表而设计。该工具支持丰富的图表类型和自定义选项,适用于多种应用场景。用户可以通过其官方网站获取示例代码和下载资源,以便快速上手和使用。 ... [详细]
  • 表面缺陷检测数据集综述及GitHub开源项目推荐
    本文综述了表面缺陷检测领域的数据集,并推荐了多个GitHub上的开源项目。通过对现有文献和数据集的系统整理,为研究人员提供了全面的资源参考,有助于推动该领域的发展和技术进步。 ... [详细]
  • 【前端开发】深入探讨 RequireJS 与性能优化策略
    随着前端技术的迅速发展,RequireJS虽然不再像以往那样吸引关注,但其在模块化加载方面的优势仍然值得深入探讨。本文将详细介绍RequireJS的基本概念及其作为模块加载工具的核心功能,并重点分析其性能优化策略,帮助开发者更好地理解和应用这一工具,提升前端项目的加载速度和整体性能。 ... [详细]
  • 进程(Process)是指计算机中程序对特定数据集的一次运行活动,是系统资源分配与调度的核心单元,构成了操作系统架构的基础。在早期以进程为中心的计算机体系结构中,进程被视为程序的执行实例,其状态和控制信息通过任务描述符(task_struct)进行管理和维护。本文将深入探讨进程的概念及其关键数据结构task_struct,解析其在操作系统中的作用和实现机制。 ... [详细]
  • 在处理大规模并发请求时,传统的多线程或多进程模型往往无法有效解决性能瓶颈问题。尽管它们在处理小规模任务时能提升效率,但在高并发场景下,系统资源的过度消耗和上下文切换的开销会显著降低整体性能。相比之下,Python 的 `asyncio` 模块通过协程提供了一种轻量级且高效的并发解决方案。本文将深入解析 `asyncio` 模块的原理及其在实际应用中的优化技巧,帮助开发者更好地利用协程技术提升程序性能。 ... [详细]
  • 2019年后蚂蚁集团与拼多多面试经验详述与深度剖析
    2019年后蚂蚁集团与拼多多面试经验详述与深度剖析 ... [详细]
  • 本文提供了 RabbitMQ 3.7 的快速上手指南,详细介绍了环境搭建、生产者和消费者的配置与使用。通过官方教程的指引,读者可以轻松完成初步测试和实践,快速掌握 RabbitMQ 的核心功能和基本操作。 ... [详细]
  • Django框架进阶教程:掌握Ajax请求的基础知识与应用技巧
    本教程深入探讨了Django框架中Ajax请求的核心概念与实用技巧,帮助开发者掌握异步数据交互的方法,提升Web应用的响应速度和用户体验。通过实例解析,详细介绍了如何在Django项目中高效实现Ajax请求,涵盖从基础配置到复杂场景的应用。 ... [详细]
  • 深入解析 Unity URP/SRP 渲染管线:匠心打造的全面指南
    本文深入探讨了Unity中的URP、SRP和HDRP渲染管线,详细解析了它们之间的关系及各自的特点。首先介绍了SRP的基本概念及其在Unity渲染架构中的作用,随后重点阐述了URP和HDRP的设计理念与应用场景。文章还分析了SRP诞生的背景,解释了为何Unity需要引入这一灵活的渲染框架,以满足不同项目的需求。通过对比URP和HDRP,读者可以更好地理解如何选择合适的渲染管线,以优化项目的性能和视觉效果。 ... [详细]
  • 作为140字符的开创者,Twitter看似简单却异常复杂。其简洁之处在于仅用140个字符就能实现信息的高效传播,甚至在多次全球性事件中超越传统媒体的速度。然而,为了支持2亿用户的高效使用,其背后的技术架构和系统设计则极为复杂,涉及高并发处理、数据存储和实时传输等多个技术挑战。 ... [详细]
  • MVVM架构~mvc,mvp,mvvm大话开篇
    返回目录百度百科的定义:MVP是从经典的模式MVC演变而来,它们的基本思想有相通的地方:ControllerPresenter负责逻辑的处理,Model提供数据,View负责显示。作为一种新的模 ... [详细]
  • 本文深入探讨了IO复用技术的原理与实现,重点分析了其在解决C10K问题中的关键作用。IO复用技术允许单个进程同时管理多个IO对象,如文件、套接字和管道等,通过系统调用如`select`、`poll`和`epoll`,高效地处理大量并发连接。文章详细介绍了这些技术的工作机制,并结合实际案例,展示了它们在高并发场景下的应用效果。 ... [详细]
  • HTML5大文件传输技术深度解析与实践分享
    本文深入探讨了HTML5在Web前端开发中实现大文件上传的技术细节与实践方法。通过实例分析,详细讲解了如何利用HTML5的相关特性高效、稳定地处理大文件传输问题,并提供了可供参考的代码示例和解决方案。此外,文章还讨论了常见的技术挑战及优化策略,旨在帮助开发者更好地理解和应用HTML5大文件上传技术。 ... [详细]
  • Bits模块中rollsum.go文件的Off-by-One错误分析与修复 ... [详细]
  • GitHub项目精讲:大型系统设计的学习资源与实践指南
    https://github.com/donnemartin/system-design-primer/blob/master/README-zh-Hans.md 提供了一套全面的系统设计学习资源与实践指南。该项目不仅涵盖了系统设计的基本概念和原则,还详细介绍了如何构建可扩展、高性能的大型分布式系统。通过实例分析和代码示例,帮助读者深入理解系统设计的关键要素和技术实现,适合各阶段的开发者参考和学习。 ... [详细]
author-avatar
JJJppp123
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有