From 3d9d7326731e2cec863a13a9dbaaebddc3b0c318 Mon Sep 17 00:00:00 2001 From: Sg4Dylan Date: Thu, 2 Jul 2020 10:47:49 +0800 Subject: [PATCH] update to grid layout & new optimizer --- README.md | 78 +-- core/copyband.py | 65 +-- res/window.ui | 1204 +++++++++++++++++++++------------------------- 3 files changed, 618 insertions(+), 729 deletions(-) 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 + + + + 抖动下限倍率: + + + - - + +