语音合成 GAN Vocoders 总览

news2025/1/11 6:52:14

Loss 函数简称与全称的对应关系

Short NameFull Name
advadversial loss
FMFeature Matching
MSDMulti-Scale Discriminator
mr-STFTMulti-resolution STFT loss
fmr-STFTfull band Multi-resolution STFT loss
smr-STFTsub band Multi-resolution STFT loss
MelMel-Spectrogram Loss
MPDMulti-Period Discriminator
FB-RAWsFilter Bank Random Window Discriminators

csmsc 数据集上 GAN Vocoder 整体对比如下,

测试机器:1 x Tesla V100-32G 40 core Intel® Xeon® Gold 6148 CPU @ 2.40GHz

测试环境:Python 3.7.0, paddlepaddle 2.2.0

ModelDateInputGenerator
Loss
Discriminator
Loss
Need
Finetune
Training
Steps
Finetune
Steps
Batch
Size
ips
(gen only)
(gen + dis)
Static Model
Size (gen)
RTF
(GPU)
Mel GAN9 Dec 2019meladv
FM
MSD——————————————
Parallel Wave GAN6 Feb 2020mel
noise
adv
mr-STFT
advNo40W——818
10
5.1MB0.01786
HiFi GAN23 Oct 2020meladv
FM
Mel
MSD
MPD
Yes250Wno need16——
31
50MB0.00825
Multi-Band Mel GAN17 Nov 2020meladv
fmr-STFT
smr-STFT
MSDYes100W100W
(not good enough,
need to adjust parameters)
64305
148
8.2MB0.00457
Style Mel GAN12 Feb 2021mel
noise
adv
mr-STFT
FB-RAWsNo150W——3258
24
——0.01343

网络结构

Mel GAN


Mel GAN 网络结构图

Parallel Wave GAN


Parallel Wave GAN 网络结构图

HiFi GAN


HiFi GAN 生成器网络结构图



HiFi GAN 判别器网络结构图

Multi-Band Mel GAN


Multi-Band Mel GAN 网络结构图

Style Mel GAN


Style Mel GAN TADE 网络结构图



Style Mel GAN 生成器网络结构图



Style Mel GAN 判别器网络结构图

需要注意的点

输入

  1. 一般情况下,若训练时输入中没有 noise,容易过拟合,需要 finetune
    • 参考 espent issue
  2. 若输入中有 noise, 在预测时需要自己在 inference 代码中生成 noise, 而不能作为参数输入给 inference, 否则动转静可能走不通
    • 参考 pwgan 动转静修复 pr

生成器

  1. hop_sizen_shift 的含义一样
  2. upsample_scales 的乘积一定等于 hop_size
  3. 采样点 = hop_size * 帧数
  4. librosa 帧数 = 采样点 // hop_size + 1, 具体要不要 +1 看不同的库,看 center 这个参数
  5. Mel GANMulti-Band Mel GAN 生成器的代码是一样的,只是参数不一样,通道数不一样
  6. Parallel Wave GAN 的生成器是 WaveNet like
    • 用非因果卷积替换了因果卷积
    • 输入是满足高斯分布的随机噪声
    • 训练和预测时都是非自回归的
  7. Style MelGAN 的 noise 的上采样需要额外注意,输入的长度是固定的
    • batch_max_steps(24000) == prod(noise_upsample_scales)(80) * prod(upsample_scales)(300, n_shift)

判别器

  1. HiFi GAN 判别器的能力很强

速度

  1. 为什么 Multi-Band Mel GAN 的预测会更快?因为上采样的倍数变为了原来的 1/4

FFT 在语音合成声码器上的应用

语音合成是一种将任意文本转换成语音的技术,目前在深度学习领域,语音合成主要分为 3 个模块:

  • 文本前端
  • 声学模型
  • 声码器

其中,文本前端模块将输入文本转换为音素序列或语言学特征;声学模型将音素序列或语言学特征转换为声学特征,在语音合成领域,常用的声学特征是 mel 频谱;声码器将声学特征转换为语音波形。

声码器的输入是频域特征 mel 频谱图,输出是对应的语音波形。

STFT 全称 Short-Time Fourier Transform,短时傅里叶变换,它是用滑动帧 FFT 生成频率与时间的 2D 矩阵,通常被称为频谱图(Spectrogram), 而人耳对于频率的敏感程度是非线性的,可以通过 mel 三角滤波器对频谱图处理,生成 mel 频谱图。

生成 mel 频谱图的计算离不开 fft 系列的算子,若模型的输入是 mel 频谱图,可以使用 librosa 等科学计算库进行计算再输入模型。然而,现有的大多数基于 GAN 的声码器模型,在计算 loss 时需要将生成器合成的音频及原始音频转换到频率域再做计算,这时需要用到短时傅里叶变换算子 stft,且由于 stft 算子出现在了模型图中,其需要参与到模型的前向和反向计算过程中,此时,则需要深度学习框架提供 stft 算子。

最新的 PaddleSpeech 语音合成模块的声码器,用到了 paddle 2.2.0 提供的 fft 系列算子 paddle.signal.stft

PaddleSpeech 模型库目前已经实现的基于 GAN 的声码器包括 Parallel WaveGANMulti Band MelGANHiFiGANStyle MelGAN,这些模型的 loss 中都包含基于 stft 算子的 loss,其中主要包含 Multi-resolution STFT lossMel-Spectrogram Loss

Multi-resolution STFT loss 公式如下所示:

Mel-Spectrogram Loss 公式如下所示:

其中 Φ 表示将音频转换为对应 mel 频谱的函数。

如上述公式所示,现在主流的基于 GAN 的声码器的 loss 设计需要用到 stft,在 Paddle 中尚未实现 fft 系列算子时,PaddleSpeech 模型库使用基于 Conv1D 算子的函数来模拟 stft 算子,然而经过计算,该模拟函数前向结果正确,反向梯度计算结果不正确,这导致了模型收敛效果不佳,听感略差于竞品。

Paddle 主框架中加入 fft 系列算子后,我们将语音合成声码器 loss 模块中的基于 Conv1Dstft 均替换为 paddle.signal.stft,在模型收敛效果和合成音频听感上,paddle.signal.stft 的效果明显优于基于 Conv1Dstft 实现。

Parallel WaveGAN 模型为例,我们复现了基于 Pytorch 和基于 PaddleParallel WaveGAN,并保持模型结构完全一致,在相同的实验环境下,基于 Paddle 的模型收敛速度比基于 Pytorch 的模型快 10.4%, 而基于 Conv1Dstft 实现的 Paddle 模型的收敛速度和收敛效果和收敛速度差于基于 Pytorch 的模型,更明显差于基于 Paddle 的模型,所以可以认为 paddle.signal.stft 算子大幅度提升了 Parallel WaveGAN 模型的效果。

image
P.S. 欢迎关注我们的 github repo PaddleSpeech, 是基于飞桨 PaddlePaddle 的语音方向的开源模型库,用于语音和音频中的各种关键任务的开发,包含大量基于深度学习前沿和有影响力的模型。

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

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

相关文章

Mybatis----多表查询

目录 返回类型 resultType resultMap 1、字段映射 2、多表查询 动态SQL if标签 where标签 set标签 choose(when,otherwise) 语句 trim标签 for-each标签 SQL片段 返回类型 resultType Mybatis在查询时,一定要指定返回类型;而其他操作&#xff0…

BH1750 传感器实战教学 —— 硬件设计篇

前言 前面刚写了一篇 《BH1750 光照传感器文档详解 及 驱动设计》,今天来写一篇简单的传感器实战教学。 文章如下:BH1750 光照传感器文档详解 及 驱动设计 那有些朋友就疑惑了,在上一篇文章其实我们基本都测试成功了,驱动也写了…

现代操作系统原理与实现

突然更新,为了水一个1024徽章拿随书笔记来发发(嘿嘿 原文链接:https://github.com/yanyanran/YBlog/blob/main/%E7%8E%B0%E4%BB%A3%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%8E%9F%E7%90%86%E4%B8%8E%E5%AE%9E%E7%8E%B0.md 一、操作系统结构…

【网络安全篇】JavaSript基础内容大全

🏆今日学习目标: 🍀学习JavaSript基础 ✅创作者:贤鱼 ⏰预计时间:30分钟 🎉个人主页:贤鱼的个人主页 🔥专栏系列:网络安全 JavaSript基础大全🍀java和JavaSri…

[C]带你了解C语言是如何操作文件的

文章目录一、认识文件1.1 为什么要使用文件1.2 什么是文件1.3 文件名1.4 文件指针1.5 文件的打开和关闭二、文件的顺序读写2.1 fgetc和fputc2.2 fgets和fputs2.3 fscanf和fprintf2.4 fread和fwrite2.5 对比一组函数三、文件的随机读写3.1 fseek3.2 ftell3.3 rewind四、文本文件…

高云FPGA系列教程(5):ARM点灯工程设计

文章目录[toc]1. ARM核定制2. ARM核程序设计3. ARM程序烧写4. 工程下载本文是高云FPGA系列教程的第5篇文章。 前面几篇笔记都是介绍的高云GW1NSR-4C FPGA部分的使用,本篇文章介绍片上ARM Cortex-M3硬核处理器的使用,演示如何定制一颗ARM处理器硬件&#…

大数据电信客服-数据采集/消费(二)

目录 一、数据采集/消费(存储) 二、数据采集 三、数据消费 四、编写代码 在project-ct.pom 在ct.consume下 在ct.consumer.bean 在ct.consumer.dao 在ct-consumer的resources 在ct-common.pom 在ct.common.api 在ct.common.bean 在ct.common.constant 在ct-common的…

LQ0123 小朋友崇拜圈【DFS】

题目来源:蓝桥杯2018初赛 C C组G题 题目描述 班里N个小朋友,每个人都有自己最崇拜的一个小朋友(也可以是自己)。 在一个游戏中,需要小朋友坐一个圈, 每个小朋友都有自己最崇拜的小朋友在他的右手边。 求满…

vue06安装vue-cli+使用vue-cli搭建项目+什么是*.vue文件+开发示例+必问面试知识点

目录 1. vue-cli安装 1.1 安装前提 1.2 什么是vue-cli 1.3 安装vue-cli 2. 使用vue-cli构建项目 2.1 使用脚手架创建项目骨架 2.2 到新建项目目录,安装需要的模块 2.3 如何修改端口号 2.4 添加element-ui模块 2.5 package.json详解 3. install命令中的-g…

腾讯云~ zookeeper集群安装、配置、验证

文章目录一、 预备工作1. 下载2. 解压3. 创建目录4. myid 文件5. 验证6. 效果图二、配置管理2.1. zoo1.cfg2.2. zoo2.cfg2.3. zoo3.cfg2.4. 防火墙2.5. 启动zk2.6. 运行状态一、 预备工作 1. 下载 cd /app wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.12/…

GitLab API 的使用教程

1 简介 GitLab 作为一个开源、强大的分布式版本控制系统,已经成为互联网公司、软件开发公司的主流版本管理工具。使用过 GitLab 的都知道,想要提交一段代码,可以通过 git push 提交到远程仓库,也可以直接在 GitLab 平台上修改提交…

基于华为云IOT平台实现多节点温度采集(STM32+NBIOT)

一、前言 当前的场景是,在高速公路上部署温度采集设备,在高速路地表安装温度检测传感器,检测当前路段的路面实际温度。一段高速路上有多个地点需要采集温度数据。 采集温度数据需要上传到云平台进行数据存储,并且通过可视化界面展…

七万字整理SpringCloud + CloudAlibaba知识点总结笔记

各位小伙伴们大家好,欢迎来到这个小扎扎的spring cloud专栏,在这个系列专栏中我对B站尚硅谷阳哥的spring cloud教程进行一个总结,鉴于 看到就是学到、学到就是赚到 精神,这波依然是血赚 ┗|`O′|┛ SpringCloud Clou…

Linux文件系统inode的作用

目录 前言 简介 inode与block 1、查看文件的inode信息 2、查看分区中的inode节点数 前言 前面学习了磁盘管理中的磁盘分区,以及逻辑卷,交换分区的创建,这篇文章将介绍一下我们在分区以及格式化时候用到的ext4文件系统,本盘文…

【云原生之Docker实战】使用Docker部署ShowDoc文档工具

【云原生之Docker实战】使用Docker部署ShowDoc文档工具一、ShowDoc介绍1.ShowDoc简介2.ShowDoc功能二、检查docker版本三、检查docker状态四、下载ShowDoc镜像五、创建ShowDoc容器1.创建数据目录2目录授权3.运行ShowDoc容器4.查看ShowDoc容器状态5.查看容器运行日志六、ShowDoc…

【精通Java篇 | IO流】详讲字节流与常用方法

个人名片: 🐼作者简介:一名大二在校生,喜欢编程🎋 🐻‍❄️个人主页🥇:小新爱学习. 🐼个人WeChat:hmmwx53 🕊️系列专栏:&#x1f5bc…

Java流式编程stream

文章目录一、简介二、创建Stream三、常用操作四、其他操作一、简介 流式 API 从 Java8 开始引入,支持链式书写。 流只能消费一次,不能被两次消费(两次最终操作) 流在管道中流通,在节点被处理。 流【无存储】&#x…

vim如何进行批量化注释及取消,也在1024表明自己算十分之一的程序员

前言 👻作者:龟龟不断向前 👻简介:宁愿做一只不停跑的慢乌龟,也不想当一只三分钟热度的兔子。 👻专栏:C初阶知识点 👻工具分享: 刷题: 牛客网 leetcode笔记软…

人家网站都免费了,你还用Python去爬?

文章目录⛳️ 实战场景⛳️ 实战编码⛳️ 实战场景 这次实战的目标是一个叫做猫肯的字体站点,该站点所有的字体都是免费可商用的,所以为什么还要去下载呢? 答案是练手,借免费站点学习爬虫,🌋 目标站点地址…

Python爬虫技术系列-05字符验证码识别

Python爬虫技术系列-05字符验证码识别1. 光学文字识别1.1 OCR概述1.2 OCR识别库Tesseract下载安装1.3 生成验证码图片1.4 字符验证码识别1.安装python识别验证码库:2.验证码识别:1.5 使用打码平台识别验证码1.6 滑动验证码识别1. 光学文字识别 1.1 OCR概…