#01 试着合成母音


 

 

参考先行者的制作过程,生成母音貌似有两种思路:

 

  • 以正弦波为起点,将不同振幅的正弦波叠加起来模拟泛音列。
  • 以噪声为起点,用滤波器把噪声塑造成接近人声的频谱形状。

 

我觉得两者的主要区别在于非倍频成分的处理。

 

对噪声滤波时一般不会把非倍频成分抑制到接近无,

 

而这些成分可能会使生产的音色更接近人,也可能会影响音色的统一性(待考证)。

 

要说共同点的话,那就是两者都需要真实人声频谱作为参考。

 

 

 

我的做法是:

  • 一、分析自己的母音频谱,提取泛音列的幅值系数
  • 二、根据系数,生成正弦波,叠加生成母音的「模板」
  • 三、在模板的基础上用滤波器进行音色的细致调整

 

第一、第二步在 Matlab 中进行,第三步在宿主软件中进行。

 

 

如图所示,这是一个音高为 C4 的母音あ的部分频谱,横轴网格为泛音列:

 

可以看到在倍频的位置是有明显的针状突起的。

 

纵轴的单位不重要,绝对数值大小也不重要。

 

 

 

获取系数之后就可以进入生成的步骤了。

 

我写了简单程序用于生产母音模板片段,有优化空间,仅供参考:

 

Fs = 44100;               % 采样率 (Hz)

n = 1:Fs;                    % 生成采样点个数,此处为时长1s,可以改

 

F0 = 261.625565;      % C4的基频 (Hz),可以改

series = 64;                % 最高谐波次数,可以改

 

Fn = 1:series;

Fn = 2*pi*F0*Fn;        % 谐波频率 (rad/s)

weight = [……];          % 控制音色的谐波振幅系数,需要事先获取

 

% 叠正弦波

voice = zeros(size(n));

for i = 1:series

     voice = voice + weight(i).*sin(Fn(i)./Fs.*n);

end

 

audiowrite('文件名.wav', voice, Fs);   % 保存到 wav 文件

 

% sound(voice,Fs);                            % 试听      % 这行是注释

 

 

 

我想设计一个比较中性的音色,

 

参考日语元音图,简单选取了经典男女共振峰 F1、F2 各自的中点为设计值:

 

 

以及,F3不改动,保持模板的3200Hz左右。

 

F4是一个比较体现音色特征的参数,不随发生状态改变,目标调整到4200Hz左右。

 

 

接下来的工作转移到宿主中进行。

 

  • 调整输出片段的包络,画出接近真人发声的音头、音尾淡入淡出。
  • 参考设计的共振峰数值,用滤波器调整频率成分
  • 加混响与轻微噪声模拟语尾息

 

 

到这一步基本算是完成了。

 

 

 

检查时频图时注意到,合成母音在全频段都有比较明显的谐波,

 

这不太符合人声的特征。

 

 

 

对比资料,如图,可以看到あ以外的母音都有比较明显的空白频段:

 

 

い在 1000Hz~2600Hz 是近乎空缺的,え的 1000Hz~200Hz 也是类似的表现;

 

う的 2000Hz~3000Hz 成分较弱,お的1500Hz~3000Hz表现类似。

 

 

 

还观察到所有元音在4000Hz~6000Hz中的某处处会出现空白,

 

此处似乎属于梨状窝的反共振峰?

 

这个反共振峰男女都有,似乎男性表现得更显著。

 

 

 

参考上述数据,再次使用滤波器削减部分频段。

 

最终得到了这样一个文件:_あ_い_う_え_お.wav

 

 

国内多半打不开,所以我传了一份网盘,草(……

 

 

 

评价:

 

  • 听感较闷,有高频缺失感

 

实际上从设计开始就可以预料到高频缺失的情况

 

正弦波序列只包含到64次谐波,频率上限大约为261×64=16704 (Hz),

 

相比人类听觉上限20000Hz,确实缺了一大段。

 

 

 

但从活人素材里提取的谱在5kHz以上已经很弱了,

 

和噪声的起伏差距不大,有自然好,但对音色塑造不起关键作用,

 

总之谐波次数取到几还是看个人感觉吧……!