You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Chirp WASM代码在Chrome触发DOMException,Firefox正常,求排查原因

问题分析与解决方案

我之前在使用Chirp SDK时也碰到过类似的跨浏览器问题,结合你的场景和Chrome的安全特性,问题的根源大概率是以下两点:

1. Chrome严格的自动播放/音频上下文限制

Chrome从版本66开始就收紧了Web Audio API的使用规则:音频上下文必须由用户主动交互(比如点击、触摸事件)触发创建,不允许页面加载时自动初始化。而Firefox对这个限制的执行相对宽松,允许在页面加载阶段初始化音频上下文,这就导致你的代码在Firefox正常运行,Chrome里却直接抛出DOMException。

Chirp SDK在初始化(Chirp()函数)时会创建Web Audio上下文,这个操作在Chrome里如果没有用户交互触发,就会被浏览器拦截,直接进入catch分支。

2. 非安全环境的限制

如果你的测试环境是file://本地文件协议,或者HTTP而非HTTPS,Chrome会进一步限制Web Audio API的使用,而Firefox在本地文件环境下的限制较少,这也可能是触发异常的原因。


解决办法

方法一:通过用户交互触发SDK初始化

把Chirp的初始化逻辑放到用户点击(或其他交互)的回调里,比如添加一个按钮让用户触发:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Chirp Demo</title>
<script src="https://public.chirp.io/wasm/3.1.0/chirpSdk.js"></script>
</head>
<body>
<button id="initChirp">点击启动Chirp</button>

<script type="text/javascript">
const { Chirp, toAscii } = ChirpSDK;

document.getElementById('initChirp').addEventListener('click', async () => {
  try {
    const sdk = await Chirp({
      key: 'MY_CHIRP_APP_KEY',
      onReceived: data => {
        if (data.length > 0) {
          console.log(toAscii(data))
        } else {
          console.error('Decode failed')
        }
      }
    });
    console.log("sdk initialized", sdk);
    
    let rc = sdk.start()
    if (rc !== 0) console.warn(sdk.errorToString(rc))
    
    rc = sdk.send('hello')
    if (rc !== 0) console.warn(sdk.errorToString(rc))
  } catch (err) {
    console.error('Chirp初始化失败:', err);
  }
});
</script>
</body>
</html>

方法二:确保在安全环境下测试

  • 本地开发时使用localhost(Chrome将localhost视为安全源),不要直接打开本地HTML文件(file://协议)。
  • 线上环境必须使用HTTPS协议,否则Chrome会限制音频相关API的使用。

方法三:检查浏览器音频权限

确保Chrome允许当前网站访问音频设备:点击地址栏左侧的锁图标,查看“声音”权限是否设置为“允许”。


内容的提问来源于stack exchange,提问作者M.T

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:01:04