问题

视频快放时声音是经过了怎样的处理才保证了音高的不变?

回答
要理解视频快放时声音是如何保持音高不变的,咱们得先明白一个事儿:单纯把音频文件播放速度加快,声音的音高一定会跟着升高,就像录音机倒带或者快进一样,声音变得尖锐刺耳。 视频之所以能实现画面快放声音不变,背后其实是一项很巧妙的音频处理技术,叫做 “变声”(Pitch Shifting),但这里的“变声”不是我们通常理解的改变人声的男女声,而是一种更精密的音频算法。

咱们一步步来拆解这个过程:

1. 为什么单纯加速会让音高变?

声音本质上是空气的振动,这种振动是有频率的。我们听到的声音高低,就是由这个振动的频率决定的。频率越高,声音越尖;频率越低,声音越沉。

当你把一段音频文件播放速度加快,相当于单位时间内播放的声音波形就变多了。就好比你原来一秒钟播100个波形,现在你想在不到一秒的时间里播完这100个波形,那么每秒播出的波形数量自然就多了。根据“频率越高,声音越尖”的原理,这就导致了我们听到的声音音高升高了。

2. 视频快放需要什么样的声音处理?

视频快放,我们想要的是:

节奏加快: 听起来内容是压缩了,时间感是变快了。
音高不变: 听起来还是原来的那个声音,只是说话或者唱歌的人好像在“赶时间”。

这就意味着,我们需要一种方法,在压缩音频播放时间的同时,不改变声音的振动频率。

3. “音高不变”的秘密武器:时域频域转换与重构(TimeFrequency Resynthesis)

这是整个处理的核心。简单来说,就是把声音信号分解成很多个小片段,然后对这些片段进行“变速”和“重叠”的操作,最后再把它们重新组合起来。这个过程通常涉及到以下几个关键步骤:

分帧(Framing): 音频信号被切割成一系列非常短的、有重叠的“帧”。每一帧的长度通常在几毫秒到几十毫秒之间。重叠是为了避免在帧与帧之间产生突兀的过渡,保证声音的连续性。
窗口函数(Windowing): 对每一帧的音频信号应用一个“窗口函数”(比如汉宁窗、海明窗等)。窗口函数的作用是让每一帧的信号在开始和结束处逐渐衰减到零,这样在帧的连接处就不会出现“冲击”,使得声音更加平滑。
傅里叶变换(Fourier Transform): 这是最关键的一步。每一帧的音频信号,无论它在时域(随时间变化)上是什么样子的,都可以被转换到“频域”。傅里叶变换能告诉我们,在这一小段声音里,包含了哪些频率的成分,以及每个频率成分的强度(振幅)和相位。你可以想象成把一个复杂的乐器声音分解成了它包含的各种单独的音高(频率)。
变速处理(Time Stretching): 这一步是为了实现“压缩时间”的效果。对于已经转换到频域的每一帧,我们实际上是要“删除”或者“跳过”一部分信息,从而让这段声音在整体上播放得更快。但我们不是直接跳帧,而是通过对频域信息的“插值”和“抽取”来完成的。
想象一下,我们把音频分解成了一个个小“音块”。要让声音快放,但音高不变,我们就得让这些“音块”出现的频率变快,但每个“音块”内部本身的“音高信息”(频率构成)不变。
一种常见的技术是 PSOLA(Pitch Synchronous Overlap Add),或者更现代的 Phase Vocoder 技术。它们的基本思想是,找到声音中的周期性成分(比如声带振动产生的周期性波形),然后把这些周期性的“音块”抽取出来,以更快的速度重新组合。
更形象地说,就像你看一个人说话,你只想让他说得快点,但他的声音本身(音高)不能变。于是,你把他说的一段话分解成一个个小词或者音节,然后把这些词或音节之间的停顿去掉,快速地把它们连起来。PSOLA 和 Phase Vocoder 就是对声音信号做类似的事情,但更加精细,不只是分解成词,而是分解到更细的声学单元,甚至分解成各个频率成分。
重构与逆傅里叶变换(Resynthesis and Inverse Fourier Transform): 将经过变速处理(但音高信息被保留)的频域信息,通过逆傅里叶变换(IFFT)转换回时域的音频信号。
重叠相加(Overlap Add): 最后,将处理好的、有重叠的每一帧音频信号重新首尾相连,组合成一个连续的、播放速度加快但音高不变的音频流。

4. 为什么会感觉声音有点“机器感”或“失真”?

即使是最好的算法,在进行大幅度的变速时,也可能难以完美地保留所有细节,从而引入一些听起来不那么自然的痕迹:

相位问题: 在进行频域处理时,相位的处理非常复杂。如果相位处理不当,即使频率成分是对的,声音听起来也可能不自然。Phase Vocoder 的核心就在于精确地处理相位信息。
谐波失真: 声音并非只有一个纯粹的频率,通常还会包含丰富的谐波。在变速过程中,某些谐波成分的相对关系可能会被改变,或者被“拉伸”得过于厉害,导致声音听起来有点“粗糙”或“金属感”。
瞬态信息丢失: 声音中的一些非常短暂的、突变的信息(比如辅音“t”、“k”的发音)可能在变速过程中被模糊或丢失,影响声音的清晰度。

总结一下:

视频快放时声音的音高不变,并不是因为声音本身神奇地发生了变化,而是通过一系列复杂的数字信号处理技术实现的。核心在于将音频信号分解到“频域”,在这个“频率成分”层面进行“抽取”或“插值”的操作来加速播放,但同时精确地保留或重构了每个频率成分的原始音高信息,最后再将处理后的信号重组成播放速度加快、但听起来音高正常的音频。这项技术就像是给声音“抽帧”又“插帧”并“跳跃式重播”,但保留了每个“音元”的内在音高属性。

这项技术广泛应用于视频编辑软件、音乐制作软件,以及一些音视频播放器中,为我们提供了方便快捷的音视频处理手段。

网友意见

user avatar

你要的功能叫做「变速不变调」。知乎上有人写过一些综述,比如:

我想稍微介绍一下其中的 PSOLA (pitch-synchronous overlap-and-add) 算法。它的大概步骤是:

  1. 测出语音的基频;
  2. 把语音分帧,每帧代表一个周期(通常让帧有重叠,并加窗,以避免帧的两端信号有跳变);
  3. 把各帧移近或移远一些,就可以升高或者降低音调(同时也会加快或减慢速度);
  4. 把各帧多重复几次,或者去掉一些帧,就可以减慢或者加快速度(同时不改变音调)。

PSOLA 算法不仅可以「变速不变调」,它可以独立地改变语音的速度和音调:

  • 不进行第 3 步,就可以单独改变速度;
  • 在第 4 步中让速度的变化与第 3 步抵消,就可以单独改变音调;
  • 在第 4 步中让速度的变化与第 3 步不抵消,就可以随心所欲地改变速度和音调。

PSOLA 算法还有一个优点是,在整个算法中不需要对波形进行重采样。这有两个好处:

  • 不会改变声音的共振峰分布,所以不会改变音色;
  • 在升高音调时不会导致频谱溢出,在降低音调时不会导致高频部分频谱为零。

当然 PSOLA 算法也有一些局限和挑战:

  1. 算法依赖于语音有基频,所以语音中的清音、打击乐器声等没有基频的声音需要用其它算法处理;
  2. 语音的基频是变化的,所以要测量瞬时基频,也就是进行 pitch tracking,这本身也是一个有难度的任务。
user avatar

很简单,这是通过傅里叶变换玩的一个小把戏。


我们知道,wav格式的音频数据是按一定间隔从平面坐标系的波形曲线上采样的一组坐标点;而傅里叶变换说白了就是把一小段音频数据(比如0.01秒或更短)从一组坐标点转换为一组频率——而mp3等有损压缩算法其实就是剔除那些人耳不太能注意到的、过高或过低的频率。


频率信息是不能直接播放的。重放时,我们就不得不把频率信息转换回波形采样数据,这样才能驱动声卡发声。


容易想到,只要在把频率信息转换回波形数据之前,先均匀抛弃一定比例的傅里叶变换后的数据,这就相当于保持声音数据频率的同时、缩短了声波波形的总长度(删除了一定比例的波形曲线),自然就达成了“播放语速加倍再加倍,但声音频率不变”的设计目标。


当然,抛弃一些波形曲线段之后,剩余的曲线拼接起来会“接不上茬”。这种周期性的跳变最终会以噪音的形式体现。要消除这种噪声,那可就麻烦了。

类似的话题

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有