语音基础知识和处理流程(TTS小白入门)

一、口水话描述

1. 怎么表示声音

声音的记录可以通过描述振动点在各个时间点相对于中心位置的偏移量来实现。简单来说,就是一个描述振动点位置随时间变化的序列。在将声音存储为数字信号的过程中,对该连续序列进行采样。例如,每秒采样16000次(采样率为16000 Hz)。在播放声音时,通过控制发声器在每1/16000秒的位置偏移,即可还原声音。采样率越高,对序列的描述越精细,声音的还原度也越高。

音频通常采用16位整数进行存储。在采样过程中设置最大振幅,这样可以将序列映射到(-1, 1)的范围。然后将其乘以2**15-1得到整数,并保存到文件中。使用soundfile库读取WAV文件时,返回的形式为一维数组。

2.怎么更有效的表示声音(SFFT)

使用采样可以表示声音,但以16000 Hz的采样率,一秒钟的声音需要16000个数据点。如果用于语音合成,这意味着10个字(大约5秒钟)就需要预测近80000个点,对模型来说计算量过大。

短时傅里叶变换(STFT)是一种有效的替代方法。STFT将一个周期信号拆分为多个周期信号,通过傅里叶变换,可以将这些周期信号从时域(振幅随时间变化)转换到频域(不同频率的信号叠加)。在频域,不同频率的信号叠加需要各自的振幅和相位来还原原始信号。

进行STFT时,从信号中截取一小段(帧),例如帧大小为1000,则包含1000个数据点。添加窗函数可以避免频谱泄漏【链接-什么是频谱泄漏】。由于STFT变换后,信号在频域的表示是对称的,我们只需研究一半,即500个点。这500个点分别对应从最小频率到最大频率范围内划分的500个频段。每个频段的表示包括振幅和相位信息【链接-采样率、bin、FFT后的理解】。
在这里插入图片描述
在这里插入图片描述

上面讲了一帧的变换,如果对整个时间信号进行多次短时傅里叶变换(STFT),就可以表示整个声音。具体设置为hop_length=200(每次向前移动200个采样点)。通过STFT处理,一秒钟的16000个点(约800帧)变换为一个[500,801]的复数矩阵(帧大小1000,hop_length为200),其中500代表频带数,801代表帧数,矩阵的实部表示振幅,虚部表示相位。

通常只取幅度信息(实数部分),因为它保留的信息更多。Griffin-Lim算法利用幅度谱还原声音,但效果较差。

尽管STFT变换将16000个点变成了500*801的矩阵(约40万个点),由于hop_length较小,帧与帧之间有重叠,这使得结果点数反而比原始数据点更多。

怎么更有效的表示声音(mel谱)

人耳对高频信号不敏感,对Hz标度单位的感知是非线性的。例如,习惯了1000Hz音调的人,频率提高到2000Hz时,只能察觉到频率有些提高,而不会觉得翻倍。这是因为人耳对频率的感知遵循对数关系,用mel尺度表示。

mel谱刻度和Hz刻度之间是对数关系。频率较小时,mel随Hz变化快;频率较大时,mel上升缓慢。实际应用中,我们用80个mel滤波器,将500个线性频带映射到80个mel频带【链接-梅尔频谱和梅尔倒谱】。

转换到mel谱后,得到的是每个mel频带的振幅,形成一个80*501的矩阵。由于振幅差距较大,通常会将振幅转换为分贝,即取对数。转换为mel谱有两个对数步骤:

  1. 将500个线性频带映射到80个mel频带。
  2. 将80*501个振幅点取对数,转换为分贝。

最终得到的80*501矩阵中,501表示帧数,80表示mel频带数。每个值代表特定帧和频带的分贝。TTS一般使用mel谱。
在这里插入图片描述
在这里插入图片描述

信号增强
  1. 预加重
    预加重就是对输入信号高频分量进行补偿。语音的低频段能量较大,能量主要分布在低频段,语音的功率谱密度随频率的增高而下降,通过预加重来,保持输出信号不变,有效降低输出噪声,以达到提高输出信噪比的目的。预加重如下图所示。【链接-预加重】
    在这里插入图片描述
  2. 加窗
    加窗主要是为了使时域信号似乎更好地满足 FFT 处理的周期性要求,减少泄漏。具体就是FFT分析需要满足周期性,但是直接按照帧大小截取一段出来的一般都不是整周期,而通过加窗来减弱频谱泄漏。
    如图左,发现其就是一个低频正弦波,如果我们截取一段,而没有截取到整周期,然后复制这一段形成右图。右图就会导致原单低频波分解为一个低频波加上一些高频的分量。

二、基础概念

  • 频谱

频谱的获得:对一个时域信号进行傅里叶变换,得到信号的频谱。

频谱的组成:信号的频谱由两部分构成: 幅度谱和相位谱。

  • 幅度谱和相位谱:

在傅里叶分析中, 把各个分量的幅度随着频率的变化称为信号的幅度谱。

把各个分量的相位随着频率变化称为信号的相位谱。

  • 能量谱( power spectrum)

能量谱,也称为能量谱密度,是指用密度的概念表示信号能量在各频率点的分布情况,反应能量随频率的变化。

能量谱是信号幅度谱的模的平方,其量纲是焦/赫,对能量谱在频域上积分就可以得到信号的能量。

  • 功率谱

功率谱,也称为功率谱密度,是指用密度的概念表示信号功率在各频率点的分布情况,反应功率随频率的变化。

功率谱是信号自相关函数的傅里叶变换,对功率谱在频域上积分就可以得到信号的功率。

  • 梅尔频谱

由于得到的声谱图较大,为了得到合适大小的声音特征,通常将它通过梅尔尺度滤波器组(Mel-scale filter banks),变为梅尔频谱。频率的单位是HZ,人耳能听到的频率范围是20-20000HZ,但是人耳对HZ单位不是线性敏感,而是对低HZ敏感,对高HZ不敏感,将HZ频率转化为梅尔频率,则人耳对频率的感知度就变为线性

  • 倒谱

就是一种信号的傅里叶变换经对数运算后再进行傅里叶反变换得到的谱。它的计算过程如下:
梅尔频率倒谱系数(Mel Frequency Cepstrum Coefficient, MFCC)考虑到了人类的听觉特征,先将线性频谱映射到基于听觉感知的Mel非线性频谱中,然后转换到倒谱上。
步骤先得到Mel频谱,在Mel频谱上面进行倒谱分析(取对数,做逆变换,实际逆变换一般是通过DCT离散余弦变换来实现,取DCT后的第2个到第13个系数作为MFCC系数),获得Mel频率倒谱系数MFCC,这个MFCC就是这帧语音的特征;(倒谱分析,获得MFCC作为语音特征)

三、基础参数

sampling_rate 音频文件一秒包含的音频采样数
fft_size 短时傅里叶变换中一帧的音频采样数
hop_length 帧移。一般设置为fft-size的1/4
win_length 窗口大小。
num_mels 产生的梅尔带数
fmax/fmin 最高频率/最低频率
spectrum 频谱
spectrogram: 声谱图
amplitude 振幅

四、基础处理流程

  • 补足帧、降噪、音量均衡、去静音段
  • 预加重。通过高通滤波器实现 scipy.signal.lfilter
  • 短时傅里叶变换(STFT)
  • 线性谱转mel谱
  • 振幅转分贝

五、Griffin-lim算法

#输入为线性谱s
#1.初始化一个虚部并转换为相位: 
angles = np.exp(2j * np.pi * np.random.rand(*S.shape))
#2.转换s为实数(实部为s)
S_complex = np.abs(S).astype(np.complex)
#3.逆stft变换
y = librosa.istft(S_complex * angles, hop_length=get_hop_size(hparams), win_length=hparams.win_size)
#4.循环
for i in range(hparams.griffin_lim_iters):
   angles = np.exp(1j * np.angle(_stft(y, hparams)))
   y = librosa.istft(S_complex * angles, hop_length=get_hop_size(hparams), win_length=hparams.win_size)

下面是公众号,欢迎扫描二维码,谢谢关注,谢谢支持!
> 公众号名称: 清易AI
![公众号](https://img-blog.csdnimg.cn/direct/62ce4179f33d4210aef9d7b22d229870.jpeg)
欢迎来到“清易AI”!这里将为你揭开在家用电脑上轻松部署AI的神秘面纱。探索LLM、TTS、ASR等AI模型桌面部署,通过简洁而深入的技术文章,让你在AI的世界中轻松自如。成为家庭AI工程师,从容享受智能的乐趣!
  • 2
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值