在浏览器里跑 FRCRN:WebAssembly 轻量化部署实录
在线会议里最烦的不是回声,而是背景噪声一直顶在语音后面。装一个完整客户端当然能解决问题,但对很多临时场景来说,这一步太重了。更顺手的做法,是把降噪放到浏览器里做,打开网页就能用。
这次用的是阿里巴巴达摩院开源的 FRCRN 语音降噪模型,目标很直接:通过 WebAssembly 把推理搬到浏览器端,尽量不改用户习惯,也不把音频上传到云端。
为什么选 FRCRN 和 WebAssembly
FRCRN(Frequency-Recurrent Convolutional Recurrent Network)走的是频域路线,卷积层负责局部特征,循环结构处理时间依赖,适合单通道降噪。它对持续噪声、突发噪声和人声干扰都能处理,保真度也还算稳,不是那种一刀切把声音磨平的模型。
WebAssembly 的价值也很实际:浏览器里能跑,性能比纯 JavaScript 好得多,而且有沙箱隔离。对这类音频推理来说,它的优势不是'炫',而是省掉安装和分发这两件麻烦事。用户只要授权麦克风,就能直接进页面。
环境准备和模型转换
先把运行环境准备好。浏览器、Node.js、Python 这些是基本盘。
npm install -g onnxruntime-web esbuild
mkdir frcrn-wasm-demo
cd frcrn-wasm-demo
原始模型是 PyTorch 格式,浏览器端一般还是得落到 ONNX,再交给 ONNX Runtime Web 去跑。
import torch
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks
ans_pipeline = pipeline(
task=Tasks.acoustic_noise_suppression,
model='damo/speech_frcrn_ans_cirm_16k'
)
print("模型下载完成!")
转换时要注意输入张量形状和动态轴,不然后面一接实时音频就容易卡住。
import torch
import onnx
from modelscope.models import Model
model_dir = '~/.cache/modelscope/hub/damo/speech_frcrn_ans_cirm_16k'
model = Model.from_pretrained(model_dir)
model.eval()
dummy_input = torch.randn(1, 257, 100, 2)
torch.onnx.export(
model, dummy_input, "frcrn_model.onnx",
input_names=["input"], output_names=["output"],
dynamic_axes={'input': {2: 'time'}, : {: }},
opset_version=
)
()

