语音增强任务添加混响
- 任务理解
- 例程
任务理解
1、降噪
clean + noise -> clean
clean + rir + noise -> clean + rir
2、解混响
将直达声音作为目标。混响由声波从多个路径反射形成,需要的是直达路径的,多次反射的不需要。rir模拟当前位置的声波和房间内不同路径传播到麦克风的线性系统的冲击响应。clean相当于离麦克风较近的位置录制,添加混响以后就相当于在某个较远位置且存在反射的位置录制,rir模拟不同的位置和录音环境,直接使用近处的是无法对上远处的。去混响不是得到原始干净语音,而是缩短混响时间。直接使用clean不能训练,因为存在延时,需要加一个对齐模块。
clean + rir + noise -> clean_direction
例程
添加混响例程,参考SDDNet1。
def add_reverb(cln_wav, rir_wav, return_direct = False):
"""
Args:
:@param cln_wav: the clean wav
:@param rir_wav: the rir wav
Return:
:@param wav_tgt: the reverberant signal
"""
rir_wav = np.array(rir_wav)
rir = rir_wav
wav_tgt = sps.oaconvolve(cln_wav, rir)
#### generate dereverb label for training data
if(return_direct is True):
rir_direct = np.zeros(rir_wav.shape)
rir_late = np.zeros(rir_wav.shape)
clean_len = len(cln_wav)
#cln_wav = cln_wav[:, np.newaxis]
predelay_ms = 100
dt = np.argmax(rir_wav)
dt = int(dt + (predelay_ms * 16000 / 1000))
rir_direct[:dt] = rir_wav[:dt]
rir_late[dt:] = rir_wav[dt:]
#print(rir_direct.shape)
#print(cln_wav.shape)
wav_tgt_direct = sps.oaconvolve(cln_wav, rir_direct, mode='full')[:clean_len]
wav_tgt_late = sps.oaconvolve(cln_wav, rir_late, mode='full')[:clean_len]
return wav_tgt, wav_tgt_direct, wav_tgt_late
else:
return wav_tgt
将最大峰值当作直达声,路径最短传播损耗最小。
https://github.com/IMYBo/SDDNet/blob/main/tools/time_dataset_dereverb.py#L106 ↩︎