diff --git a/README.md b/README.md
index a2fd817..cc1a29f 100644
--- a/README.md
+++ b/README.md
@@ -9,10 +9,13 @@ Emiya Engine 是一个用来丰富音频频谱的脚本。可以将频谱变得
### 当前版本:
-`RC Version 4`
+`RC Version 5`
-### 编年史:
+
+ 更新历史
+ - `RC 5`
+ > 调整自动优化特性的实现
- `RC 4`
> 尝试在 CopyBand 模式中加入自动优化特性
- `RC 3`
@@ -51,30 +54,13 @@ Emiya Engine 是一个用来丰富音频频谱的脚本。可以将频谱变得
> 大部分的代码是为了处理超大数组拼接速度缓慢的问题
> 处理后的音频有大量爆音及咔哒声,低电平音频容易看出处理痕迹
-### RC 版本使用说明:
+
-为了方便使用,特地做了个 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 自动优化(版本 >= RC4):
自动优化特性目的是去除 Audition 中进行繁琐的 FFT 滤波器后处理步骤。
@@ -82,12 +68,17 @@ CopyBand 自动优化(版本 >= RC4):
简单操作流程:
1. 勾选 `合并 HPF` `仅估计截止频率`;
-2. 点击 `执行`,将建议的截止频率、调制频率填写至 `冲击 HPF` 所在行,并设置增益倍率为 `1.0`;
+2. 点击 `执行`,将建议的截止频率、调制频率填写至 `冲击 HPF` 所在行;
+![Step1](https://imgur.com/IBtmnSk.png)
3. 取消勾选 `仅估计截止频率`,勾选 `动态范围保护` `自动优化`;
+![Step2](https://imgur.com/5qOIKsN.png)
4. 点击 `执行` 得到自动处理后的结果。
----
+
+
+ 辅助手动操作
+
CopyBand 辅助调整(版本 >= RC 1):
CopyBand 模式需要设置六个参数,上手困难,
@@ -102,8 +93,31 @@ CopyBand 模式需要设置六个参数,上手困难,
同样的,当提示 `建议维持冲击增益` 时,即调节完成。
若需要更好的频谱「品相」,可以参考下步骤手动调整。
+
+
+
+ 完全手动操作
+
+为了方便使用,特地做了个 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 完全手动调整步骤:
配置之前观察频谱。
@@ -153,11 +167,12 @@ CopyBand 完全手动调整步骤:
![final-2](https://i.imgur.com/9AbW9j2.jpg)
这是谐波增益不够的原因,可以继续调整改善。最终得到以下结果:
![final-3](https://i.imgur.com/2UO9OnW.jpg)
+
+
-### 其他提示:
-
-由于 CopyBand 本质是复制粘贴已有的部分,
-因此对于超过 48kHz 以上的拉升,需要多次处理达成,
+
+ 其他提示
+
例如以下原始文件不到 16kHz:
![ex-0](https://i.imgur.com/eAui0i7.jpg)
拉升到 48kHz 采样需要的频率片段至少为 24-16=8kHz,
@@ -169,6 +184,9 @@ CopyBand 完全手动调整步骤:
例如上边的例子被拉升到 192kHz 采样率,宛如天籁之声:
![ex-1](https://i.imgur.com/QWKpaHA.jpg)
+
+
+
### 特别提醒
~~请不要使用这个脚本制造 `'HiRes'` 逗玄学家玩~~
diff --git a/core/copyband.py b/core/copyband.py
index 7e8636d..3b0a88c 100644
--- a/core/copyband.py
+++ b/core/copyband.py
@@ -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
@@ -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)
@@ -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 进行中...')
@@ -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)
diff --git a/res/window.ui b/res/window.ui
index ef1b14f..0845fcf 100644
--- a/res/window.ui
+++ b/res/window.ui
@@ -34,672 +34,572 @@
Qt::LeftToRight
-
-
-
- 20
- 10
- 671
- 61
-
-
-
-
- Microsoft YaHei UI
-
-
-
- 输入文件
-
-
-
-
- 20
- 20
- 571
- 31
-
-
-
- false
-
-
-
-
-
- 610
- 20
- 51
- 31
-
-
-
- ···
-
-
-
-
-
-
- 20
- 80
- 671
- 61
-
-
-
-
- Microsoft YaHei UI
-
-
-
- 输出位置
-
-
-
-
- 20
- 20
- 571
- 31
-
-
-
- false
-
-
-
-
-
- 610
- 20
- 51
- 31
-
-
-
- ···
-
-
-
-
-
-
- 20
- 150
- 131
- 81
-
-
-
-
- Microsoft YaHei UI
-
-
-
- 处理模式
-
-
-
-
- 20
- 20
- 111
- 21
-
-
-
- CopyBand
-
-
- true
-
-
-
-
-
- 20
- 50
- 101
- 21
-
-
-
- AkkoMode
-
-
-
-
-
-
- 20
- 240
- 131
- 121
-
-
-
-
- Microsoft YaHei UI
-
-
-
- 采样率设置
-
-
-
-
- 20
- 20
- 71
- 21
-
-
-
- 输出采样率:
-
-
-
-
-
- 20
- 40
- 91
- 22
-
-
-
- 1
-
- -
-
- 44100Hz
-
-
- -
-
- 48000Hz
-
-
- -
-
- 96000Hz
-
-
- -
-
- 192000Hz
-
-
-
-
-
-
- 20
- 70
- 71
- 21
-
-
-
- 内插值倍率:
-
-
-
-
-
- 20
- 90
- 51
- 22
-
-
-
- 0
-
- -
-
- 1x
-
-
- -
-
- 2x
-
-
- -
-
- 3x
-
-
- -
-
- 4x
-
-
-
-
-
-
-
- 160
- 290
- 381
- 71
-
-
-
-
- Microsoft YaHei UI
-
-
-
- 输出控制
-
-
-
-
- 10
- 20
- 101
- 16
-
-
-
- 样本输出模式
-
-
-
-
-
- 200
- 40
- 141
- 16
-
-
-
- 优化建议 (CopyBand)
-
-
-
-
-
- 10
- 40
- 181
- 16
-
-
-
- 仅估计截止频率 (CopyBand)
-
-
-
-
-
- 210
- 20
- 151
- 16
-
-
-
- 自动优化 (CopyBand)
-
-
-
-
-
- 110
- 20
- 101
- 16
-
-
-
- 动态范围保护
-
-
-
-
-
-
- 560
- 300
- 121
- 61
-
-
-
-
- Microsoft YaHei UI
- 14
- 75
- true
-
-
-
- 执行
-
-
-
-
-
- 20
- 370
- 671
- 31
-
-
-
- 0
-
-
-
-
-
- 160
- 150
- 521
- 131
-
-
-
- 0
-
-
-
- CopyBand
-
-
-
-
- 440
- 40
- 62
- 22
-
-
-
- 3
-
-
- 100.000000000000000
-
-
- 0.010000000000000
-
-
- 2.500000000000000
-
-
-
-
-
- 440
- 10
- 62
- 22
-
-
-
- 3
-
-
- 100.000000000000000
-
-
- 0.010000000000000
-
-
- 1.200000000000000
-
-
-
-
-
- 380
- 10
- 61
- 21
-
-
-
- 增益倍率:
-
-
-
-
-
- 20
- 10
- 131
- 21
-
-
-
- 谐波HPF截止频率(Hz):
-
-
-
-
-
- 20
- 40
- 131
- 21
-
-
-
- 冲击HPF截止频率(Hz):
-
-
-
-
-
- 220
- 40
- 81
- 21
-
-
-
- 调制频率(Hz):
-
+
+ -
+
+
+
+ Microsoft YaHei UI
+
+
+
+ 输入文件
+
+
+
-
+
+
+
+ 0
+ 32
+
+
+
+ false
+
+
+
+ -
+
+
+
+ 0
+ 32
+
+
+
+ ···
+
+
+
+
-
-
-
- 150
- 40
- 61
- 22
-
-
-
- 1
-
-
- 9999999
-
-
- 6000
-
+
+ -
+
+
+
+ Microsoft YaHei UI
+
+
+
+ 输出位置
+
+
+
-
+
+
+
+ 0
+ 32
+
+
+
+ false
+
+
+
+ -
+
+
+
+ 0
+ 32
+
+
+
+ ···
+
+
+
+
-
-
-
- 310
- 10
- 61
- 22
-
-
-
- 1
-
-
- 9999999
-
-
- 16000
-
+
+ -
+
+
+
+ 0
+ 80
+
+
+
+
+ Microsoft YaHei UI
+
+
+
+ 处理模式
+
+
+
-
+
+
+ <html><head/><body><p>通过拷贝已有频谱进行延拓</p></body></html>
+
+
+ CopyBand
+
+
+ true
+
+
+
+ -
+
+
+ <html><head/><body><p>通过加入抖动进行频谱延拓</p></body></html>
+
+
+ AkkoMode
+
+
+
+
-
-
-
- 220
- 10
- 81
- 21
-
-
-
- 调制频率(Hz):
-
+
+ -
+
+
+
+ 0
+ 85
+
+
+
+
+ 16777215
+ 16777215
+
+
+
+
+ Microsoft YaHei UI
+
+
+
+ 采样率设置
+
+
+
-
+
+
+ <html><head/><body><p>最终输出音频文件的采样率</p></body></html>
+
+
+ 输出采样率:
+
+
+
+ -
+
+
+ 1
+
+
-
+
+ 44100Hz
+
+
+ -
+
+ 48000Hz
+
+
+ -
+
+ 96000Hz
+
+
+ -
+
+ 192000Hz
+
+
+
+
+ -
+
+
+ <html><head/><body><p>内部处理时采用的采样率倍率,1x 时即等于输出采样率。</p><p>数值越大,STFT 分段时间长度越小,时间域精度更高,频率域精度越低,人工痕迹越密集。</p></body></html>
+
+
+ 内插值倍率:
+
+
+
+ -
+
+
+ 0
+
+
-
+
+ 1x
+
+
+ -
+
+ 2x
+
+
+ -
+
+ 3x
+
+
+ -
+
+ 4x
+
+
+
+
+
-
-
-
- 310
- 40
- 61
- 22
-
-
-
- 1
-
-
- 9999999
-
-
- 16000
-
+
+ -
+
+
+
+ 380
+ 0
+
+
+
+
+ Microsoft YaHei UI
+
+
+
+ 输出控制
+
+
+
-
+
+
+ <html><head/><body><p>选取五秒片段进行处理,方便测试不同参数</p></body></html>
+
+
+ 样本输出模式
+
+
+
+ -
+
+
+ <html><head/><body><p>控制增益防止因拷贝导致削峰</p></body></html>
+
+
+ 动态范围保护
+
+
+
+ -
+
+
+ <html><head/><body><p>启用自动优化后程序将会尝试计算增益倍率,因此手动设置的「增益倍率」将会被忽略。</p><p>自动优化特性仅支持 CopyBand 模式,且需要勾选「合并 HPF」。</p></body></html>
+
+
+ 自动优化 (CopyBand)
+
+
+
+ -
+
+
+ <html><head/><body><p>启用时仅输出冲击HPF的「截止频率」及「调制频率」</p></body></html>
+
+
+ 仅估计截止频率 (CopyBand)
+
+
+
+ -
+
+
+ <html><head/><body><p>用于辅助增益倍率设置。</p><p>启用后会输出估计的参数。</p></body></html>
+
+
+ 优化建议 (CopyBand)
+
+
+
+
-
-
-
- 150
- 10
- 61
- 22
-
-
-
- 1
-
-
- 9999999
-
-
- 6000
-
-
-
-
-
- 380
- 40
- 61
- 21
-
-
-
- 增益倍率:
-
-
-
-
-
- 20
- 70
- 291
- 16
-
+
+ -
+
+
+
+ 100
+ 80
+
+
+
+
+ 16777215
+ 16777215
+
+
+
+
+ Microsoft YaHei UI
+ 14
+ 75
+ true
+
- 合并HPF (仅采用冲击 HPF 参数, 不进行 HPSS 分解)
-
-
-
-
-
- AkkoMode
-
-
-
-
- 20
- 40
- 81
- 21
-
-
-
- 抖动上限倍率:
-
-
-
-
-
- 110
- 10
- 62
- 22
-
-
-
- 3
-
-
- 0.990000000000000
-
-
- 0.001000000000000
-
-
- 0.020000000000000
+ 执行
-
-
-
- 110
- 40
- 62
- 22
-
-
-
- 3
-
-
- 0.990000000000000
-
-
- 0.001000000000000
+
+ -
+
+
+
+ 0
+ 32
+
- 0.080000000000000
+ 0
-
-
-
- 20
- 10
- 81
- 21
-
-
-
- 抖动下限倍率:
-
+
+ -
+
+
+
+ 513
+ 0
+
+
+
+ 0
+
+
+
+ CopyBand
+
+
+
-
+
+
+ 谐波HPF截止频率(Hz):
+
+
+
+ -
+
+
+ 1
+
+
+ 9999999
+
+
+ 6000
+
+
+
+ -
+
+
+ 调制频率(Hz):
+
+
+
+ -
+
+
+ 1
+
+
+ 9999999
+
+
+ 16000
+
+
+
+ -
+
+
+ 增益倍率:
+
+
+
+ -
+
+
+ 3
+
+
+ 100.000000000000000
+
+
+ 0.010000000000000
+
+
+ 1.200000000000000
+
+
+
+ -
+
+
+ 冲击HPF截止频率(Hz):
+
+
+
+ -
+
+
+ 1
+
+
+ 9999999
+
+
+ 6000
+
+
+
+ -
+
+
+ 调制频率(Hz):
+
+
+
+ -
+
+
+ 1
+
+
+ 9999999
+
+
+ 16000
+
+
+
+ -
+
+
+ 增益倍率:
+
+
+
+ -
+
+
+ 3
+
+
+ 100.000000000000000
+
+
+ 0.010000000000000
+
+
+ 2.500000000000000
+
+
+
+ -
+
+
+ <html><head/><body><p>启用后不进行 HPSS 分解,直接对频谱操作,截止频率、调制频率及增益倍率采用冲击 HPF 的,谐波 HPF 参数忽略不使用。</p></body></html>
+
+
+ 合并HPF (仅采用冲击 HPF 参数, 不进行 HPSS 分解)
+
+
+
+
+
+
+
+ AkkoMode
+
+
+
+
+ 220
+ 10
+ 81
+ 21
+
+
+
+ 抖动上限倍率:
+
+
+
+
+
+ 110
+ 10
+ 91
+ 22
+
+
+
+ 5
+
+
+ 0.990000000000000
+
+
+ 0.001000000000000
+
+
+ 0.020000000000000
+
+
+
+
+
+ 310
+ 10
+ 91
+ 22
+
+
+
+ 5
+
+
+ 0.990000000000000
+
+
+ 0.001000000000000
+
+
+ 0.080000000000000
+
+
+
+
+
+ 20
+ 10
+ 81
+ 21
+
+
+
+ 抖动下限倍率:
+
+
+
-
-
+
+