FullSubNet-plus icon indicating copy to clipboard operation
FullSubNet-plus copied to clipboard

有关流式推理的探索。

Open Plutoisme opened this issue 2 years ago • 3 comments

学长您好,我基于您的基础上在流式推理上进行了探索,也读过ISSUE当中几个有关因为因果性实现不了实时的讨论,并做了一些实践,想请教下您。

然而我一开始尝试的是将一长度为60s的语音,基于以下命令: ffmpeg -i input.wav -ss 00:00:xx -t 00:00:01 output.wav 编写一个bash脚本,切割成60个.wav文件,通过inference增强后再使用ffmpeg进行拼接。

然而我发现了一个问题: 包含人声的片段的1s依旧会得到增强,然而在一些raw语音是静默的片段,却会产生啸叫。 以下三张为语谱图,从上到下依次为原声,直接增强,基于1s为片段的增强拼接合成: 截屏2022-11-09 下午4 51 05

可以在语谱图上发现也会出现一些冲激。

然而并不是只要是silence的片段,就会产生啸叫,为此我做了以下实验: wav = 0.0000001*np.random.randn(100000,) 生成一个能量极小的白噪声。 采样率为16k,我把其保存成.wav文件再做增强,同样地,也尝试过分割后增强,但是结论是并没有啸叫,只有白噪声本身被增强。

想请问下您基于算法原理,作为作者对这类问题的思考是怎样的?

Plutoisme avatar Nov 09 '22 08:11 Plutoisme

感谢你尝试了流式的inference!我之前一直没有尝试过,不知道会有这种情况发生。 我个人推测,会有这种情况的原因可能是:模型在训练的时候,是没有见过完全silence段的语音的,而你这种inference的方式有可能会输入一些完全silence的语音片段进去,模型可能就会乱来。 我觉得如果解决的办法上来说,从工程层面,是否可以增加一个VAD判断有无人声,没人声的情况下就直接不去增强了,有人声的情况下再进行增强。 从算法的角度上来说,是否可以在训练的时候增加一些完全是silence的语音,可能有助于缓解这点(参考《Universal Speaker Extraction in the Presence and Absence of Target Speakers for Speech of One and Two Talkers》)

RookieJunChen avatar Nov 09 '22 09:11 RookieJunChen

这几天细读了一下您的代码,为您的工程能力架构设计感到佩服。有几个问题想请问下您:

  1. inference.toml中look ahead的参数,这一点体现在fullsubnetplus的nn.Module模块中,forward的输出。关于这个参数有什么意义,您论文中写到“look ahead represents the length of future information”,我还是不太明白。。
  2. 论文中您对网络结构做了图解,其中经过unfold操作的只有经过MulCA模块的幅度谱,但源码中最后您是将所有经过MulCA模块的实部谱,虚部谱都unfold之后再拼接的:
        sb_input = torch.cat([noisy_mag_unfolded, fb_output_unfolded, fbr_output_unfolded, fbi_output_unfolded], dim=2)
        sb_input = self.norm(sb_input)

这样效果是会更好吗,还是开源版本跟论文版有出入。 4. 关于TCN模块,其中有个DD-Conv结构,您也给出了解释,按照我的理解应该是个深度可分离卷积,但代码好像使用conv1d就实现了,我的理解应该还是标准卷积:

self.depthwise_conv = nn.Conv1d(hidden_channel, hidden_channel, kernel_size=kernel_size, stride=1,
                                        groups=hidden_channel, padding=padding, dilation=dilation)

有些问题应该我自己去尝试的,但DNS数据集我下了三个星期还没有下下来。。希望能在您的工作上做一些深入,谢谢!

Plutoisme avatar Nov 14 '22 03:11 Plutoisme

不好意思,前段时间事情太多太繁忙了,忘了回复你提的这个issue了。

  1. look ahead这点我只是简单的follow了FullSubNet中原版的代码;
  2. 我在论文里提到的应该是,把三个经过MulCA模块的谱都unfold的,具体来说就是代码里面所做的;
  3. nn.Con1d里面可以通过控制groups这个参数,来实现depthwise conv,具体你可以看pytorch官网的文档。

RookieJunChen avatar Feb 02 '23 02:02 RookieJunChen