这是法国号么?

最近读的几本书都不太成功,2025年我忽然变得不想打模棱两可的分数,《村上春树的音乐异想世界》到后半我已经完全没有耐心看那些我完全没有了解的演奏者介绍,我忽然开始对这类断层式逼格书写失去耐心。这本书适合对古典音乐背景知识有中级以上理解的人群,最好是生活优渥的同好者,不过那也未必会获得什么令人满意的体验。因为我猜想这类人根本不会去读这类书籍,他们可以直击欧洲某国或者美国日本的中古唱片店,又何必在这里看这些在页周巨大留白,导致封面的字迹看不清楚的唱片封套照片,被缩小合并印刷的书籍彩页呢?

既然它是一个流水账,也罢,我相信村上老师的古典音乐品味,那么我按图索骥,去Spotify拼凑一个播放列表出来,方便我后面细细体味总是好的,不过要命的是村上列出的都是十分古老的版本,很多是初次录制版,单声道的,十分难找到,这样就更加放大了“即便你找到了也不是我说的那个奇妙的版本哦”,这种在眼前开启A.T Field后让你难以近身把玩的无奈感。

我好不容易凑齐了这个单子,在接近篇尾时,写到(大约是这个意思的一段):

如果不是莫扎特专门为法国号写了一个协奏曲,法国号被单独拿出来欣赏的机会将会变得更少
差不多是这种感觉的话吧,对应的作品是,Horn Concerto No.3 in E flat, K.447:2.Romance

我不知道什么时候开始对法国号这种乐器特别留意的,相比较下,我不太喜欢小提琴,喜欢大提琴,更喜欢的是大提琴,或者黑管。就是那种,不会太激昂的,刺激的乐器。喜欢的作品也都偏浪漫舒缓,带有诙谐味道的很得我心。

忽然刷到有人开始Remix Rain(비)在差不多十几年前发的一首歌La song,我十分喜欢Rain跳开场时候这段时候的感觉,期间的伴奏乐器我感觉是不是有人在用特殊办法演奏的法国号呢?

以下是我的验证过程:

1 查询对应编曲的组成数据,未果。
2 直接问询claude(我已经放弃GPT), 它一开始瞎说是萨克斯,明显不是。
3 claude给了一种分析乐器特征频率范围的办法,看起来好像很科学,决定一试。
4 youtube应该是最近更新了安全策略,在头部网站数据访问量均被头部AI工具疯狂爬取之后,视频内容就是正在被消耗的数据资源。因此想要download la song的mv,我需要更新最新版本的 yt-dlp。

1
yt-dlp -U

最好使用conda创建新的虚拟环境做安装操作,方便满足不同包的版本需求。

1
2
3
conda create -n ytdl python=3.11
conda activate ytdl
pip install yt-dlp

随后,使用代理,或者使用浏览器cookies,来解除youtube对内容的保护。
使用代理的办法:

1
yt-dlp --proxy http://localhost:7890 -f "bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best" -o "%(title)s.mp4" https://www.youtube.com/watch\?v\=ki00FJhmP9s

使用浏览器cookies的办法

1
yt-dlp --cookies-from-browser chrome -f "bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best" -o "%(title)s.mp4" https://www.youtube.com/watch\?v\=ki00FJhmP9s

5 安装librosa

1
pip install librosa>=0.8.0 matplotlib>=3.3.0

6 判断法国号的实现脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import librosa
import numpy as np
import librosa.display
import matplotlib.pyplot as plt
def detect_french_horn(file_path, start_time=None, end_time=None):
y, sr = librosa.load(file_path)

# 截取指定时间段
if start_time and end_time:
start_sample = int(start_time * sr)
end_sample = int(end_time * sr)
y = y[start_sample:end_sample]

# 分析频谱
S = librosa.feature.melspectrogram(y=y, sr=sr, n_mels=128)
S_db = librosa.power_to_db(S, ref=np.max)

# 法国号特征频率范围
horn_freq_mask = (librosa.mel_frequencies(n_mels=128) >= 60) & (librosa.mel_frequencies(n_mels=128) <= 700)
horn_presence = np.mean(S_db[horn_freq_mask])

plt.figure(figsize=(12, 8))
librosa.display.specshow(S_db, sr=sr, y_axis='mel')
plt.title('Mel Spectrogram')
plt.colorbar(format='%+2.0f dB')
plt.show()

return horn_presence > -40 # 阈值可调整

# 使用示例
is_horn_present = detect_french_horn('lasong.mp3', start_time=59, end_time=75) # 分析10-15秒
print(f"法国号存在概率: {'高' if is_horn_present else '低'}")

这个测试的结果是,它认为存在概率高。

我截取了目标段落,发给敬爱的人民艺术家Y老师,问是不是法国号,他说:

“法国号就是圆号(Horn),这个不是,是大号(Tuba),法国号没有这么低沉”

7 于是又让claude修改成检测大号

1
2
3
4
# 大号特征频率范围
tuba_freq_mask = (librosa.mel_frequencies(n_mels=128, fmin=20, fmax=500) >= 29) & \
(librosa.mel_frequencies(n_mels=128, fmin=20, fmax=500) <= 233)
tuba_presence = np.mean(S_db[tuba_freq_mask])

得出的结果却是可能性低。

我准备相信Y老师的说法。