Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

请问有C#的实现吗 #3

Open
dfengpo opened this issue Dec 27, 2024 · 10 comments
Open

请问有C#的实现吗 #3

dfengpo opened this issue Dec 27, 2024 · 10 comments

Comments

@dfengpo
Copy link

dfengpo commented Dec 27, 2024

iic/speech_zipenhancer_ans_multiloss_16k_base这个模型的降噪效果还不错
请问有C#的实现吗,或者有没有实现思路?
我自己用C#onnxruntime调用model.onnx(https://www.modelscope.cn/models/iic/speech_zipenhancer_ans_multiloss_16k_base/file/view/master?fileName=README.md&status=1)这里下载下来的模型,提示需要分配超大内存,请问你python是怎么解决的
[E:onnxruntime:, sequential_executor.cc:514 ExecuteKernel] Non-zero status code returned while running MatMul node. Name:'/model/TSConformer/0/0/self_attn_weights_1/MatMul' Status Message: /onnxruntime_src/onnxruntime/core/framework/bfc_arena.cc:376 void* onnxruntime::BFCArena::AllocateRawInternal(size_t, bool, onnxruntime::Stream*, bool, onnxruntime::WaitNotificationFn) Failed to allocate memory for requested buffer of size 515293323776,

@DakeQQ
Copy link
Owner

DakeQQ commented Dec 27, 2024

我们使用静态输入形状,例如一个5120的int16数组,它对应320毫秒的音频样本。这个过程涉及将原始音频切片成320毫秒的段,并将其传递到芯片。使用并行计算是可选的。

音频切片部分代码

if audio_len > INPUT_AUDIO_LENGTH:
    if (shape_value_in != shape_value_out) & isinstance(shape_value_in, int) & isinstance(shape_value_out, int):
        stride_step = shape_value_out
    num_windows = int(np.ceil((audio_len - INPUT_AUDIO_LENGTH) / stride_step)) + 1
    total_length_needed = (num_windows - 1) * stride_step + INPUT_AUDIO_LENGTH
    pad_amount = total_length_needed - audio_len
    final_slice = audio[:, :, -pad_amount:]
    white_noise = (np.sqrt(np.mean(final_slice * final_slice)) * np.random.normal(loc=0.0, scale=1.0, size=(1, 1, pad_amount))).astype(audio.dtype)
    audio = np.concatenate((audio, white_noise), axis=-1)
elif audio_len < INPUT_AUDIO_LENGTH:
    white_noise = (np.sqrt(np.mean(audio * audio)) * np.random.normal(loc=0.0, scale=1.0, size=(1, 1, INPUT_AUDIO_LENGTH - audio_len))).astype(audio.dtype)
    audio = np.concatenate((audio, white_noise), axis=-1)

aligned_len = audio.shape[-1]

说明

  • 如果音频长度超过静态输入形状,代码会对音频进行整数倍填充,然后再切片。
  • 如果音频长度小于静态输入形状,则用白噪声填充音频。
  • 这就是我们仓库中的演示工作方式。

注意

我们对C#不太熟悉,因此对于从Python到C#的代码转换,您可以考虑使用GPT或其他代码转换工具。

@dfengpo
Copy link
Author

dfengpo commented Dec 30, 2024

好的,感谢,我现在遇到的问题是在傅里叶转行和onnxruntime input参数的构建上

@DakeQQ
Copy link
Owner

DakeQQ commented Dec 30, 2024

欢迎使用我们的仓库来导出ONNX模型,其中模型包括 STFT 和 ISTFT。只需传入 int16 PCM 音频样本,即可获得 int16 降噪后的音频样本作为输出。

@dfengpo
Copy link
Author

dfengpo commented Dec 30, 2024

感谢,我试试,我之前好像看到过你把导出的onnx模型放在google网盘上了可以直接下载,下载后可以直接使用是吧

@DakeQQ
Copy link
Owner

DakeQQ commented Dec 30, 2024

是的,这是一个用于演示的模型,输入是固定形状,可以使用 Inference_ZipEnhancer_ONNX.py 运行演示。

@dfengpo
Copy link
Author

dfengpo commented Dec 30, 2024

演示的模型跟这里的https://www.modelscope.cn/models/iic/speech_zipenhancer_ans_multiloss_16k_base/files
是一样的效果能吗?我可以下载你的演示模型直接用吗?还是需要我我根据你的导出脚本重新导一个?

@DakeQQ
Copy link
Owner

DakeQQ commented Dec 30, 2024

演示模型以每chunk 320 毫秒的方式处理音频,然后将每块拼接起来重建去噪后的音频。虽然这会稍微影响音质,但输出几乎与原始模型相同。你可以先尝试一下,然后再决定是否导出你自己的模型。增大chunk size可以更加接近原始模型音质,但会增加处理时间。

@dfengpo
Copy link
Author

dfengpo commented Dec 30, 2024

好的,感谢你的及时回复

@dfengpo
Copy link
Author

dfengpo commented Dec 31, 2024

这是原始的噪音文件https://oss-audio-recording.oss-cn-shenzhen.aliyuncs.com/audio/20240516174526.wav
这是我用ZipEnhancer.ort模型处理后的文件
https://oss-audio-recording.oss-cn-shenzhen.aliyuncs.com/audio/20240516174526_ZipEnhancer.wav
不确定是我的处理有问题还是哪里转换有问题,但是效果好差。
另外输入和输出能改成float类型吗,我担心int16数据转换有精度丢失
我是这里下载的模型https://drive.google.com/drive/folders/1L13BJRqdBrPX8jQj3wwCiI67xC5QIT3S?usp=drive_link

@DakeQQ
Copy link
Owner

DakeQQ commented Dec 31, 2024

实际上,代码的第一行是用于进行 float32 转换。我们已将您的文件传递给官方的演示程序,您可以比较两者的结果。毫无疑问,官方版本的性能确实优于我们的实现。不过,正如我们之前提到的,差异并不是特别显著。如果您对差异感到难以接受,建议尝试使用更大的块大小,例如 16000,这样结果会更加接近原始版本。

def forward(self, audio):
        audio = audio.float()

这是基于最新导出代码并将块大小设置为 16,000 的测试结果。
Test_Results.zip

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants