Skip to content

Commit 3d9d732

Browse files
committed
update to grid layout & new optimizer
1 parent 9796fbe commit 3d9d732

File tree

3 files changed

+618
-729
lines changed

3 files changed

+618
-729
lines changed

README.md

Lines changed: 48 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,13 @@ Emiya Engine 是一个用来丰富音频频谱的脚本。可以将频谱变得
99

1010
### 当前版本:
1111

12-
`RC Version 4`
12+
`RC Version 5`
1313

14-
### 编年史:
14+
<details>
15+
<summary>更新历史</summary>
1516

17+
- `RC 5`
18+
> 调整自动优化特性的实现
1619
- `RC 4`
1720
> 尝试在 CopyBand 模式中加入自动优化特性
1821
- `RC 3`
@@ -51,43 +54,31 @@ Emiya Engine 是一个用来丰富音频频谱的脚本。可以将频谱变得
5154
> 大部分的代码是为了处理超大数组拼接速度缓慢的问题
5255
> 处理后的音频有大量爆音及咔哒声,低电平音频容易看出处理痕迹
5356
54-
### RC 版本使用说明:
57+
</details>
5558

56-
为了方便使用,特地做了个 GUI 界面,
57-
但实际上还是挺难用的,所以还是说一下。
58-
59-
工具: Spek(仅频谱观察用),Audition(频谱观察/频率分析/后期处理用)
60-
61-
---
62-
63-
首先需要分析音乐类型,对于以下类型不建议使用 AkkoMode:
64-
- 电子合成纯音乐,背景乐器只有一两样的
65-
- 人声清唱带一个伴奏乐器
66-
- 其他频谱图中最高频率不到 18kHz 的音乐
67-
68-
例如这样的:
69-
![sample-not-for-akkomode](https://i.imgur.com/Fd4EoGN.jpg?1)
70-
71-
AkkoMode 适用于大部分时候音量都很大的流行乐(比如 JPOP),
72-
处理时应选用 Apple iTunes 购买的 AAC 格式音频,常见的频谱长这样:
73-
![some-jpop](https://i.imgur.com/swdtDz6.jpg)
74-
因为参数只有俩,多试几次就知道,此处就不展开说了。
75-
76-
---
59+
### 使用说明:
7760

61+
<details>
62+
<summary>半自动操作</summary>
63+
7864
CopyBand 自动优化(版本 >= RC4):
7965

8066
自动优化特性目的是去除 Audition 中进行繁琐的 FFT 滤波器后处理步骤。
8167
设计上仅考虑了处理后过大的高频增益,使用时尽量使输出频谱亮一点。
8268

8369
简单操作流程:
8470
1. 勾选 `合并 HPF` `仅估计截止频率`
85-
2. 点击 `执行`,将建议的截止频率、调制频率填写至 `冲击 HPF` 所在行,并设置增益倍率为 `1.0`
71+
2. 点击 `执行`,将建议的截止频率、调制频率填写至 `冲击 HPF` 所在行;
72+
![Step1](https://imgur.com/IBtmnSk.png)
8673
3. 取消勾选 `仅估计截止频率`,勾选 `动态范围保护` `自动优化`
74+
![Step2](https://imgur.com/5qOIKsN.png)
8775
4. 点击 `执行` 得到自动处理后的结果。
8876

89-
---
77+
</details>
9078

79+
<details>
80+
<summary>辅助手动操作</summary>
81+
9182
CopyBand 辅助调整(版本 >= RC 1):
9283

9384
CopyBand 模式需要设置六个参数,上手困难,
@@ -102,8 +93,31 @@ CopyBand 模式需要设置六个参数,上手困难,
10293
同样的,当提示 `建议维持冲击增益` 时,即调节完成。
10394
若需要更好的频谱「品相」,可以参考下步骤手动调整。
10495

96+
</details>
97+
98+
<details>
99+
<summary>完全手动操作</summary>
100+
101+
为了方便使用,特地做了个 GUI 界面,
102+
但实际上还是挺难用的,所以还是说一下。
103+
104+
工具: Spek(仅频谱观察用),Audition(频谱观察/频率分析/后期处理用)
105+
105106
---
106107

108+
首先需要分析音乐类型,对于以下类型不建议使用 AkkoMode:
109+
- 电子合成纯音乐,背景乐器只有一两样的
110+
- 人声清唱带一个伴奏乐器
111+
- 其他频谱图中最高频率不到 18kHz 的音乐
112+
113+
例如这样的:
114+
![sample-not-for-akkomode](https://i.imgur.com/Fd4EoGN.jpg?1)
115+
116+
AkkoMode 适用于大部分时候音量都很大的流行乐(比如 JPOP),
117+
处理时应选用 Apple iTunes 购买的 AAC 格式音频,常见的频谱长这样:
118+
![some-jpop](https://i.imgur.com/swdtDz6.jpg)
119+
因为参数只有俩,多试几次就知道,此处就不展开说了。
120+
107121
CopyBand 完全手动调整步骤:
108122

109123
配置之前观察频谱。
@@ -153,11 +167,12 @@ CopyBand 完全手动调整步骤:
153167
![final-2](https://i.imgur.com/9AbW9j2.jpg)
154168
这是谐波增益不够的原因,可以继续调整改善。最终得到以下结果:
155169
![final-3](https://i.imgur.com/2UO9OnW.jpg)
170+
171+
</details>
156172

157-
### 其他提示:
158-
159-
由于 CopyBand 本质是复制粘贴已有的部分,
160-
因此对于超过 48kHz 以上的拉升,需要多次处理达成,
173+
<details>
174+
<summary>其他提示</summary>
175+
161176
例如以下原始文件不到 16kHz:
162177
![ex-0](https://i.imgur.com/eAui0i7.jpg)
163178
拉升到 48kHz 采样需要的频率片段至少为 24-16=8kHz,
@@ -169,6 +184,9 @@ CopyBand 完全手动调整步骤:
169184
例如上边的例子被拉升到 192kHz 采样率,宛如天籁之声:
170185
![ex-1](https://i.imgur.com/QWKpaHA.jpg)
171186

187+
</details>
188+
189+
172190
### 特别提醒
173191
~~请不要使用这个脚本制造 `'HiRes'` 逗玄学家玩~~
174192

core/copyband.py

Lines changed: 18 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,27 @@ def core(
1515

1616
def hpd_n_shift(data, lpf, sft, gain):
1717
sr = output_sr*inter_sr
18+
# 计算增益
19+
gain_src = round(2*data.shape[0]*sft/sr)
20+
gain_dst = round(gain_src+0.025*data.shape[0])
21+
src_power = np.mean(np.abs(data[gain_src:gain_dst,:]))
1822
# 高通滤波
1923
b,a = signal.butter(3,lpf/(sr/2),'high')
2024
data = librosa.stft(np.asfortranarray(signal.filtfilt(b,a,librosa.istft(data))))
2125
# 拷贝频谱
2226
shift = sft
23-
shift_point = round(shift/(sr/data.shape[0]))
27+
shift = sft-lpf
28+
shift_point = round(2*data.shape[0]*shift/sr)
2429
# 调制
2530
for i in range(data.shape[1]):
2631
update.emit(i/data.shape[1])
2732
data[:,i] = np.roll(data[:,i], shift_point, axis=0)
28-
# 高通滤波
29-
data = librosa.stft(np.asfortranarray(signal.filtfilt(b,a,librosa.istft(data))))
30-
data *= gain
33+
now_power = np.mean(np.abs(data[gain_src:gain_dst,:]))
34+
# 应用增益
35+
if auto_opti and no_hpf:
36+
data /= now_power / src_power
37+
else:
38+
data *= gain
3139

3240
return data
3341

@@ -63,6 +71,8 @@ def hpd_n_shift(data, lpf, sft, gain):
6371
# 谐波增强模式
6472
for chan in stft_list:
6573
processed = np.empty(chan.shape)
74+
75+
6676
if no_hpf:
6777
print('[CopyBand] Info: 开始频谱拷贝...')
6878
D_percussive = np.copy(chan)
@@ -82,15 +92,11 @@ def hpd_n_shift(data, lpf, sft, gain):
8292
adp = processed
8393
adp_power = np.mean(np.abs(adp))
8494
src_power = np.mean(np.abs(chan))
85-
src_f = 1-(adp_power/src_power)
86-
adp += src_f*chan
95+
adj_factor = src_power/(adp_power+src_power)
96+
sum_chan = np.empty(chan.shape)
97+
sum_chan = (adp*adj_factor)+(chan*adj_factor)
8798
chan *= 0
88-
chan += adp
89-
90-
# 自动 EQ 优化
91-
if auto_opti:
92-
print('[CopyBand] Info: 自动优化进行中...')
93-
auto_eq(stft_list, 2*percussive_hpfc/output_sr, 2*percussive_stf/output_sr)
99+
chan += sum_chan
94100

95101
# 合并输出
96102
print('[CopyBand] Info: ISTFT 进行中...')
@@ -120,41 +126,6 @@ def hpd_n_shift(data, lpf, sft, gain):
120126
percussive_gain,msgbox)
121127

122128

123-
def auto_eq(stft_list, lpf, stf):
124-
# 产生 STFT 谱
125-
combine_stft = np.sum(np.abs(np.asarray(stft_list)), axis=(0, 2))
126-
# 平滑化
127-
freq_analysis = np.log2(combine_stft)
128-
raw_freq = signal.savgol_filter(freq_analysis, 61, 3)
129-
130-
# 计算需要调整的量
131-
if stf < 0.2:
132-
print(f'[CopyBand] ERROR: 调制频率不满足要求 (0.2<=STF<=0.9),当前 STF={stf}')
133-
return
134-
# 第一步:调整下连接点增益
135-
s_pos, e_pos = round(raw_freq.shape[0]*(stf-0.2)), round(raw_freq.shape[0]*(stf-0.1))
136-
diff_tail = np.exp2(np.max(raw_freq[s_pos:e_pos])-np.min(raw_freq[s_pos:e_pos]))
137-
diff_range = np.exp2(raw_freq[s_pos:e_pos]-np.min(raw_freq[s_pos:e_pos]))
138-
factor = np.ones(combine_stft.shape)
139-
factor[e_pos:] /= diff_tail
140-
factor[s_pos:e_pos] /= diff_range + np.random.uniform(low=0.01, high=0.05, size=factor[s_pos:e_pos].shape)
141-
# 第二步,调整上连接点增益
142-
stf += stf - lpf
143-
if stf < 0.8:
144-
s_pos, e_pos = round(raw_freq.shape[0]*(stf)), round(raw_freq.shape[0]*(stf+0.1))
145-
diff_tail = np.exp2(np.max(raw_freq[s_pos:e_pos])-np.min(raw_freq[s_pos:e_pos]))
146-
factor[e_pos:] *= diff_tail * (1-0.05)
147-
# 第三步:平滑化连接点
148-
avg_pos = (combine_stft[s_pos]+combine_stft[e_pos])/2
149-
factor[s_pos:e_pos] = avg_pos / combine_stft[s_pos:e_pos]
150-
151-
# 应用 EQ
152-
for chan in stft_list:
153-
newchan = np.multiply(np.copy(chan), factor[:, np.newaxis])
154-
chan *= 0
155-
chan += newchan
156-
157-
158129
def envelope_detect(input_path):
159130
# 加载音频
160131
y, sr = librosa.load(input_path,mono=False,sr=None)

0 commit comments

Comments
 (0)