暂无个人介绍
2023年06月
2023年04月
2023年03月
2023年02月
2023年01月
2022年11月
你好,目前FRCRN模型开放的接口只能针对文件操作,不能处理音频流。而且该模型是一个学术研究型模型,算力需求比常规实用模型更高。
你好,目前该模型训练pipeline没有开源计划,训练数据在模型页面有简要介绍供参考。
模型本身的延时比较小,应该就是帧移的20ms
通常应该能收敛到-19左右
你好,目前modelscope里只有部分模型支持导出为onnx,降噪模型还不支持导出。
你好,这个库有windows, linux_x86和macOS的x86&arm版本,您问的是linux的arm版本吗,目前还没有支持计划。开源方面,目前主要是在modelscope上开源模型相关代码,其他部分暂无开源计划。
你好,模型官方提供的模型是使用相同流程训练出来的,就是训练了200 epoch。因为每个用户的数据是自己生成的,具体训练效果可能有少许出入,但应该差别不大。可以先检查下DNS-Challenge数据集是否下载完整,因为数据存储在境外,经常有下载中断的情况。即使数据下载不完整,生成噪音数据时也不会报错,所以容易被忽略。如果数据下载完整,再看是否训练满了200 epoch,有没有中途停止。
您这种情况不正常,目前训练流程默认使用单卡,通常V100单卡跑一个epoch约40分钟。您训练的时候可以观察一下cpu和gpu的占用情况。
您好,最新版的ModelScope中已经支持唤醒模型的训练,不过直接使用ModelScope训练模型比较繁琐,我们封装了ModelScope的唤醒模型训练能力,再增加数据处理,效果评测,流程控制等辅助功能,连同一些相关工具打包成唤醒模型训练套件,已经在Github上开源,欢迎有兴趣的开发者试用。 为了达到更好的唤醒效果,训练套件默认会做两轮训练和评测。第一轮训出的模型根据评测结果选出最优的模型作为基础,第二轮再继续finetune。 以上说明已经更新在模型文档中,关于训练套件的更多详细信息请参考套件说明文档:https://github.com/alibaba-damo-academy/kws-training-suite
您好,建议先检查一下您创建的数据集的相关文件名称和位置是否正确。 首先按照您代码中的目录位置,应该存在/disk3/DNS2022/train.lst文件。 文件中每一行有3项,分别是带噪语音,纯净语音,语音时长。前两项都是本地音频文件的绝对路径,您需要确保每个路径指向的音频文件都存在。如果是按照数据集说明中的步骤生成的音频文件,会保存在./training_set目录下。其中的纯净语音,噪音和混合噪音的语音会分别存放在 clean, noise, noisy三个目录下。
为了保证推理时的因果,可以在时间维度上使用累加池化,也就是沿时间帧逐步进行池化操作,这和在Conv-TasNet论文里提出的 cumulative layer normalization (cLN)类似;或者像实现Transformer的注意力阵列一样加入时间掩蔽。
您好,我们针对DNS2020测试集复核了ModelScope官方模型的效果,全部指标得分都符合或微高于官网上公开的分数。以下是我们的测试代码,供您比较是否有差异:
from pypesq import pesq as pesq_nb
from pesq import pesq as pesq_wb
from pystoi import stoi
import soundfile as sf
import librosa
import numpy as np
import sys
audio_root='/data/DNS-Challenge/datasets/test_set/synthetic/no_reverb'
data_to_score='/data/speech_frcrn_ans_cirm_16k/dns_out'
def cal_sisnr(ref_sig, out_sig, eps=1e-8):
"""Calcuate Scale-Invariant Source-to-Noise Ratio (SI-SNR)
Args:
ref_sig: numpy.ndarray, [T]
out_sig: numpy.ndarray, [T]
Returns:
SISNR
"""
assert len(ref_sig) == len(out_sig)
ref_sig = ref_sig - np.mean(ref_sig)
out_sig = out_sig - np.mean(out_sig)
ref_energy = np.sum(ref_sig ** 2) + eps
proj = np.sum(ref_sig * out_sig) * ref_sig / ref_energy
noise = out_sig - proj
ratio = np.sum(proj ** 2) / (np.sum(noise ** 2) + eps)
sisnr = 10 * np.log(ratio + eps) / np.log(10.0)
return sisnr
wav_list = audio_root + '/wav.lst'
f = open(wav_list, 'r')
scores_pesq_wb = []
scores_pesq_nb = []
scores_stoi = []
scores_sisnr = []
USE_16K = True
while 1:
audio_name = f.readline().strip()
if not audio_name: break
target_path = audio_root+"/target/"+audio_name
noisy_path = data_to_score + '/' + audio_name
clean, fs = sf.read(target_path)
clean = librosa.resample(clean, fs, 16000)
noisy, fs = sf.read(noisy_path)
noisy = librosa.resample(noisy, fs, 16000)
min_frames = min(clean.shape[0],noisy.shape[0])
clean = clean[:min_frames]
noisy = noisy[:min_frames]
assert len(clean) == len(noisy), print('Wave lengths are mismatchted! target: {}, noisy: {}'.format(len(clean), len(noisy)))
if fs > 16000:
clean_16k = librosa.resample(clean, fs, 16000)
noisy_16k = librosa.resample(noisy, fs, 16000)
min_frames = min(clean_16k.shape[0],noisy_16k.shape[0])
clean_16k = clean_16k[:min_frames]
noisy_16k = noisy_16k[:min_frames]
fs_16k = 16000
elif fs == 16000:
clean_16k = clean
noisy_16k = noisy
fs_16k = fs
else:
print('Sampling rate is less than 16000 !')
break
## PESQ is scored only at 16000 Hz or 8000 Hz
pesq_score_wb = pesq_wb(fs_16k, clean_16k, noisy_16k, 'wb')
pesq_score_nb = pesq_nb(clean_16k, noisy_16k, fs_16k)
##calcualte SI-SNR and STOI at 16000 Hz sampliing rate
if USE_16K:
sisnr_score=cal_sisnr(clean_16k, noisy_16k)
stoi_score = stoi(clean, noisy, fs, extended=False) * 100
else:
sisnr_score=cal_sisnr(clean, noisy)
stoi_score = stoi(clean, noisy, fs, extended=False) * 100
scores_sisnr.append(sisnr_score)
scores_pesq_wb.append(pesq_score_wb)
scores_pesq_nb.append(pesq_score_nb)
scores_stoi.append(stoi_score)
print('File: {}, WB_PESQ: {}, PESQ: {}, STOI: {}, SI-SNR: {}'.format(audio_name, np.around(pesq_score_wb, decimals=2), np.around(pesq_score_nb, decimals=2), np.around(stoi_score, decimals=2), np.around(sisnr_score, decimals=2)))
scores_pesq_wb = np.asarray(scores_pesq_wb)
scores_pesq_nb = np.asarray(scores_pesq_nb)
scores_stoi = np.asarray(scores_stoi)
scores_sisnr = np.asarray(scores_sisnr)
pesq_wb_mean = np.around(np.mean(scores_pesq_wb), decimals=2)
pesq_nb_mean = np.around(np.mean(scores_pesq_nb), decimals=2)
stoi_mean = np.around(np.mean(scores_stoi), decimals=2)
si_snr_mean = np.around(np.mean(scores_sisnr), decimals=2)
print('Average score, WB_PESQ: {}, PESQ: {}, STOI: {}, SI-SNR: {}'.format(pesq_wb_mean, pesq_nb_mean, stoi_mean, si_snr_mean))
f.close()
您好,FRCRN语音降噪这一版模型的运算量是比较大的,特别是在CPU上处理耗时相对比较长,在模型不变的情况下没有什么很好的优化方案。建议使用GPU来提升速度,通常能够比CPU提升几倍到几十倍,不过GPU第一次使用需要初始化CUDA所以会比第二次调用耗时长一些。
您好,为了方便页面展示和用户体验效果,目前回声消除pipeline提供的是完整文件的输入方式。 不过模型本身是可以支持音频流式输入的,您可以参考 LinearAECAndFbank 和 LinearAECPipeline 里的代码实现对流式音频的支持。 另外,即使是流式处理方式,链路上仍然会有一些延迟,可能需要具体测试一下才能确定是否能满足您的实时性需求。