world是一个基于c语言的开源语音合成系统,语音合成主要包括波形拼接和参数合成两种方法,world是一种基于vocoder的参数合成方法,它相比于straight的优势是减少了计算复杂度,并且可以应用于实时的语音合成。由于straight不是开源的系统,并且在world论文中已经对比了world相比于straight无论是在合成的音频质量上还是合成速度上都处于领先优势,所以这里我不准备介绍straight,我们今天主要讲一下world语音合成系统的原理以及使用方法。
world系统如下图所示,包含三个模块,分别是dio、cheaptrick、platinum,其中dio的作用是用来估计一段波形的fundamental frequency(简称f0),cheaptrick算法是根据波形和f0来计算spectral envelope,platinum算法是基于波形、f0和spectral envelope来计算aperiodic parameter,下面我们来分别看这些参数的计算原理。
1. f0的计算
f0在维基百科中的定义是:当发声体由于振动而发出声音时,声音一般可以分解为许多单纯的正弦波,所有的自然声音基本都是由许多频率不同的正弦波组成的,其中频率最低的正弦波即为基音,而其他频率较高的正弦波则为泛音,即这些不同正弦波中的最低频率称为基频。f0是一种非常常用的可以表示声音的特征,在world中,f0的计算是基于dio算法,dio算法主要包含如下三个步骤:
第一步:使用不同的截止频率的低通滤波器,如果滤波后的信号只包含基频,那么它就是一个正弦波,由于事先我们对f0并不知晓,需要多次试探,所以在这一步中会有很多不同截止频率的滤波器被使用;
第二步:计算每一个滤波后的信号中的候选基频以及可信度,由于只包含基频的信号应该是一个正弦波,因此如下图所示,四个区间的跨度应该基本相等,我们可以计算四个跨度的平均值,用这个值的倒数来表示候选基频。同时,计算这四个跨度的标准差来作为衡量基频可信度的指标,标准差越大,说明跨度长短差异较大,那么取此频率作为基频的可信度就较低。
第三步:选取可信度最高的候选基频作为最终的基频。
2. 用于估计频谱包络的cheaptrick算法
首先,我们需要明白什么是语音的频谱包络,语音是一个时序信号,例如对于一个采样频率为16khz的音频文件,意味着在这个音频中,每一秒包含16000个采样点,这些采样点在计算机中以某种数据形式进行存储着(例如常见的有16bit整型),当我们使用矩形窗函数对一段音频进行处理,它就被划分成多个帧,于是得到了多个子序列,然后对每个子序列进行傅里叶变换操作,就得到了频率-振幅图,将这些图在时间维度上展现出来,就得到了这个语音文件的spectrogram。一张实际的spectrogram如下图所示。
频谱包络实际上是在一个频率-振幅图中,将每个频率共振峰用平滑的曲线连接起来,而这个平滑的曲线就是语音的频谱包络,下图展示了频谱包络在频谱图中的位置。
确定这个频谱包络的算法有很多,例如常见的是倒谱法(cepstrum,有趣的是,cepstrum与spectrum两个单词只是开头四个字母翻转了位置而已,这其实也暗示了它们的物理含义有某种巧合的关联...),在world中,使用的是cheaptrick算法来估计频谱包络,该算法工作流程如下:
首先,对信号添加hanning window,然后对windowed之后的信号计算其功率,公式如下(1)所示;
其次,使用矩形窗函数对功率谱进行平滑化,公式如下(2)所示;
最后,计算功率谱的倒谱,并做倒谱提升,公式如下(3)(4)(5)(6)所示;
最终得到的pl(w)就是我们所需要的频谱包络。
3. aperiodic参数提取算法
aperiodic是与混合激励相关的参数,为了获得自然的声音,激励源不能只使用周期信号,也需要包含一些非周期信号。在world中,aperiodic参数可以直接基于波形、f0、频谱包络来计算得到。这种算法叫做platinum,它的工作流程如下:
首先,对波形添加宽度为2t0的窗函数,并计算得到其频谱x(w);将x(w)除以最小相谱sm(w)得到xp(w),公式如(11)所示;对xp(w)进行逆ifft,即可得到激励信号,公式如(10)所示;
最终的语音合成是通过将最小相谱与激励信号进行卷积得到。
最后,来看一下如何调用world来合成一段语音以及合成的效果。world源代码是基于c语言的,但是world也有一个python wrapper库——pyworld,为了代码简洁起见,这里我们使用pyworld来演示。
在终端运行pip install pyworld以及pip install soundfile即可安装pyworld库,该库中提供了一个demo代码,可以用来演示语音合成。下面一段代码就是使用world库来提取音频特征,并将此特征基于vocoder合成新的音频,原始音频和新的音频的波形图对比如下图所示。
#获取音频的采样点数值以及采样率x, fs = sf.read('utterance/vaiueo2d.wav')#使用dio算法计算音频的基频f0_f0, t = pw.dio(x, fs, f0_floor=50.0, f0_ceil=600.0, channels_in_octave=2, frame_period=args.frame_period, speed=args.speed)#使用cheaptrick算法计算音频的频谱包络_sp = pw.cheaptrick(x, _f0, t, fs)#计算aperiodic参数_ap = pw.d4c(x, _f0, t, fs)#基于以上参数合成音频_y = pw.synthesize(_f0, _sp, _ap, fs, args.frame_period)#写入音频文件sf.write('test/y_without_f0_refinement.wav', _y, fs)
下图是原始波形与合成后音频的波形对比,上图是原始波形,下图是合成后的音频波形,可以看到,基本保持一致。由于公众号文章只能上传一段音频,因此这里我只能上传合成后的音频。
world语音合成系统可以根据f0、spectral envelope、aperiodic三个参数来合成一段语音,因此,在前沿的语音合成研究中,会通过深度学习技术学习到一段文本所对应的这三个特征,然后借助world合成为语音。
酷博电话录音系统
一汽解放汽车J6重型卡车成功完成TUV南德意志集团的认证项目
最新的第二代Intel Xeon可扩展处理器的系统
卫星通信v2 第七章 仿真与实战(8)知识点回顾
找方案 | 基于Airoha(AudioWise) PAU1806的OTC 颈挂式蓝牙助听器方案
详细解析WORLD语音合成系统的原理以及使用方法
剩余电流式电气火灾监控系统设计方案
热封试验仪的特点是什么?热封仪的参数 配置有哪些?
继共享充电宝之后,手机消毒舱会是下一个风口吗
如何购买笔记本电脑,认准英特尔认证标志就够了
MAX2686, MAX2688 GPS LNAs provide low noise and save space w
射下三星?“射手”小米6配置曝光,不低于三星S8!
平板电脑散热diy制作 超实用
最基础电流保险丝的知识
雪亮工程项目推进力度加大 推动公共安全视频监控覆盖范围加大
关于点胶代加工与灌胶代加工,它们的差别在哪里
一汽宣布增资入股摩拜出行 持10%股权
漫途科技设备远程运维系统,改变传统运维模式!
中小型电机的国际标准盘点
英伟达收购Arm引发竞争对手的强烈担忧