Audio-WestlakeU / NBSS

The official repo of NBC & SpatialNet for multichannel speech separation, denoising, and dereverberation
MIT License
203 stars 24 forks source link

如何生成训练数据? #25

Open haha010508 opened 5 months ago

haha010508 commented 5 months ago

请问一下,我目前只有LDC93S6A这个数据集,在运行 sms_wsj 的make时总是出错,所以只生成了wsj_8k_zeromean(里面是wav文件)和wsj_8k_zermean.json(这文件里的性别,转录文本都是空的,我的kaldi跑不通)这两个文件,我的最终目标是把这个模型应用到2mic的阵列上,进行降噪。我要如何才能跑通这个例子呀?是不是只需要有干净数据就行了?有没有一步一步的操作步骤呀?

quancs commented 5 months ago

生成SMS-WSJ的步骤请参考这个仓库 https://github.com/fgnt/sms_wsj

haha010508 commented 5 months ago

请问一下,那个数据集生成训练数据相对方便一点呀?

quancs commented 5 months ago

其实 SMS-WSJ 算是比较方便的了

haha010508 commented 5 months ago

请问一下,WHAMR! 这个数据是不是按照生成方式生产完了就可以直接训练了?是不是要生成立体声数据?

quancs commented 5 months ago

是的,这个数据集使用的就是原WHAMR!数据集,没有做额外的操作

haha010508 commented 5 months ago

请问我训练时的误差突然变成这个了,学习率出问题了吗? si_sdr 从11突然变到了32, 这是我的训练代码:

python SharedTrainer.py fit \ --config=configs/SpatialNet.yaml \ --config=configs/datasets/sms_wsj_plus.yaml \ --model.channels=[0,1,2,3,4,5] \ --model.arch.dim_input=12 \ --model.arch.dim_output=4 \ --model.arch.num_freqs=129 \ --trainer.precision=bf16-mixed \ --model.compile=true \ --data.batch_size=[2,4] \ --trainer.devices=0, \ --trainer.max_epochs=100

Epoch 62 metrics: val/neg_si_sdr=-11.5534 val/metric=11.5534 val/sdr=14.1095 val/nb_pesq=2.8877
Epoch 63 metrics: val/neg_si_sdr=-11.5530 val/metric=11.5530 val/sdr=14.0554 val/nb_pesq=2.8877
Epoch 64 metrics: val/neg_si_sdr=-11.5635 val/metric=11.5635 val/sdr=14.1285 val/nb_pesq=2.9130
Epoch 65 metrics: val/neg_si_sdr=-11.5392 val/metric=11.5392 val/sdr=14.1616 val/nb_pesq=2.9130
Epoch 66 metrics: val/neg_si_sdr=-11.6123 val/metric=11.6123 val/sdr=14.1467 val/nb_pesq=2.9130
Epoch 67 metrics: val/neg_si_sdr=-11.5472 val/metric=11.5472 val/sdr=14.0926 val/nb_pesq=2.9130
Epoch 68 metrics: val/neg_si_sdr=-11.5318 val/metric=11.5318 val/sdr=14.1027 val/nb_pesq=2.9130
Epoch 69 metrics: val/neg_si_sdr=-11.6058 val/metric=11.6058 val/sdr=14.1100 val/nb_pesq=2.9208
Epoch 70 metrics: val/neg_si_sdr=-11.6708 val/metric=11.6708 val/sdr=14.1268 val/nb_pesq=2.9208
Epoch 71 metrics: val/neg_si_sdr=-11.6770 val/metric=11.6770 val/sdr=14.1461 val/nb_pesq=2.9208
Epoch 72 metrics: val/neg_si_sdr=-11.7158 val/metric=11.7158 val/sdr=14.2619 val/nb_pesq=2.9208
Epoch 73 metrics: val/neg_si_sdr=32.6677 val/metric=-32.6677 val/sdr=-11.5814 val/nb_pesq=2.9208
Epoch 74 metrics: val/neg_si_sdr=33.5684 val/metric=-33.5684 val/sdr=-11.7089 val/nb_pesq=1.3021
Epoch 75 metrics: val/neg_si_sdr=33.5379 val/metric=-33.5379 val/sdr=-11.7073 val/nb_pesq=1.3021
Epoch 76 metrics: val/neg_si_sdr=33.4594 val/metric=-33.4594 val/sdr=-11.7612 val/nb_pesq=1.3021
Epoch 77 metrics: val/neg_si_sdr=33.5735 val/metric=-33.5735 val/sdr=-11.7613 val/nb_pesq=1.3021
Epoch 78 metrics: val/neg_si_sdr=33.6384 val/metric=-33.6384 val/sdr=-11.6898 val/nb_pesq=1.3021
Epoch 79 metrics: val/neg_si_sdr=32.3899 val/metric=-32.3899 val/sdr=-11.1878 val/nb_pesq=1.3845
Epoch 80 metrics: val/neg_si_sdr=33.2831 val/metric=-33.2831 val/sdr=-11.5233 val/nb_pesq=1.3845
Epoch 81 metrics: val/neg_si_sdr=33.7293 val/metric=-33.7293 val/sdr=-11.7670 val/nb_pesq=1.3845
Epoch 82 metrics: val/neg_si_sdr=32.7420 val/metric=-32.7420 val/sdr=-11.4137 val/nb_pesq=1.3845
Epoch 83 metrics: val/neg_si_sdr=32.3384 val/metric=-32.3384 val/sdr=-11.1690 val/nb_pesq=1.3845
Epoch 84 metrics: val/neg_si_sdr=23.6844 val/metric=-23.6844 val/sdr=-8.5213 val/nb_pesq=1.3123
Epoch 85 metrics: val/neg_si_sdr=26.0809 val/metric=-26.0809 val/sdr=-9.8542 val/nb_pesq=1.3123

quancs commented 5 months ago

大概是训练梯度出了问题,可能是半精度训练导致的,你试试从出问题前的一个epoch使用32精度继续训练

haha010508 commented 5 months ago

请问训练在线模型这样写训练代码是对的吗?

python SharedTrainer.py fit \ --config=configs/onlineSpatialNet.yaml \ --config=configs/datasets/sms_wsj_plus.yaml \ --model.channels=[0,1,2,3,4,5] \ --model.arch.dim_input=12 \ --model.arch.dim_output=4 \ --model.arch.num_freqs=129 \ --trainer.precision=bf16-mixed \ --model.compile=true \ --data.batch_size=[2,4] \ --trainer.devices=0, \ --trainer.max_epochs=100

但是我这里报了一个错误: error: Parser key "model.stft": Problem with given class_path 'models.io.stft.STFT': Validation failed: Key "n_fft" is required but not included in config object or its value is None.

我查看onlineSpatialNet.yaml 这个文件注释掉了,是为啥呀? stft: class_path: models.io.stft.STFT init_args: {} # by default set to {} to avoid using wrong stft config

n_fft: 256

   #n_hop: 128
quancs commented 5 months ago

你把{}删掉,把stft的参数设置为合适的就行。注释掉的原因是想使用者自行设置stft参数,因为不同数据集的参数不一样,因此无法给一个通用的

haha010508 commented 5 months ago

多谢您的回复,现在训练起来了!

再请教一下: 如果要训练2 channel的直接把 onlineSpatialNet.yaml 文件里的 channels: [0, 1, 2, 3, 4, 5] ref_channel: 0 换成 channels: [0, 3] ref_channel: 0 可以吗?

quancs commented 5 months ago

可以的

haha010508 commented 4 months ago

请问一下:我的训练到这里就崩了,前面有这样一个错误,但是能训练,请问是怎么回事?

[2024-05-08 18:49:23,275] [5/31] torch._dynamo.variables.higher_order_ops: [ERROR] unimplemented(f"comparison {typestr(left)} {op} {typestr(right)}") [2024-05-08 18:49:23,275] [5/31] torch._dynamo.variables.higher_order_ops: [ERROR] File "/home/byd/anaconda3/envs/nbss2/lib/python3.10/site-packages/torch/_dynamo/exc.py", line 193, in unimplemented [2024-05-08 18:49:23,275] [5/31] torch._dynamo.variables.higher_order_ops: [ERROR] raise Unsupported(msg) [2024-05-08 18:49:23,275] [5/31] torch._dynamo.variables.higher_order_ops: [ERROR] torch._dynamo.exc.Unsupported: comparison PythonModuleVariable() ConstantVariable(NoneType) Epoch 0 metrics: val/neg_snr=-0.7955 val/metric=0.7955 val/sdr=-1.0523 val/neg_si_sdr=7.9343 val/nb_pesq=1.4077
... Epoch 19 metrics: val/neg_snr=-2.4728 val/metric=2.4728 val/sdr=1.7709 val/neg_si_sdr=2.4059 val/nb_pesq=1.6122
Epoch 20 metrics: val/neg_snr=-2.6547 val/metric=2.6547 val/sdr=2.4562 val/neg_si_sdr=1.7932 val/nb_pesq=1.6122
Epoch 21 metrics: val/neg_snr=283.0917 val/metric=-283.0917 val/sdr=-10.3441 val/neg_si_sdr=34.2788 val/nb_pesq=1.6122
我的训练代码是这样的: python SharedTrainer.py fit \ --config=configs/onlineSpatialNet.yaml \ --config=configs/datasets/sms_wsj_plus.yaml \ --model.channels=[0,3] \ --model.arch.dim_input=4 \ --model.arch.dim_output=4 \ --model.arch.num_freqs=129 \ --trainer.precision=32-true \ --model.compile=true \ --data.batch_size=[2,4] \ --trainer.devices=0, \ --trainer.max_epochs=100

Ezreal11 commented 4 months ago

请问一下,我目前只有LDC93S6A这个数据集,在运行 sms_wsj 的make时总是出错,所以只生成了wsj_8k_zeromean(里面是wav文件)和wsj_8k_zermean.json(这文件里的性别,转录文本都是空的,我的kaldi跑不通)这两个文件,我的最终目标是把这个模型应用到2mic的阵列上,进行降噪。我要如何才能跑通这个例子呀?是不是只需要有干净数据就行了?有没有一步一步的操作步骤呀?

请问您最后使用了哪个数据集呢?如何获取wsj0?在官网上注册了说要等管理员接受。

haha010508 commented 4 months ago

请问一下,我目前只有LDC93S6A这个数据集,在运行 sms_wsj 的make时总是出错,所以只生成了wsj_8k_zeromean(里面是wav文件)和wsj_8k_zermean.json(这文件里的性别,转录文本都是空的,我的kaldi跑不通)这两个文件,我的最终目标是把这个模型应用到2mic的阵列上,进行降噪。我要如何才能跑通这个例子呀?是不是只需要有干净数据就行了?有没有一步一步的操作步骤呀?

请问您最后使用了哪个数据集呢?如何获取wsj0?在官网上注册了说要等管理员接受。

wsj0,这个数据要下载,得是会员

Ezreal11 commented 4 months ago

请问一下,我目前只有LDC93S6A这个数据集,在运行 sms_wsj 的make时总是出错,所以只生成了wsj_8k_zeromean(里面是wav文件)和wsj_8k_zermean.json(这文件里的性别,转录文本都是空的,我的kaldi跑不通)这两个文件,我的最终目标是把这个模型应用到2mic的阵列上,进行降噪。我要如何才能跑通这个例子呀?是不是只需要有干净数据就行了?有没有一步一步的操作步骤呀?

请问您最后使用了哪个数据集呢?如何获取wsj0?在官网上注册了说要等管理员接受。

wsj0,这个数据要下载,得是会员

感谢,我等等回复

quancs commented 4 months ago

请问一下:我的训练到这里就崩了,前面有这样一个错误,但是能训练,请问是怎么回事?

[2024-05-08 18:49:23,275] [5/31] torch._dynamo.variables.higher_order_ops: [ERROR] unimplemented(f"comparison {typestr(left)} {op} {typestr(right)}") [2024-05-08 18:49:23,275] [5/31] torch._dynamo.variables.higher_order_ops: [ERROR] File "/home/byd/anaconda3/envs/nbss2/lib/python3.10/site-packages/torch/_dynamo/exc.py", line 193, in unimplemented [2024-05-08 18:49:23,275] [5/31] torch._dynamo.variables.higher_order_ops: [ERROR] raise Unsupported(msg) [2024-05-08 18:49:23,275] [5/31] torch._dynamo.variables.higher_order_ops: [ERROR] torch._dynamo.exc.Unsupported: comparison PythonModuleVariable() ConstantVariable(NoneType) Epoch 0 metrics: val/neg_snr=-0.7955 val/metric=0.7955 val/sdr=-1.0523 val/neg_si_sdr=7.9343 val/nb_pesq=1.4077 ... Epoch 19 metrics: val/neg_snr=-2.4728 val/metric=2.4728 val/sdr=1.7709 val/neg_si_sdr=2.4059 val/nb_pesq=1.6122 Epoch 20 metrics: val/neg_snr=-2.6547 val/metric=2.6547 val/sdr=2.4562 val/neg_si_sdr=1.7932 val/nb_pesq=1.6122 Epoch 21 metrics: val/neg_snr=283.0917 val/metric=-283.0917 val/sdr=-10.3441 val/neg_si_sdr=34.2788 val/nb_pesq=1.6122 我的训练代码是这样的: python SharedTrainer.py fit --config=configs/onlineSpatialNet.yaml --config=configs/datasets/sms_wsj_plus.yaml --model.channels=[0,3] --model.arch.dim_input=4 --model.arch.dim_output=4 --model.arch.num_freqs=129 --trainer.precision=32-true --model.compile=true --data.batch_size=[2,4] --trainer.devices=0, --trainer.max_epochs=100

抱歉,我没有遇到过这个错误,所以我的经验也不多

Ezreal11 commented 4 months ago

请问一下,我目前只有LDC93S6A这个数据集,在运行 sms_wsj 的make时总是出错,所以只生成了wsj_8k_zeromean(里面是wav文件)和wsj_8k_zermean.json(这文件里的性别,转录文本都是空的,我的kaldi跑不通)这两个文件,我的最终目标是把这个模型应用到2mic的阵列上,进行降噪。我要如何才能跑通这个例子呀?是不是只需要有干净数据就行了?有没有一步一步的操作步骤呀?

请问您最后使用了哪个数据集呢?如何获取wsj0?在官网上注册了说要等管理员接受。

wsj0,这个数据要下载,得是会员

请问只有wsj0的话您是如何处理的?直接make的话会报错

haha010508 commented 4 months ago

请问一下:我训练了一个2通道实时的模型,训练代码如下:

python SharedTrainer.py fit \ --config=configs/onlineSpatialNet.yaml \ --config=configs/datasets/sms_wsj_plus.yaml \ --model.channels=[0,3] \ --model.arch.dim_input=4 \ --model.arch.dim_output=4 \ --model.arch.num_freqs=129 \ --trainer.precision=32-true \ --model.compile=false \ --data.batch_size=[2,4] \ --trainer.devices=0, \ --trainer.max_epochs=100

但是获得的训练结果如下:

Epoch 93 metrics: val/neg_snr=-6.6020 val/metric=6.6020 val/sdr=7.8546 val/neg_si_sdr=-5.0815 val/nb_pesq=2.1652
Epoch 94 metrics: val/neg_snr=-6.6473 val/metric=6.6473 val/sdr=7.7673 val/neg_si_sdr=-5.1107 val/nb_pesq=2.1775
Epoch 95 metrics: val/neg_snr=-6.6564 val/metric=6.6564 val/sdr=7.8172 val/neg_si_sdr=-5.1415 val/nb_pesq=2.1775
Epoch 96 metrics: val/neg_snr=-6.6518 val/metric=6.6518 val/sdr=7.7476 val/neg_si_sdr=-5.0943 val/nb_pesq=2.1775
Epoch 97 metrics: val/neg_snr=-6.6727 val/metric=6.6727 val/sdr=7.8652 val/neg_si_sdr=-5.1982 val/nb_pesq=2.1775
Epoch 98 metrics: val/neg_snr=-6.6566 val/metric=6.6566 val/sdr=7.8480 val/neg_si_sdr=-5.1465 val/nb_pesq=2.1775
Epoch 99 metrics: val/neg_snr=-6.6429 val/metric=6.6429 val/sdr=7.8766 val/neg_si_sdr=-5.1091 val/nb_pesq=2.1734

这个SDR远远低于您论文里披露的24+,这是学习率的问题吗?我应该怎样调整呢?谢谢

quancs commented 4 months ago

... --config=configs/datasets/sms_wsj_plus.yaml ... --model.channels=[0,3] ... 这个SDR远远低于您论文里披露的24+,这是学习率的问题吗?我应该怎样调整呢?谢谢

您好,您这个训练是基于2通道的SMS-WSJ-Plus数据集的?该数据集比SMS-WSJ更难,结果更差是正常的。SMS-WSJ-Plus六通道的结果对应于文章中Table I。

haha010508 commented 2 months ago

请问一下,我只关注降噪,不关注分离,就是我只希望输出单通道数据,应该怎样改这个架构呢?谢谢

Ezreal11 commented 2 months ago

请问一下,我只关注降噪,不关注分离,就是我只希望输出单通道数据,应该怎样改这个架构呢?谢谢

我当时把--model.arch.dim_output改成2跑的,相当于输出一个语音

haha010508 commented 1 month ago

请问一下,我只关注降噪,不关注分离,就是我只希望输出单通道数据,应该怎样改这个架构呢?谢谢

我当时把--model.arch.dim_output改成2跑的,相当于输出一个语音

多谢,那个dataset也要改吧?你用的是configs/datasets/sms_wsj_plus.yaml 这个配置文件吗?

Ezreal11 commented 1 month ago

请问一下,我只关注降噪,不关注分离,就是我只希望输出单通道数据,应该怎样改这个架构呢?谢谢

我当时把--model.arch.dim_output改成2跑的,相当于输出一个语音

多谢,那个dataset也要改吧?你用的是configs/datasets/sms_wsj_plus.yaml 这个配置文件吗?

我用pyroomacoustics模拟的多通道,只包含一个说话人的语音,但是training_loss变NAN了,后面我就没管了😢