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

SpeechSynthesisUtterance生成的音频能否接入audioMotion.js实现可视化?

SpeechSynthesisUtterance生成的音频能否接入audioMotion.js实现可视化?

嘿,这个需求完全可以实现!不过确实得绕个小弯——因为SpeechSynthesisUtterance默认直接把音频输出到扬声器,没有直接暴露能被audioMotion.js读取的实时数据流接口。下面给你几个不同的方案,你可以根据兼容性和需求选择:

方案一:Chrome专属的实验性API(精准捕获语音合成音频)

Chrome有个非标准的webkitSpeechSynthesisUtterance.audioNode属性,能直接拿到语音合成对应的AudioNode,我们可以把它连接到Web Audio的MediaStreamDestination,再把生成的流传给audioMotion.js做实时可视化。

代码示例:

// 初始化audioMotion可视化器
const audioMotion = new AudioMotionAnalyzer(
  document.getElementById('visualizer'),
  {
    source: null,
    mode: 'bar',
    showScale: true
  }
);

// 用按钮触发,避开浏览器自动播放限制
document.getElementById('start-btn').addEventListener('click', async () => {
  // 激活AudioContext(必须通过用户交互触发)
  const audioCtx = new AudioContext();
  // 创建MediaStreamDestination节点,用来捕获音频流
  const mediaStreamDest = audioCtx.createMediaStreamDestination();

  // 创建语音合成实例
  const utterance = new webkitSpeechSynthesisUtterance('这是Chrome专属的语音可视化测试');
  utterance.lang = 'zh-CN';

  // 等待系统加载语音列表
  await new Promise(resolve => speechSynthesis.onvoiceschanged = resolve);

  // 把语音合成的AudioNode连接到MediaStreamDestination
  utterance.audioNode.connect(mediaStreamDest);
  // 可选:如果需要听到声音,连接到AudioContext的输出
  utterance.audioNode.connect(audioCtx.destination);

  // 给audioMotion设置数据源
  audioMotion.setSource(mediaStreamDest.stream);

  // 开始语音合成
  speechSynthesis.speak(utterance);
});

这个方案的好处是只捕获语音合成的音频,实时性拉满,但缺点只有Chrome支持,属于非标准API,未来可能会有变动。

方案二:跨浏览器通用(捕获系统音频输出,需用户授权)

如果需要兼容更多浏览器(比如Firefox、Edge),可以用navigator.mediaDevices.getUserMedia请求捕获系统的音频输出。这样当语音合成播放时,可视化器就能捕获到声音,不过这个方案会同时捕获所有系统音频(比如其他网页、音乐APP的声音),而且需要用户授权。

代码示例:

const audioMotion = new AudioMotionAnalyzer(
  document.getElementById('visualizer'),
  { source: null }
);

document.getElementById('start-btn').addEventListener('click', async () => {
  try {
    // 请求捕获系统音频输出
    const stream = await navigator.mediaDevices.getUserMedia({
      audio: {
        echoCancellation: false,
        noiseSuppression: false,
        autoGainControl: false,
        mediaSource: 'audioOutput' // 指定捕获输出音频
      }
    });

    // 给audioMotion设置数据源
    audioMotion.setSource(stream);

    // 开始语音合成
    const utterance = new SpeechSynthesisUtterance('这是跨浏览器的语音可视化测试');
    utterance.lang = 'zh-CN';
    speechSynthesis.speak(utterance);
  } catch (err) {
    console.error('捕获系统音频失败:', err);
    alert('需要授权捕获系统音频才能使用此功能哦');
  }
});

这个方案兼容性好,但需要用户授权,且会捕获所有系统声音,适合对兼容性要求高的场景。

注意事项

不管用哪个方案,都要注意浏览器的自动播放政策:AudioContext必须通过用户交互(比如点击按钮)来激活,否则会报错。所以一定要把初始化逻辑放在点击事件这类用户交互回调里。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 11:30:31