(本文部分观点已经在在各种旧文中发表过,如果有既视感为正常现象。)
Hi-Res音频(相比CD)是否有意义?首先要客观分析HR到底改变了什么。
Remastering / remix
之前提过,很多时候Hi-Res最大的意义并不在于“High”本身,而是给了厂牌一次re-release的机会。这本质上和是否HR是没有任何关系的,唱片公司如果愿意,完全可以发行remastered的CD(事实上,很多精选集CD里的旧曲都进行了remaster)。注意这里的remastering是指狭义的、即混音有明显的变化的情况,从物理角度来说就是波形或频谱有明显的变化,不包括单纯的音量、动态范围变化(compress),那个下面专门叙述。
当然,重新混音并不是单纯的技术问题,而且还有艺术发挥的成分,所以这个主观性就很大了。很多时候可能重混后的版本不如原版(个人喜好)。随便举个例子,Lantis的HR版的『U・N・M・E・I ライブ』和CD版混音有较为明显的区别,HR版声场重新调整过,但是我个人觉得人声偏小,更喜好CD版。另外就是上次说过的「THE IDOLM@STER MILLION THE@TER GENERATION 11 UNION!!」这张碟也有类似区别。
对于新发行的音乐,一般CD版和HR版不会也不应该有混音(狭义)的区别——几乎不存在某波形HR能发挥、CD发挥不出来的情形。如果厂商这么做,那只能认为是为了商业考虑故意劣化CD版,而不是什么技术限制。
高采样率
一般HR都是从CD的44100Hz提升到96000Hz。由于采样定理和人耳的频率听觉极限客观摆在那里,可以自信地说,高采样率应该是HR最无用的提升没有之一。
硬要说的话,有个小问题就是现在音乐大多在制作过程中使用96000Hz(或者48000Hz?),而CD的采样率由于历史原因是44100这个不能整除的数字,所以resample可能会有时域上的aliasing等问题。不过,有大量高质量的resampling算法的存在,这个问题在主观听感上的影响可以忽略不计。
高量化精度
CD的量化精度(位深)是16bit,HR一般提升到24bit或者32bit。虽然从听感上来说这个到底能否能产生肉耳可辨的区别也很难讲,但是考虑到类比图像的话,8bit/channel这个在当年被普遍认为绰绰有余的位深现在肉眼可见的捉襟见肘(更不要提当年为了work around这个位深在深色感知灰度不足的问题,搞出的遗毒万年的gamma空间,这里按下不表),这里我们还是保守点说高位深还是大概有用的。而且高量化精度最大的优点就是给响度/振幅调整留下了足够的空间——这点在下面详述。
动态范围
前面铺垫了这么多,重头戏其实就是想说这个。CD明明是一个各种指标上都优越于黑胶的介质,为什么许多人却在追求70、80年代的老唱片,而且两者确实有明显的听感区别?一言以蔽之:万恶的响度战争。
在追求“越来越响”的前提下,导致音乐的平均音量(我们用一个简单的客观指标:RMS)不断上升,而波形的振幅极限则是固定的0 dBFS,所以能做的只有不断压缩动态范围,使得音乐越来越平(再多不再展开,参见旧文)。
响度战争在进入21世纪之后已经基本进入一个平稳期,基本商业作品(指我一般听的日本ACG)稳定在单边动态范围(RMS->Peak)9-11dB这个数字上。
眼尖的可以发现,响度战争这个问题,和CD vs HR又是没有直接关系的:你完全可以塞高动态范围(因而平均音量也要小很多)的母带进CD(严谨地说,高动态范围配合高量化精度当然最好,但是CD的位深一般也绰绰有余了),只是厂商为了听起来够响不这么做而已。
幸好,HR一般是面向所谓audiophile的,所以比较重视这个问题,不会过度压缩动态范围。而这,也几乎是任何新发行音乐唯一值得追求HR的原因。
反过来讲,如果你发行的HR和CD完全一样的动态范围、更没有mastering上的区别,仅仅是数字96/24好看,那真的有意义么?请容我大言不惭地说一句,没有!
这里让我们有请Lantis选手:
| Title | Version | RMS | Peak | Diff |
| Glow Map | CD | -8.84 | -0.1 | 8.74 |
| Glow Map | Hi-Res | -8.83 | -0.1 | 8.73 |
| あの花のように | Hi-Res | -9.42 | -0.6 | 8.81 |
| なんどでも笑おう | Hi-Res | -16.8 | 0 | 16.8 |
| 眠り姫 [ORT] | Hi-Res | -16.33 | -0.09 | 16.24 |
不用多说什么了吧。下面两首是作为对比的哥伦比亚的最近发行的的HR。HR和CD完全一样的动态范围就不提了,更可怕的是烂铁的CD们的RMS已经拉到了-8.x这个水平,还剩多少动态范围可想而知了。
当然这个问题不是只有烂铁一家有,只不过一般没这么夸张。看看もちょ最近几张CD(这里同时列出单曲版和专辑版,因为部分有变化):
| Artist | Sg | Al | Song | Source | Version | RMS (dB) | Peak (dB) | Diff (dB) |
| 麻倉もも | 5 | 2 | 365×LOVE | Album | CD | -9.922 | -0.028 | 9.894 |
| 麻倉もも | 5 | 2 | 365×LOVE | Single | CD | -10.847 | -0.001 | 10.847 |
| 麻倉もも | 5 | 2 | 365×LOVE | Single | Hi-Res | -12.595 | -0.198 | 12.397 |
| 麻倉もも | 5 | 2 | 365×LOVE | Album | Hi-Res | -11.323 | -0.201 | 11.122 |
| 麻倉もも | 6 | 2 | シュークリーム | Album | CD | -10.388 | -0.001 | 10.388 |
| 麻倉もも | 6 | 2 | シュークリーム | Single | CD | -10.928 | -0.001 | 10.927 |
| 麻倉もも | 6 | 2 | シュークリーム | Single | Hi-Res | -12.639 | -0.198 | 12.442 |
| 麻倉もも | 6 | 2 | シュークリーム | Album | Hi-Res | -11.805 | -0.200 | 11.605 |
| 麻倉もも | 6 | 2 | スマッシュ・ドロップ | Album | CD | -9.808 | -0.001 | 9.808 |
| 麻倉もも | 6 | 2 | スマッシュ・ドロップ | Single | CD | -9.990 | -0.001 | 9.990 |
| 麻倉もも | 6 | 2 | スマッシュ・ドロップ | Single | Hi-Res | -11.945 | -0.198 | 11.747 |
| 麻倉もも | 6 | 2 | スマッシュ・ドロップ | Album | Hi-Res | -11.247 | -0.200 | 11.047 |
| 麻倉もも | 7 | 2 | “さよなら”聞いて。 | Album | CD | -10.814 | -0.001 | 10.814 |
| 麻倉もも | 7 | 2 | “さよなら”聞いて。 | Single | CD | -9.392 | -0.113 | 9.279 |
| 麻倉もも | 7 | 2 | “さよなら”聞いて。 | Single | Hi-Res | -10.057 | -0.116 | 9.942 |
| 麻倉もも | 7 | 2 | “さよなら”聞いて。 | Album | Hi-Res | -12.201 | -0.201 | 12.000 |
| 麻倉もも | 7 | 2 | ユメシンデレラ | Album | CD | -10.376 | -0.009 | 10.367 |
| 麻倉もも | 7 | 2 | ユメシンデレラ | Single | CD | -9.107 | -0.174 | 8.934 |
| 麻倉もも | 7 | 2 | ユメシンデレラ | Single | Hi-Res | -9.709 | -0.172 | 9.537 |
| 麻倉もも | 7 | 2 | ユメシンデレラ | Album | Hi-Res | -11.783 | -0.201 | 11.582 |
もちょ早期几张也存在CD版和HR版动态范围完全一样的问题,不过最近发行的至少能多出2dB左右。另外比较搞笑的是同样是音雨人,制作还有细微的差别,もちょ这里可以看到HR版一般有很多余(正确制作的音频有没有headroom,并没有任何区别)的-0.2dB的headroom,而ナンス的碟则基本全都是CD、HR无论RMS/Peak都完全一样的。手头的CD没抓只存了HR版,就不贴数据了。
不过,不同动态范围听起来区别大不大?这个和个人听力、设备、以及更重要的音乐类型还是关系比较大的(例如交响乐一般很需要大动态),我一般听听日呆流行也听不太出区别(事实上,为了车上放歌方便,我放手机的音乐全都是手动压缩过的动态范围均衡过音量的,我有罪)。但这至少是一个实打实、肉眼可见(笑)的客观的区别。
外一则:Python的音频库
在写DR计算的脚本时,发现Python的音频处理库中,似乎并没有一个明显的first choice。当然,数学计算部分都是用Numpy做的,我这里需要的仅仅是一个解码read的库而已。
搜刮了一阵,大概有这么一下几个选择,这里简单介绍下区别:
def read_wavefile(f):
from scipy.io import wavfile
samplerate, data = wavfile.read(f)
return data, samplerate
最简单的scipy里的wavfile,基本不支持wave/PCM之外的任何类型。输出就是原始整型,取决于位深,int16或者32。注意输出顺序是采样率/值,我颠倒了下便于和别的几个一致。
def read_sf(f):
import soundfile as sf
return sf.read(f)
SoundFile库。输出似乎永远是float64。支持的格式比上面多,但是不支持m4a(好像支持raw AAC?)。
def read_librosa(f, resampling=None):
import librosa
data, samplerate = librosa.load(f, sr=resampling, mono=False) #mono by default, resampling super slow
data = np.transpose(data)
return data, samplerate
librosa。其本质是调用SF(上述)或者audioread,所以支持的格式也有限。另外参见注释:默认是mono输出很迷惑,自带的resampling巨慢。值的矩阵要转置下和别的统一。好像永远是float32。
def read_pydub(f, normalized=True):
import pydub
a = pydub.AudioSegment.from_file(f)
# a = a.set_frame_rate(44100)
y = np.array(a.get_array_of_samples())
if a.channels == 2:
y = y.reshape((-1, 2))
if normalized:
if y.dtype == np.int16:
power = 15
elif y.dtype == np.int32:
power = 31
else:
raise Exception
return np.float32(y) / 2**power, a.frame_rate # convert to float32 should be more than enough
else:
return y, a.frame_rate # y is same as PCM (int16 or 32)
pydub是我比较推荐使用的库了,他是调用FFMPEG来解码的,所以基本支持任何格式。可以通过set_frame_rate来resampling。唯一的问题就是他默认输出的格式和别人比较与众不同,所以要通过上面这一坨子来输出和别人一样的东西。
这里的normalized是指把PCM的整型normalize到[-1,1]的float,并不会改变振幅啦。因为我后面发现做数学计算的时候整型会比较烦,所以我直接在这里面转了float32。
题外话,int16转float [-1,1]无论是除以2^15还是2^15-1都会有小问题(前者会导致32767无法变成1,后者会导致-32768溢出,虽然业界惯例是前者),不是左右对称的辣鸡有符号整型真的超纠结……
另外一个巨坑是如何判断np.array的dtype,参见这个SO,辅助阅读这个。
最后前几天发现pydub有个bug:读取24bit的wav巨慢,比同样的FLAC慢几十倍,原因不明。






















