语音合成系统之pyWORLD,WORLD使用简介

在本文中,我将尝试介绍一种名为WORLD的工具,该工具通常用于语音合成和语音转换。

语音合成和语音转换

当下,Google Home和Amazon Echo等智能语音系统的使用,毫无疑问,语音的表现形式在未来将变得越来越重要。

语音表现形式的关键技术之一是语音合成(文本到语音)。如果是Mac,你可以试一下:

$ say '早上好'

她会说“早上好”。然而,在say命令中,它变成了机器特定的非常规方式,如在输入稍长的句子时可以理解的。长期以来一直在研究如何使人类的语言,但随着深度学习的发展,最近有可能产生与人类无法区分的语音。

类似语音合成,还有一种称为语音转换的技术。在这里,输入是一个声音,而不是一个文本,它是一种技术,如“用特朗普的声音取代希拉里的声音”。在娱乐领域的使用将立即浮现在脑海中,但也有一种用法,例如“给失去声音的人(哑)提供原始声音”等等,因此这是一项具有社会意义的研究。

语音合成和语音转换的困难

实际上,语音合成和语音转换非常困难。
举个简单的例子,让我们考虑一下“将声音提高一个八度(高音)”的过程。声音只是声音,所以为了获得高音,你应该提高频率。最简单的方法是“以2倍的速度玩”,但是当你尝试获得高音时,你会尝试加快速度。

那么如何在不改变节拍速度的情况下让它变高呢?你能想到的第一件事就是在短时间内切断2x快进声音并重复两次。
这是“Aueueo”作为“Aue Ueo”的形象。
但是,简单地应用此方法会产生难以形容的声音。这是因为波浪连接不好。

像这样,你需要通过改变声音的高度来思考很多事情,并且线性操作并不容易。

从语音中提取特征

如上所述,由于难以直接尝试修改语音波形,因此长期以来一直将语音转换为特征然后将其处理回波形。以下是语音合成和语音转换中使用的一些声学特性:

  1. 基本频率:表示语音基础的高度
  2. 频谱包络:它是所谓的频谱平滑器,代表音调
  3. 非周期性指数:显示声带振动或噪音混合的影响

每个特性都可以独立生成,如果你想改变声音的音高,你可以使用F0进行生成,如果你想改变声音的氛围和音色,你可以使用频谱包络。

语音合成和语音转换工具WORLD

上述特征实际上并不容易提取,而是使用特定模型从原始波形估计的量。因此,为了从头开始实现特征提取,您需要深入了解该领域。

WORLD是一种有用的工具,用于从特征中提取此类特征和合成波形。与在该领域中广泛使用的原始软件STRAIGHT不同,具有BSD许可证的,都可以使用。

WORLD

WORLD 在“C++”和Matlab中正式推出,但也有一个名为PyWorldVocoder的Python包装器。PyWorldVocoder很pip容易安装,所以这次利用它。

$ pip install scipy   #如果你没先装scipy,那么pyworld安装有问题
$ pip install pyworld

尝试使用WORLD

让我们实际使用WORLD。在这里,我们从语音中提取特征量,并尝试从提取的特征量中合成语音。

第一步是读取wav文件。

from scipy.io import wavfile
import pyworld as pw
 
WAV_FILE = 'path_to_the_wav_file'

fs, data = wavfile.read(WAV_FILE)
data = data.astype(np.float)  #WORLD使用float类型

然后使用pyworld提取特征。

_f0, t = pw.dio(data, fs)  #  提取基频
f0 = pw.stonemask(data, _f0, t, fs)  # 修改基频
sp = pw.cheaptrick(data, f0, t, fs)  # 提取频谱包络
ap = pw.d4c(data, f0, t, fs)  # 提取非周期性指数

synthesize使用该方法从获得的特征合成语音。

synthesized = pw.synthesize(f0, sp, ap, fs) 

播放WAV文件

scipy.io.wavfile.write您可以导出文件并使用它们播放,但如果您使用的是Jupyter,则IPython.display使用模块会更容易。

import IPython.display as display

print('original')
display.display(
    display.Audio(y, rate=fs)
)

print('synthesized')
display.display(
    display.Audio(synthesized, rate=fs)
)

original.wav

synthesized.wav

尝试转换声音

让我们实际转换声音。首先,与第一个例子中一样,将其转换为高一个八度的声音。您可以通过使用F0来改变声音的高度。

high_freq = pw.synthesize(f0*2.0, sp, ap, fs)  # 以双倍频率,提高一个八度

print('high_freq')
display.display(
    display.Audio(high_freq, rate=fs)
)

high-freq.wav

一个男人的声音就像一个女人,但它发出的声音并不舒服。接下来,让我们使F0保持不变。正如你所看到的,它是一种类似机器人的机械和情感声音。

robot_like_f0 = np.ones_like(f0)* 100  #100比较合适
robot_like = pw.synthesize(robot_like_f0,sp,ap,fs)

print('robot_like')
display.display(
    display.Audio(robot_like,rate = fs)
)

robot-like.wav

最后,让我们通过修改频谱包络来改变音色。

除了使F0加倍之外,频谱包络是女性的1.2倍。

female_like_sp = np.zeros_like(sp)
for f in range(female_like_sp.shape[1]):
    female_like_sp[:, f] = sp[:, int(f/1.2)]
female_like = pw.synthesize(f0*2, female_like_sp, ap, fs)

print('female_like')
display.display(
    display.Audio(female_like, rate=fs)
)

female-like.wav

以这种方式,通过不将声音表示为原始波形数据而是作为一组特征量来表达语音,可以容易地转换和播放语音。

语音合成,语音转换和机器学习

但是,由于每个声学特性都有无数的转换方法,因此手动调整是一项难度很高的技巧。这就是机器学习发挥作用的地方。在机器学习中,如果有足够的原始数据和转换数据样本,将自动调整参数。过去,使用HMM和混合高斯模型以及NMF的方法似乎是主流,但如开头所述,最近已经积极研究使用深度学习的方法。


最后,介绍一些最近的技术并总结本文。

最近的方法

  1. 使用变分自动编码器从非并行语料库转换语音:这是将VAE(一种深度学习技术)应用于语音质量转换的示例。输入频谱和speaker信息。有趣之处在于它使用了“非平行语料库”。传统方法使用与转换源和转换相同的单词进行学习的数据,但该方法不需要这种对应关系。
  2. WaveNet:原始音频的生成模型:谷歌在2016年宣布的模型使用原始波形数据作为输入数据,而不是特征数据,并使用自回归模型来实现极其平滑的语音合成。虽然计算量存在问题,但绝对是一个突破。
  3. 神经离散表示学习:潜在空间通过称为VQ-VAE的方法离散是独特的,VQ-VAE是一种VAE。它还可以通过使用与解码器部分中的WaveNet结构相同的网络用于语音质量转换。作者的页面上可以听demo,它的转换效果还是非常好的。
  4. 结合生成性对抗网络的统计参数语音合成:最近流行使用GAN模型来做语音转换和语音合成。

总结

以上总结了过去两年来一直关注的语音质量转换和语音合成的基础知识。由于pyworld易于安装,易于使用和有趣,请尝试各种方式

  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值