当前位置: 华文问答 > 数码

早期机器人说话的声音为什么都是一声?

2020-01-01数码

问题不太明确,我来分情况讨论一下。

1. 机器人指的就是现实中的机器人产品

既然这种机器人发出的声音听起来不像真实的,那就说明它不是把语音预先录制然后播放(比如「倒车请注意」),而是用语音合成技术来生成语音的。

语音的音高,是由「基频」决定的。在语谱图上,语音看起来是「排骨」状的,每一根骨头叫做一个「谐波」,相邻谐波的间隔就是基频。比如, @曹力科 回答中「黑化肥发灰会挥发,灰化肥挥发会发黑」的语谱图就是下面这样的。注意「黑」这种一声字的谐波基本是水平的,而「化肥」这种声调有升降的字,谐波也有升降。

化肥绕口令——原始音频 https://www.zhihu.com/video/1206916879530635264

要根据文本生成基频的变化,并不是一件容易的事,对于早期的语音合成来说更是这样。如果一个合成语音听起来全是一声,那么就很有可能它根本就没有去建模基频的变化,而是偷懒把基频设置为常数。这样的语音的语谱图上,就全是水平的谐波了。

2. 机器人指的是影视作品中的机器人

在影视作品中,为了给机器人赋予一种「非人感」,常常会对预先录制的真人声音进行处理。

@曹力科 的答案就给出了一种处理方法,其中关键的步骤就是:把原始语音延迟若干个不同的时间,然后叠加。他采用的参数为:总共叠加 10 份,最小延迟为 500 个采样点,最大延迟为 2000 个采样点。他使用的语音采样率是 16 kHz,那么相邻两份的时间差就是:(2000 - 500) / 9 / 16000 = 0.0104 s = 10.4 ms。

为什么这样处理会产生「都是一声」的听感呢?这就需要用到信号处理里的这个结论了: 时域重复等于频域采样 。在时域上每隔 10.4 ms 重复一次,相当于在频域中每隔 1 / (10.4 ms) = 96 Hz 采一次样。这其实就是用 梳状滤波器 对语音进行滤波,梳子的齿所在的频率都是 96 Hz 的倍数。滤波的效果如下面的视频所示:梳状滤波器会破坏掉语谱图原有的谐波结构,而生成一套新的谐波结构,相邻谐波的间距都是 96 Hz。你看,基频变成常数了——所以语音听起来就「都是一声」了。

化肥绕口令——叠加后的音频 https://www.zhihu.com/video/1206917660287811584

这种处理方法完全是人为的,并不需要用「增强无线传输语音的可靠性」来解释,因为:

  • 机器人之间要互相传递信息的话,不会采用「语音」这种低效的方式;
  • 实际中用无线传输语音时,早期使用的是调幅、调频等模拟技术;而现在有了数字技术,就可以对语音进行编码、压缩,传输中的形态早就不是波形了;
  • 重复传输的效果是对语音进行滤波,实际上丢失了信息,反倒降低了可靠性。