当前位置: 首页 > 编程日记 > 正文

python语音合成 标贝_tacotronV2 + wavernn 实现中文语音合成(Tensorflow + pytorch)

TacotronV2 + WaveRNN

开源中文语音数据集标贝(女声)训练中文TacotronV2,实现中文到声学特征(Mel)转换的声学模型。在GTA模式下,利用训练好的TacotronV2合成标贝语音数据集中中文对应的Mel特征,作为声码器WaveRNN的训练数据。在合成阶段,利用TactornV2和WaveRNN合成高质量、高自然度的中文语音。

从THCHS-30任选一个speaker的语音数据集,微调TacotronV2中的部分参数,实现说话人转换。

Tensorflow serving + Flask 部署TacotronV2中文语音合成服务。

由于TacotronV2TacotronV2中采用Location sensitive attention,对长句字的建模能力不好(漏读、重复),尝试了GMM attention、Discrete Graves Attentionissue、Forward attention,能有效地解决对长句的建模能力,加快模型收敛速度。

tensorflow-gpu的版本为1.14.0

测试语音合成的效果(确保相关的库已经安装)

git clone https://github.com/lturing/tacotronv2_wavernn_chinese.git

cd tacotronv2_wavernn_chinese

python tacotron_synthesize.py --text '现在是凌晨零点二十七分,帮您订好上午八点的闹钟。'

#合成的wav、attention align等在./tacotron_inference_output下

#由于在inference阶段,模型中的dropout没有关闭,相同的输入text,合成的wav的韵律等有轻微的不同

训练TacotronV2模型

训练数据集预处理

中文标点符号处理

对于中文标点符号,只保留',。?!'四种符号,其余符号按照相应规则转换到这四个符号之一。

中文到拼音转换code

利用字拼音文件和词拼音文件,实现中文到拼音转换,能有效消除多音字的干扰。具体步骤如下:

对于每个句子中汉字从左到右的顺序,优先从词拼音库中查找是否存在以该汉字开头的词并检查该汉字后面的汉字是否与该词匹配,若满足条件,直接从词库中获取拼音,若不满足条件,从字拼音库中获取该汉字的拼音。

对于数字(整数、小数)、ip地址等,首先根据规则转化成文字,比如整数2345转化为二千三百四十五,再转化为拼音。

由于输入是文字转化而来的拼音序列,所以在合成阶段,允许部分或全部的拼音输入。

注优先从词文件中寻找拼音,也会带来错误的拼音(也许先分词能解决),所以本项目支持中文和拼音混合输入

TacotronV2训练数据集预处理

dataset = '/home/spurs/tts/dataset/bznsyp', #标贝数据集的根目录,其wav文件在 dataset/bznsyp下

base_dir = '/home/spurs/tts/dataset',

feat_out_dir = 'training_data_v1',

tacotron_input = '/home/spurs/tts/dataset/bznsyp/training_data_v1/train.txt',

执行如下脚本,生成TacotronV2的训练数据集

python tacotron_preprocess.py

训练TacotronV2模型

执行如下脚本,训练TacotronV2模型

python tacotron_train.py

TacotronV2合成Mel频谱

TacotronV2生成Mel文件,利用griffin lim算法恢复语音,修改脚本 tacotron_synthesize.py 中text

python tacotron_synthesize.py

或命令行输入

python tacotron_synthesize.py --text '国内知名的视频弹幕网站,这里有最及时的动漫新番。'

改进部分

由于语音合成中的音素(拼音)到声学参数(Mel频谱)是从左到右的单调递增的对应关系,特别地,在合成阶段,对forward attention中的alignments的计算过程的特殊处理,能进一步提高模型对长句子的语音合成效果,以及控制语速。

说话人转换(speaker adaptive)

TactronV2支持finetune,固定decoder层前的参数(embedding层、CHBG、encoder层等),用新数据集(数据量很少)训练从checkpoint中恢复的模型,达到speaker adpative的目的。

训练WaveRNN模型

Wavernn训练数据集准备

利用训练好的TacotronV2对标贝语音数据集在GTA(global teacher alignment)模式下,生成对应的Mel特征。需要注意的如下:

TacotronV2中的mel输出的范围为[-hparmas.max_abs_value, hparams.max_abs_value],而WaveRNN中的mel的范围[0, 1],故需要将TacotronV2输出mel特征变为[0, 1]范围内。

TacotronV2中的hop_size为275,需要将WaveRNN中的voc_upsample_factors的值改为(5, 5, 11)(注上采样的比例, 或者(x, y, z),并且x * y * z = hop_size)。

Wavernn中voc_mode设为RAW,bits为10,故需要将wav文件转换到相应格式。

python wavernn_preprocess.py #利用训练好的TacotronV2生成Wavernn的训练数据

Wavernn模型训练

训练前需要切换到pytorch conda环境,例如:

conda activate torch1.0 #切换到pytorch分支

训练模型

python wavernn_train.py

Wavernn模型评估

python wavernn_gen.py --file path_to_mel_generated_by_tacotronv2

服务部署

额外参照文献

相关文章:

SpringBoot接口防抖(防重复提交)的一些实现方案

作为一名老码农,在开发后端Java业务系统,包括各种管理后台和小程序等。在这些项目中,我设计过单/多租户体系系统,对接过许多开放平台,也搞过消息中心这类较为复杂的应用,但幸运的是,我至今还没有遇到过线上系统由于代码崩溃导致资损的情况。这其中的原因有三点:一是业务系统本身并不复杂;二是我一直遵循某大厂代码规约,在开发过程中尽可能按规约编写代码;三是经过多年的开发经验积累,我成为了一名熟练工,掌握了一些实用的技巧。啥是防抖所谓防抖,一是防用户手抖,二是防网络抖动。

OC语言基础笔记

OC方面的基础笔记:1.类的基本用法#import <Foundation/Foundation.h>// 大体上就是include, 用于包含头文件, 但是即使头文件中, 没有ifndef defined endif, 仍然能够踢除重复包含的头文件// ----interface section----// OC中声明和实现是分离的, 两个都必须有.interfac…

Docker 数据卷之进阶篇

Docker 数据卷之进阶篇 原文:Docker 数据卷之进阶篇笔者在《Docker 基础 : 数据管理》一文中介绍了 docker 数据卷(volume) 的基本用法。随着使用的深入&#xff0c;笔者对 docker 数据卷的理解与认识也在不断的增强。本文将在前文的基础上介绍 docker 数据卷的原理及一些高级用…

leetcode-232 用栈实现队列

使用栈实现队列的下列操作&#xff1a; push(x) – 将一个元素放入队列的尾部。pop() – 从队列首部移除元素。peek() – 返回队列首部的元素。empty() – 返回队列是否为空 栈的特点&#xff1a;后入先出 队列的特点&#xff1a;先入先出 使用一个数据栈&#xff0c;一个辅…

sparkcore分区_Spark学习:Spark源码和调优简介 Spark Core (二)

本文基于 Spark 2.4.4 版本的源码&#xff0c;试图分析其 Core 模块的部分实现原理&#xff0c;其中如有错误&#xff0c;请指正。为了简化论述&#xff0c;将部分细节放到了源码中作为注释&#xff0c;因此正文中是主要内容。第一部分内容见&#xff1a;Spark学习&#xff1a;…

Tips——IndexSearcher自动更新

情景描述 为了调高效率&#xff0c;创建全局变量IndexReader取代每次查询新建IndexReader所带来的效率问题。 当时每天会更新一边索引8.23号部署的Index服务&#xff0c;Search服务&#xff0c;结果index都更新到了8.25&#xff0c;查询结果还是8.23的 Tips分享 先来看一下Inde…

公司运作 - 利润率、周转率

公司一般由市场部、研发部、财务部、人力资源部及其他辅助部门组成。分成了几个层面&#xff0c;如下&#xff1a; 宏观层面&#xff1a;业务范围、业务定位、专业化、多元化部门层面&#xff1a;各部门绩效、部门职责主体层面&#xff1a;跨部门事务&#xff0c;如产品研发涉及…

测试用例设计方法基础理论知识

一、什么是测试用例 测试用例设计&#xff1a;将软件测试的行为活动&#xff0c;作为一个科学化的组织归纳。 测试用例&#xff1a;设计一个情况&#xff0c;软件程序在这种情况下&#xff0c;必须能够正常运行并且达到程序所设计的执行结果。 因为我们不可能进行穷举测试&…

leetcode-155 最小栈

设计一个支持 push&#xff0c;pop&#xff0c;top 操作&#xff0c;并能在常数时间内检索到最小元素的栈。 push(x) – 将元素 x 推入栈中。pop() – 删除栈顶的元素。top() – 获取栈顶元素。getMin() – 检索栈中的最小元素。 示例&#xff1a; MinStack minStack new Mi…

legend位置 pyecharts_可视化入门 | pyecharts全局配置项详解

更多文章&#xff0c;请见&#xff1a;http://mp.weixin.qq.com/mp/homepage?__bizMzIxODczMDUwOA&hid2&sn7928727456d49032f08ef1fcf0ee719e&scene18#wechat_redirect​mp.weixin.qq.com大家好&#xff0c;我是你们的机房老哥&#xff01; 计算机绘图是老哥很早就…

查询Master下的系统表和系统视图获取数据库的信息和简单的渗透测试

在SQL中可以通过查询Master下的系统表&#xff08;sys&#xff09;和系统视图&#xff08;information_schema&#xff09;获取数据库的信息。SQL2000和SQL2005的结构略有不同。 系统表结构参考系统表详细说明。 系统信息结构图参考&#xff1a;http://dev.mysql.com/doc/refma…

cocos2d-x android 移植 问题

为什么80%的码农都做不了架构师&#xff1f;>>> 由于android系统目前没有将boost加入&#xff0c;这里面使用了大量的STL及C的一些语言特性&#xff0c;导致编译出现令人非常头痛的问题。 1、出现类似的异常函数错误 boost/exception/detail/exception_ptr.hpp:382…

python插入排序演示源码

工作闲暇时间&#xff0c;把写内容过程较好的内容段做个备份&#xff0c;下面的内容内容是关于python插入排序演示的内容&#xff0c;应该能对各朋友也有用处。 def insert_sort(t): for i in xrange(len(t)): key t[i] j i - 1 while j>-1 and t[j]>key:#如果当前值比…

leetcode-215 数组中的第K个最大元素

在未排序的数组中找到第 k 个最大的元素。请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。 示例 1: 输入: [3,2,1,5,6,4] 和 k 2 输出: 5 该题比较简洁的解法&#xff0c;我们使用堆来完成 最小堆&#xff1a;即堆顶为所…

c++ double 只输出五位_c 语言第四章 在控制台上数据的输入和输出

1 数据输出我们之前已经使用过printf()函数来实现数据在控制台上输出#include<stdio.h> int main(){printf("hello world");return 0; }具体的用法是printf("数据模板",数据1,数据2,...)// 数据模板表示输出数据的形式,里面包含占位符,打印的时候使用…

pyQt 每日一练习 -- 登录框

#codingutf-8#第一个练习&#xff0c;登录框import sys from PyQt4 import QtGui,QtCore#登录框 class LoginBox(QtGui.QWidget):def __init__(self):super(LoginBox, self).__init__()self.initUI()def initUI(self):vBoxLayout QtGui.QVBoxLayout()hBoxLayout_1 QtGui.QHBo…

photoshop CS5 Dreamweaver CS5序列号及完美破解方法

adobe photoshop CS5 的序列号&#xff08;任选一个&#xff09;1330-1440-1602-3671-9749-78971330-1191-2998-6712-2520-54241330-1367-4285-4928-0630-31071330-1570-9599-9499-8092-82371330-1028-1662-3206-1688-51141330-1631-5733-5042-4138-6389 Adobe Dreamweaver CS…

[原创]Android Monkey 在线日志分析工具开发

[原创]Android Monkey 在线日志分析工具开发 在移动App测试过程中,Monkey测试是我们发现潜在问题的一种非常有效手段&#xff0c;但是Android原生的Monkey有其天然的不足&#xff0c;数据不能有效的去解读&#xff0c;同时也不能提供非常清晰的信息&#xff0c;所以针对这个问题…

leetcode-295 数据流的中位数

中位数是有序列表中间的数。如果列表长度是偶数&#xff0c;中位数则是中间两个数的平均值。 例如&#xff0c; [2,3,4] 的中位数是 3 [2,3] 的中位数是 (2 3) / 2 2.5 设计一个支持以下两种操作的数据结构&#xff1a; void addNum(int num) - 从数据流中添加一个整数到数…

Servlet开发入门

Servlet是sun公司提供的一门用于开发动态web资源的技术。 Sun公司在其API中提供了一个servlet接口&#xff0c;用户若想开发一个动态web资源(即开发一个Java程序向浏览器输出数据)&#xff0c;需要完成以下2个步骤&#xff1a; 编写一个Java类&#xff0c;实现servlet接口。把开…

#串口通信超时处理_简单通信协议

用C语言做物联网网关开发时&#xff0c;经常需要通过串口、485接口等从一些传感器读取数据&#xff0c;由于网关设备和传感器所处的环境复杂多样&#xff0c;电磁干扰等常常会破坏传输的数据&#xff0c;为了确保传输数据的可靠性&#xff0c;通常会采取一些策略&#xff0c;常…

在cmd的方式下,简化mysql的输入的方法

2019独角兽企业重金招聘Python工程师标准>>> 在我的电脑&#xff0c;高级系统设置&#xff0c;环境变量&#xff0c;path 添加运行的mysql.exe的路径。 转载于:https://my.oschina.net/u/779687/blog/140411

Parser Generator Tips翻译(中英对译) by Joshua Xu

You can use the ParserWizard command from the Project menu to help you create initial YACC and Lex skeleton source files.如果需要生成初始的YACC & Lex骨架源文件&#xff0c;可以在系统菜单中&#xff0c;选取Project->ParserWizard。Use the Parser Generato…

leetcode-455 分发饼干

假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。对每个孩子 i &#xff0c;都有一个胃口值 gi &#xff0c;这是能让孩子们满足胃口的饼干的最小尺寸&#xff1b;并且每块饼干 j &#xff0c;都有一个尺寸 sj 。…

C++模板详解

参考&#xff1a;C 模板详解&#xff08;一&#xff09; 模板&#xff1a;对类型进行参数化的工具&#xff1b;通常有两种形式&#xff1a; 函数模板&#xff1a;仅参数类型不同&#xff1b;类模板&#xff1a; 仅数据成员和成员函数类型不同。目的&#xff1a;让程序员编写…

autocad2007二维图画法_cad怎样绘制简单的二维图形

CAD绘制二维图形非常的简单&#xff0c;大家经常用它来画图&#xff0c;下面是学习啦小编带来关于cad怎样绘制简单的二维图形的内容&#xff0c;希望可以让大家有所收获!cad绘制简单二维图形的方法1、绘图菜单绘图菜单是绘制图形最基本、最常用的方法&#xff0c;其中包含了Aut…

MyEclipse 中配置struts2.2.1的方法

MyEclipse中配置Struts2.2.1版本基本步骤&#xff1a;1&#xff0c;首先就是要建立一个web project项目2&#xff0c;设置jdk和servers路径&#xff0c;如果jdk和servers已经配置ok&#xff0c;跳过这一步骤。在菜单中的window选项中配置jdk和servers对于jdk&#xff0c;点击ja…

BZOJ.5249.[九省联考2018]iiidx(贪心 线段树)

BZOJLOJ洛谷 \(d_i\)不同就不用说了&#xff0c;建出树来\(DFS\)一遍。 对于\(d_i\)不同的情况&#xff1a; Solution 1&#xff1a;xxy tql! 考虑如何把这些数依次填到树里。 首先对于已解锁的节点\(x\)&#xff08;已解锁是指父节点已经处理完的点&#xff0c;刚开始就是\(fa…

leetcode-376 摆动序列

如果连续数字之间的差严格地在正数和负数之间交替&#xff0c;则数字序列称为摆动序列。第一个差&#xff08;如果存在的话&#xff09;可能是正数或负数。少于两个元素的序列也是摆动序列。 例如&#xff0c; [1,7,4,9,2,5] 是一个摆动序列&#xff0c;因为差值 (6,-3,5,-7,3…

bootstrap3中关于布局的两种样式

container&#xff1a;用.container包裹的内容即可实现居中对齐。注意&#xff0c;由于在各分辨率下面都设置了padding 和 固定宽度&#xff0c;.container不能嵌套。row&#xff1a;栏栅系统是把父容器平均分为12列。注意&#xff0c;row可以被嵌套。 通过下表可以详细查看Boo…