Xiaobin-Rong / gtcrn

The official implementation of GTCRN, an ultra-lite speech enhancement model.
MIT License
219 stars 37 forks source link

请问,模型低信噪比场景听感难受问题 #10

Open gedebabin opened 7 months ago

gedebabin commented 7 months ago

晓彬,您好: 非常感谢您的开源精神,我正在使用您开源的训练框架 SEtrain。 我发现训练出来的小参数网络在低信噪比场景下会出现降噪不干净,人声听感难受的问题。在尝试更换网络结构、更换mask、单独使用mse或sisnr均无明显改善,并且减小参数时问题更加明显。 您开源的本模型在处理低信噪比音频时同样会出现降噪不干净,听感难受的问题。您能否提出建议帮助解决这一问题。 期待回复,感谢!

Xiaobin-Rong commented 7 months ago

你好! 感谢支持。低信噪比环境本身对降噪模型就是一个挑战,非常容易出现降噪不干净/过抑制的问题,对于小参数网络,问题会更显著,这是很难解决的挑战。目前对于提高小参数网络的性能和泛化性还在研究中,欢迎您持续的关注!

gedebabin commented 7 months ago

谢谢晓彬的答复! 另外在查看代码时我有个不解之处:

   out = self.mask(mask, inpt.permute(0,3,2,1)) # (B,2,T,F)
   out = out.permute(0,3,2,1)  # (B,F,T,2)
    此处为什么要permute两次?SEtrain中只permute一次就可以了,是这样catch内存会快一些吗?     
  m = de_x1.permute(0,3,2,1)
  s_real = x_ref[...,0] * m[...,0] - x_ref[...,1] * m[...,1]
  s_imag = x_ref[...,1] * m[...,0] + x_ref[...,0] * m[...,1]
  s = torch.stack([s_real, s_imag], dim=-1)  # (B,F,T,2)

另外我发现decoder输出冗余了一个维度,可以考虑decoder最后一个维度输入设置为2。

Xiaobin-Rong commented 7 months ago

@gedebabin

你好!第一个问题permute两次是因为Mask类中定义了输入的mask和spec维度是(B,2,T,F)

class Mask(nn.Module):
    """Complex Ratio Mask"""
    def __init__(self):
        super().__init__()

    def forward(self, mask, spec):
        s_real = spec[:,0] * mask[:,0] - spec[:,1] * mask[:,1]
        s_imag = spec[:,1] * mask[:,0] + spec[:,0] * mask[:,1]
        s = torch.stack([s_real, s_imag], dim=1)  # (B,2,T,F)
        return s

这纯粹是一个个人习惯问题,我习惯模型的input和output都是 (B,F,T,2)维度。应该不太会影响内存读取速度。

另一个问题,”decoder输出冗余了一个维度,考虑decoder最后一个维度输入设置为2“ 是什么意思?我现在decoder输出的维度就是2吧。

gedebabin commented 7 months ago

是的,您是正确的,非常感谢!

vivi-max commented 1 day ago

@gedebabin 您好,可以回复我一下吗!我有问题关于该项目的想向您请教