深度学习系列69:tts技术原理

news2024/12/23 7:13:37

tts为text-to-speech,asr为Automatic Speech Recognition,即speech-to-text。

1. 常用基础模型

下面介绍的deep voice是端到端生成语音的模型,后面两个是生成Mel谱,然后再使用vocoder生成语音的模型。

1.1 Deep voice

目前端到端的是主流,其整体流程如下图:
在这里插入图片描述

步骤1:语素转音素

在这里插入图片描述
用的比较多的是语素(phoneme)和字母(grapheme)。这里介绍语素为token的步骤:
· White Room - [ W,AY1, T, ., R, UW1, M,. ]
· Crossroads - [ K,R, AO1, S, R, OW2, D, Z, . ]
上述例子源自于CMU的音素字典,其中,音素旁边的1,2等数字表示应该发重音的位置,句号表示音间停顿。在大多数情况下,通过查询标准音素字典(比如CMU的音素字典),可以得到与输入文本一一对应的标签。
如果出现音素字典没有覆盖的词,Deep Voice使用神经网络来实现这个功能。准确来讲,它沿用过了Yao和Zweig在微软进行的Sequence to Sequence(Seq2Seq)的学习方法来进行文本对应的音素预测。

步骤2:预测每个音素的持续时间和基频

[IH1, T, ., W, AA1, Z, ., ER1, L, IY0, ., S, P, R, IH1, NG, .] -> [IH1 (140hz, 0.5s), T (142hz, 0.1s), . (Not voiced, 0.2s), W (140hz, 0.3s),…]
分割模型将每个音素发声的场景进行匹配,从而获取其对应的音频分割片段和其在音频中的发声位置。
在这里插入图片描述
对独立单个的音素而言,给定语音对应某个音素的概率在语音的发声正中最大;而对成对的音素而言,概率最大值出现在两个音素交界点上,因此分割模型的预测结果是因素对。
在这里插入图片描述

步骤3:将音素,持续时间和基频结合从而输出文本对应的语音

[IH1 (140hz, 0.5s), T (142hz, 0.1s), . (Not voiced, 0.2s), W (140hz, 0.3s),…] -> 音频
原始音频通常保存为16Bit规格 ,对每个时刻输出的可能值 ,softmax层将需要输出65536个值。先将 [-32768, 32767] 的范围线性压缩成 [-1, 1],然后再通过一个名为 μ-law 的算法,然后再将其拉回 [0, 255] 范围中。

1.2 Tacotron

Tacotron用的是一个典型的 Seq2Seq + Attention 的模型架构。它输出还会有个后处理(Post-processing)才会产生声音频谱(spectrogram),紧接着使用decoder生成声音。
在这里插入图片描述

步骤1:encoder生成向量

Encoder 的目的就是输入进一些字母和标点符号,输出一堆向量,类似于转为phoneme向量,告诉Decoder和注意力模块这些字母应该怎么发音。
在这里插入图片描述
对于 Encoder,我们也可以加上文法的信息。文法会将一句话切割成各类成分,比如主语宾语名词等,这将对一个句子的语气、停顿等起到作用。

步骤2:Tacotron Attention

attention模块的目的就是让机器能自动学习到每一个字母所代表的 embedding 在 decoder 那里会产生多长的声音讯号。而单调对应就意味着当我们将注意力可视化(x轴表示文字embedding,也就是编码器的输出,y轴表示音频,也就是decoder的输出),生成的可视化图案应该是呈对角线分布的。

步骤3. Tacotron Decoder

这里采用的Decoder其实就是Seq2Seq里面的Decoder,产生的vector就是Mel-spectrogram。在Decoder之后,Tacotron还有一个Post Processing(后处理模块),其第一代就是一个CBHG,第二代是一堆卷积层。它会把解码器输出的全部向量当作输入,然后再输出另外一排向量。
第一代的 Tacotron 用的是一个基于规则的 Vocoder,第二代就用上了 Wavenet。

1.3 Fast speech

Fast speech同样有 Encoder 转 character 为 embeddings,不同的是在编码器和解码器之间单独训练了 Duration 模块,可以预测每个 character 要念多长。这个 Duration 模块会输入一个单词嵌入,输出每个字符要说的长度。比如输出是2,它就要把当前的字符嵌入复制两次。
在这里插入图片描述
FastSpeech 使用了 Duration 模块的好处是,它不会像 Tacotron 或 基于 Transformer 的 TTS 那样,有一些发音上的瑕疵,比如结巴,跳过词汇没念,念错词汇的情况。直觉上看,FastSpeech 在 Duration 上做了一个更大的限制,来避开这些错误。

2. 常见Vocoder模型

Vocoder:当涉及语音合成时,vocoder是一个重要的组成部分,它负责将数字化的语音信号转换回可听的声音。Vocoder是“Voice Coder”的缩写,它是一种处理语音信号的算法或设备,用于分析和合成声音。它接收数字信号(通常是通过语音识别等手段得到的),并对其进行处理,使之变成人耳能够理解的声音信号。
首先我们大概讲一下 Vocoder 是干什么的。之前说过,一般在模型中操作的都是声谱 spectrogram,而 Vocoder 就是将 spectrogram 转为我们可以听的声音信号的。但是spectrogram只包含了振幅信息,不包含相位信息,无法直接还原为声音。
在这里插入图片描述
Griffin-Lim算法是一种启发式方法,用于估计音频信号的相位信息,从而实现从幅度谱(amplitude)重建时域波形(waveform)。这个算法特别适用于声音合成或音频重建的场景。这个算法的基本思想是:通过对幅度谱的估计和随机初始化重建频谱的相位,然后反转这些估计的频谱,再次应用STFT来获得新的时域波形。然后重复这个过程,迭代多次,希望最终获得合理的相位估计。不过它生成的语音听起来还是不太自然。
为什么 Vocoder 要单独拿来研究,而不是接在 TTS、VC 等模型后面直接做 End2End 训练呢?因为 Vocoder 是将频谱图转为波形的方式,只要生成的是频谱图,就可以使用 Vocoder,这使得其泛用性很高,而其他模型的生成目标就变成了生成频谱图,这会降低整个任务难度,使得它们能够更加专注于声音信号的处理。
下面是一些常见的vocoder
在这里插入图片描述
在这里插入图片描述

2.1 waveNet:PixelCNN自回归

其本质上就是一个自回归模型(autoregressive model),主要构成成分就是因果卷积网络(Causal Convolution Network)。我们首先看下wavenet的结构:
在这里插入图片描述
Causal Convolution(因果卷积):是卷积神经网络中的一种卷积操作,它具有一种“因果性”约束,即输出中的每个元素只能依赖于输入序列中其之前的元素。这种约束在处理时间序列数据时非常有用,因为它确保模型不会“未来”依赖于当前时间步之后的信息。
因果卷积存在的一个问题是它需要很多层,或者很大的卷积核来增大其感受野。例如,在上图2中,感受野只有5个单位 。(感受野 = 层数 + 卷积核长度 - 1)。因此WaveNet使用扩大卷积使感受野增大几个数量级,同时不会显著增加计算成本。
在这里插入图片描述
为了更方便快捷地计算,需要先对数据实施一个µ-law压扩变换,然后取到256个量化值。µ-law压扩变换算法如下:
在这里插入图片描述
这种编码方式能够在保留音频信号主要特征的同时,通过压缩和量化来减小数据量。
对于PixelCNN,在生成过程(推理过程)是序列处理的,此时需要逐个pixel进行预测,速度很慢,下面的FFTNet则将速度提高到logN级别。 ​

2.2 FFTNet:1*1核的自回归

FFTNet 和 WaveNet 一样也是自回归模型。不一样的是,它将其中的深度 CNN 改成比较简单的计算方式,输入的数据首先会被切成两段,分别为 xl 和 xr,通过不同的 CNN 再加起来得到 z,然后通过一个 ReLU,一个1×1 CNN,一个ReLU,得到新的 x,然后再进行和上面一样的操作。因为相加的操作,每通过一层,输入的数据大小就会减半,最后大小变成1的时候,这就是最终的输出。
在这里插入图片描述

2.3 waveglow:基于flow函数

在这里插入图片描述
从数学的角度来解释就是下面这样:
在这里插入图片描述
这里的z就是平均值为0,标准差为1的高斯分布。
在这里插入图片描述
在这里插入图片描述

2.4 HiFi-GAN:利用GAN优化

HiFi-GAN包括一个生成器和两个判别器,生成器的架构如下图所示,由多个MRF堆叠而成。MRF是用于上采样的反卷积运算模块。
在这里插入图片描述
因为语音信号是由不同周期的正弦信号构成,对周期信号进行建模对于生成实际的语音信号而言,十分重要。**因此,文章提出针对一个有多个鉴别器构成的大鉴别器,每一个小鉴别器固定获取某一周期的原始波形。**这个模型是模型合成真实声音的基础。
使用了两个判别器,一个是multi-period discriminator (MPD),用来识别语音中不同周期的信号,另一个是MelGAN中的multi-scale discriminator,用来应对超长数据。
MPD是由若干子鉴别器构成的,每一个子鉴别器只接受音频的等间距样本,这个间隔是由周期给出的。**子鉴别器主要是通过查看输入音频的不同部分,来获取彼此不同的隐式结构。**我们将周期设置为[2,3,5,7,11]来尽量减少重叠。如图二b中展示的一样,我们将一维的长度为T的原始音频数据转换为2维的数据,宽为p pp,长为T / p T/pT/p,然后对其使用二维卷积处理。MPD中每一个卷积层,我们将卷积核宽度设置为1,来单独处理某一個周期的样本。每一个子鉴别器是一个跨步卷积层,激活函数为 ReLU。然后,对MPD进行权重归一化,通过将输入数据转换成二维数据,而不是直接对周期信号进行采样,MPD的梯度可以传递到输入音频的所有时间步长。
在这里插入图片描述
MPD是检测不同周期的采样点,按照一定的空间间隔进行采样,本来就是离散的。MSD是对光滑的波形图进行整体卷积采样,是连续,是为了弥补MPD的离散的缺点。它是一个多尺度鉴定器,来实现对于音频序列的连续感知,由三个子鉴定器混合而成,每一个子鉴定器都是针对不同的输入尺度,分别是原始音频、2倍平均池化音频、4倍平均池化音频。
MB-iSTFT-HIFIGAN加上了诸多轻量化手段,概括来说就是用类似诸如短时FFT等工具代替卷积计算。

2.5 vocos:进行了相位预测

Vocos 是一款设计巧妙的快速神经声码器,它能够从声学特征中合成音频波形。利用生成对抗网络(GAN)的目标训练,Vocos 实现了仅通过一次前向传播即可生成音频波形的能力。与众不同的是,Vocos 不直接在时间域内建模音频样本,而是生成频谱系数,借助逆傅里叶变换快速重构音频。
与HiFigan比,显著的区别在于,vocos不仅对幅度谱进行预测,还要对相位进行预测,即图中希腊字母 ϕ \phi ϕ。主体结构中,采用ConvNeXt block(mobilenet方式),有一定的加速作用。也因为没有转置卷积,也不存在必须要用dilated卷积增加感受野的问题。这也是作者不采用dilated的原因。
在这里插入图片描述

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

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

相关文章

Ubuntu安装boost,protobuf、moduo

一、Ubuntu安装muduo muduo库是基于boost开发的,确保先安装了boost(对boost版本有要求),还需要先安装protobuf,curl库 库版本boost1.70.0protobuf3.14.0curl7.74.0muduo2.0.2 1、Ubuntu安装boost # 更新资源列表 s…

【2024-2025源码+文档+调试讲解】微信小程序的城市公交查询系统

摘 要 当今社会已经步入了科学技术进步和经济社会快速发展的新时期,国际信息和学术交流也不断加强,计算机技术对经济社会发展和人民生活改善的影响也日益突出,人类的生存和思考方式也产生了变化。传统城市公交查询管理采取了人工的管理方法…

【第0005页 · 贪心】非递减数列

【前言】本文以及之后的一些题解都会陆续整理到目录中,若想了解全部题解整理,请看这里: 第0005页 非递减数列 今天我们来看一道 LeetCode 上“广泛好评”的一道 Easy 题!!!(蓝色是 OJ 平台&…

CentOS 7 升级 OpenSSH 9.8p1

背景 OpenSSH 官方发布安全通告,披露CVE-2024-6387 OpenSSH Server远程代码执行漏洞。 环境 操作系统内核openssh 版本openssl 版本7.8.20033.10.0-11277.4p11.0.2k-fips 安装编译软件和下载 OpenSSH9.8p1 软件包 mkdir -p /data/software cd /data/software/…

安卓13 鼠标右键作返回键,鼠标事件修改

总纲 android13 rom 开发总纲说明 前言 目录 1.前言2.问题分析3.代码分析4.代码修改5.编译1.前言 像有些设备是使用鼠标操作的,但是默认的android 鼠标右键并不是像电脑一样,能够做到,左键是确定,右键是返回

足球比分预测分析理论

走进一个充满欢呼声的体育场,空气中充满了对即将到来的两支强大足球队之间对决的期待。一个引人入胜的问题浮现出来:我们可以在比赛开始之前预测比赛的结果吗? 本文提出了一个基于概率和统计的模型,通过考虑每支队伍的进攻和防守能…

9.2-模型量化学习内容

量化简介 量化是将模型浮点数变为定点数运行的过程。 基本概念 :模型量化可以减少模型尺寸,进而减少在推理时的内存消耗,并且在一些低精度运算较快的处理器上可以增加推理速度。 常见方法:工业界目前最常用的量化位数是8比特&a…

期权权利金要多少?期权保证金和权利金有什么区别?

今天带你了解期权权利金要多少?期权保证金和权利金有什么区别?期权交易中,保证金和权利金是两个核心概念,它们在交易过程中扮演着不同的角色。 期权权利金一般是多少? 期权的买方叫权利金、期权的卖方叫保证金&#…

【Altium Designer脚本开发】——PCB平面绕组线圈 V1.4

PCB平面绕组线圈工具用于生成平面电机线圈,应用场景可参考平面电机的书籍、CNKI论文或平面电机的视频。此工具运行环境在Altium Designer中,可用于Altium Designer全系列的版本中。 以下工具可以定制和试用 原理图文档处理工具 ➡️物料编码自动查找工具…

Fluent 超音速射流噪声仿真分析

1. 摘要 本算例使用ANSYS Fluent 19.0软件,对超音速射流流动进行直接气动声学仿真,文档内包含详细的网格导入、模型选择、材料物性、边界条件、求解参数、后处理的设置。通过仿真计算获得射流流场和射流噪声。 2. 案例描述 本算例仿真的案例为以简化…

【Unity】子物体旋转变形的解决方法

如图,如果父物体缩放不为(1, 1,1),则子物体如果有旋转量,则会在对应坐标轴上产生变形。 解决方案是: 在子物体和父物体节点间多增加一个空节点,保证空节点的世界坐标下的缩放为&…

livox MID-360调试(解决ip设置问题)

整体的调试思路参考大疆Livox Mid360 使用指南_mid360中的imu内参-CSDN博客这篇博客。 但是在调试过程中出现了ip地址设置不对导致的报错: 1.livox viewer中看不到点云数据 2.livox SDK2 bind error。 joeyjoey:~/slam/Livox-SDK2/build/samples/livox_lidar_qu…

hugging face 利用现有模型进行预测

本篇主要记录下如何使用hugging face来快速找到我们需要的模型,并通过已有模型来快速实现demo或是功能模块。贴上hugging face 官网链接: hugging face model界面(需要魔法)需要模板代码请跳转流程总结 目录 1.选择模型 2.创建模型处理器对象 3.使用…

JAVA呵护晚年从智慧开始养老护理代办陪诊陪护小程序

呵护晚年,从智慧开始 —— 养老护理代办陪诊陪护小程序全解析 👵 【开篇:岁月静好,智慧护航】 随着时光的流转,家中的长辈渐渐步入晚年。如何给予他们最贴心的关怀与照顾,成为了我们心中的头等大事。今天…

【Linux】08.Linux 下的第一个小程序——进度条

一、知识引入 在写我们的进度条之前需要先引入一下小的知识点:换行与回车,认识缓冲区,认识格式化输出 1.1 换行与回车 换行指的是跳转到下一行的同一个位置 回车指的是跳转到本行开头的位置 新起一行就是换行回车 但是日常生活中我们见到的…

驾驭Python与MySQL的桥梁:pymysql的神秘面纱

文章目录 **驾驭Python与MySQL的桥梁:pymysql的神秘面纱**背景:为何选择pymysql?库的简介安装指南简单的库函数使用方法场景应用常见问题与解决方案总结 驾驭Python与MySQL的桥梁:pymysql的神秘面纱 背景:为何选择pym…

Django Admin对自定义的计算字段进行排序

通常,Django会为模型属性字段,自动添加排序功能。当你添加计算字段时,Django不知道如何执行order_by,因此它不会在该字段上添加排序功能。 如果要在计算字段上添加排序,则必须告诉Django需要排序的内容。你可以通过在…

Ollama-AI大模型本地运行工具,Windows安装详细步骤

一、关于Ollama 1.1 简介 Ollama是一个专为在本地环境中运行和定制大型语言模型而设计的工具。它提供了一个简单而高效的接口,用于创建、运行和管理这些模型,同时还提供了一个丰富的预构建模型库,可以轻松集成到各种应用程序中。Ollama的目…

MySQL——索引管理

目录 一、索引的概述 1、索引的概念 2、索引的作用 3、索引的副作用 4、创建索引的原则依据 5、索引的分类 二、索引的管理 1、查看索引 2、创建索引 2.1、创建普通索引 2.2、创建唯一索引 2.3、创建主键索引 2.4、创建组合索引 2.5、创建全文索引 3、删除索引 …

Vue3项目开发——新闻发布管理系统(五)

文章目录 七、登录&注册页面设计开发4、后端接口调用4.1 AXIOS请求工具封装4.2 创建 axios 实例①安装 axios② 封装 axios 模块4.3完成 axios 基本配置5 实现 注册功能5.1 创建接口调用js文件5.2 页面中调用注册方法6 实现 登录功能6.1 创建接口调用js文件6.2 页面中调用登…