Skip to content

Commit

Permalink
update to grid layout & new optimizer
Browse files Browse the repository at this point in the history
  • Loading branch information
Sg4Dylan committed Jul 2, 2020
1 parent 9796fbe commit 3d9d732
Show file tree
Hide file tree
Showing 3 changed files with 618 additions and 729 deletions.
78 changes: 48 additions & 30 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,13 @@ Emiya Engine 是一个用来丰富音频频谱的脚本。可以将频谱变得

### 当前版本:

`RC Version 4`
`RC Version 5`

### 编年史:
<details>
<summary>更新历史</summary>

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

为了方便使用,特地做了个 GUI 界面,
但实际上还是挺难用的,所以还是说一下。

工具: Spek(仅频谱观察用),Audition(频谱观察/频率分析/后期处理用)

---

首先需要分析音乐类型,对于以下类型不建议使用 AkkoMode:
- 电子合成纯音乐,背景乐器只有一两样的
- 人声清唱带一个伴奏乐器
- 其他频谱图中最高频率不到 18kHz 的音乐

例如这样的:
![sample-not-for-akkomode](https://i.imgur.com/Fd4EoGN.jpg?1)

AkkoMode 适用于大部分时候音量都很大的流行乐(比如 JPOP),
处理时应选用 Apple iTunes 购买的 AAC 格式音频,常见的频谱长这样:
![some-jpop](https://i.imgur.com/swdtDz6.jpg)
因为参数只有俩,多试几次就知道,此处就不展开说了。

---
### 使用说明:

<details>
<summary>半自动操作</summary>

CopyBand 自动优化(版本 >= RC4):

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

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

---
</details>

<details>
<summary>辅助手动操作</summary>

CopyBand 辅助调整(版本 >= RC 1):

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

</details>

<details>
<summary>完全手动操作</summary>

为了方便使用,特地做了个 GUI 界面,
但实际上还是挺难用的,所以还是说一下。

工具: Spek(仅频谱观察用),Audition(频谱观察/频率分析/后期处理用)

---

首先需要分析音乐类型,对于以下类型不建议使用 AkkoMode:
- 电子合成纯音乐,背景乐器只有一两样的
- 人声清唱带一个伴奏乐器
- 其他频谱图中最高频率不到 18kHz 的音乐

例如这样的:
![sample-not-for-akkomode](https://i.imgur.com/Fd4EoGN.jpg?1)

AkkoMode 适用于大部分时候音量都很大的流行乐(比如 JPOP),
处理时应选用 Apple iTunes 购买的 AAC 格式音频,常见的频谱长这样:
![some-jpop](https://i.imgur.com/swdtDz6.jpg)
因为参数只有俩,多试几次就知道,此处就不展开说了。

CopyBand 完全手动调整步骤:

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

</details>

### 其他提示:

由于 CopyBand 本质是复制粘贴已有的部分,
因此对于超过 48kHz 以上的拉升,需要多次处理达成,
<details>
<summary>其他提示</summary>

例如以下原始文件不到 16kHz:
![ex-0](https://i.imgur.com/eAui0i7.jpg)
拉升到 48kHz 采样需要的频率片段至少为 24-16=8kHz,
Expand All @@ -169,6 +184,9 @@ CopyBand 完全手动调整步骤:
例如上边的例子被拉升到 192kHz 采样率,宛如天籁之声:
![ex-1](https://i.imgur.com/QWKpaHA.jpg)

</details>


### 特别提醒
~~请不要使用这个脚本制造 `'HiRes'` 逗玄学家玩~~

65 changes: 18 additions & 47 deletions core/copyband.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,19 +15,27 @@ def core(

def hpd_n_shift(data, lpf, sft, gain):
sr = output_sr*inter_sr
# 计算增益
gain_src = round(2*data.shape[0]*sft/sr)
gain_dst = round(gain_src+0.025*data.shape[0])
src_power = np.mean(np.abs(data[gain_src:gain_dst,:]))
# 高通滤波
b,a = signal.butter(3,lpf/(sr/2),'high')
data = librosa.stft(np.asfortranarray(signal.filtfilt(b,a,librosa.istft(data))))
# 拷贝频谱
shift = sft
shift_point = round(shift/(sr/data.shape[0]))
shift = sft-lpf
shift_point = round(2*data.shape[0]*shift/sr)
# 调制
for i in range(data.shape[1]):
update.emit(i/data.shape[1])
data[:,i] = np.roll(data[:,i], shift_point, axis=0)
# 高通滤波
data = librosa.stft(np.asfortranarray(signal.filtfilt(b,a,librosa.istft(data))))
data *= gain
now_power = np.mean(np.abs(data[gain_src:gain_dst,:]))
# 应用增益
if auto_opti and no_hpf:
data /= now_power / src_power
else:
data *= gain

return data

Expand Down Expand Up @@ -63,6 +71,8 @@ def hpd_n_shift(data, lpf, sft, gain):
# 谐波增强模式
for chan in stft_list:
processed = np.empty(chan.shape)


if no_hpf:
print('[CopyBand] Info: 开始频谱拷贝...')
D_percussive = np.copy(chan)
Expand All @@ -82,15 +92,11 @@ def hpd_n_shift(data, lpf, sft, gain):
adp = processed
adp_power = np.mean(np.abs(adp))
src_power = np.mean(np.abs(chan))
src_f = 1-(adp_power/src_power)
adp += src_f*chan
adj_factor = src_power/(adp_power+src_power)
sum_chan = np.empty(chan.shape)
sum_chan = (adp*adj_factor)+(chan*adj_factor)
chan *= 0
chan += adp

# 自动 EQ 优化
if auto_opti:
print('[CopyBand] Info: 自动优化进行中...')
auto_eq(stft_list, 2*percussive_hpfc/output_sr, 2*percussive_stf/output_sr)
chan += sum_chan

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


def auto_eq(stft_list, lpf, stf):
# 产生 STFT 谱
combine_stft = np.sum(np.abs(np.asarray(stft_list)), axis=(0, 2))
# 平滑化
freq_analysis = np.log2(combine_stft)
raw_freq = signal.savgol_filter(freq_analysis, 61, 3)

# 计算需要调整的量
if stf < 0.2:
print(f'[CopyBand] ERROR: 调制频率不满足要求 (0.2<=STF<=0.9),当前 STF={stf}')
return
# 第一步:调整下连接点增益
s_pos, e_pos = round(raw_freq.shape[0]*(stf-0.2)), round(raw_freq.shape[0]*(stf-0.1))
diff_tail = np.exp2(np.max(raw_freq[s_pos:e_pos])-np.min(raw_freq[s_pos:e_pos]))
diff_range = np.exp2(raw_freq[s_pos:e_pos]-np.min(raw_freq[s_pos:e_pos]))
factor = np.ones(combine_stft.shape)
factor[e_pos:] /= diff_tail
factor[s_pos:e_pos] /= diff_range + np.random.uniform(low=0.01, high=0.05, size=factor[s_pos:e_pos].shape)
# 第二步,调整上连接点增益
stf += stf - lpf
if stf < 0.8:
s_pos, e_pos = round(raw_freq.shape[0]*(stf)), round(raw_freq.shape[0]*(stf+0.1))
diff_tail = np.exp2(np.max(raw_freq[s_pos:e_pos])-np.min(raw_freq[s_pos:e_pos]))
factor[e_pos:] *= diff_tail * (1-0.05)
# 第三步:平滑化连接点
avg_pos = (combine_stft[s_pos]+combine_stft[e_pos])/2
factor[s_pos:e_pos] = avg_pos / combine_stft[s_pos:e_pos]

# 应用 EQ
for chan in stft_list:
newchan = np.multiply(np.copy(chan), factor[:, np.newaxis])
chan *= 0
chan += newchan


def envelope_detect(input_path):
# 加载音频
y, sr = librosa.load(input_path,mono=False,sr=None)
Expand Down
Loading

0 comments on commit 3d9d732

Please sign in to comment.