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

Node.js中基于Twilio call-gpt添加环境音的技术求助

解决Call-GPT添加可交互背景音的方案

核心思路

要实现用户能听到且AI能处理的背景音,需在Twilio媒体流的音频处理链路中,将背景音与用户/AI的音频混合后双向传输——既要传给用户(让用户听到),也要传给AI的语音识别服务(让AI感知到)。

方案1:基于WebSocket实时混合音频

Call-GPT依赖Twilio Media Streams将通话音频转为WebSocket流,对接OpenAI语音接口。可在WebSocket的音频数据处理环节插入背景音混合逻辑:

  1. 预处理背景音频:将办公室环境音转成Twilio流标准格式(16kHz、16位单声道PCM),用ffmpeg执行转换:

    ffmpeg -i office_noise.wav -ar 16000 -ac 1 -f s16le office_noise.pcm
    
  2. 在WebSocket服务中实现实时混合:

    • 预读取转换好的PCM背景音文件,循环播放
    • 收到Twilio传来的用户音频帧后,将背景音帧与用户音频帧按比例叠加(避免音量溢出)
    • 混合后的音频帧同时传给OpenAI(供AI处理)和回传给Twilio(让用户听到)

    示例代码片段(Node.js环境):

    const fs = require('fs');
    const backgroundBuffer = fs.readFileSync('office_noise.pcm');
    let backgroundPos = 0;
    
    ws.on('message', (data) => {
      const msg = JSON.parse(data);
      if (msg.event === 'media') {
        const userAudio = Buffer.from(msg.media.payload, 'base64');
        // 截取对应长度的背景音片段
        const backgroundSlice = backgroundBuffer.slice(backgroundPos, backgroundPos + userAudio.length);
        backgroundPos = (backgroundPos + userAudio.length) % backgroundBuffer.length;
        
        // 混合音频(按比例降低背景音音量,防止过载)
        const mixedAudio = Buffer.alloc(userAudio.length);
        for (let i = 0; i < userAudio.length; i += 2) {
          const userSample = userAudio.readInt16LE(i);
          const bgSample = backgroundSlice.readInt16LE(i % backgroundSlice.length);
          const mixedSample = Math.min(32767, Math.max(-32768, userSample + bgSample * 0.3));
          mixedAudio.writeInt16LE(mixedSample, i);
        }
    
        // 传给OpenAI处理(复用原Call-GPT逻辑)
        sendToOpenAI(mixedAudio);
        // 回传给Twilio,让用户听到混合音频
        ws.send(JSON.stringify({
          event: 'media',
          media: { payload: mixedAudio.toString('base64') }
        }));
      }
    });
    

方案2:通过中间混合服务转发音频流

若不想修改Call-GPT核心代码,可搭建中间音频混合服务,通过Twilio的<Stream>将通话音频导向该服务,混合背景音后再转发给Call-GPT的WebSocket端点:

  • 配置Twilio TwiML,指定音频流向混合服务:
    <Response>
      <Stream url="wss://your-mixer-service.com/mix" />
    </Response>
    
  • 在混合服务中完成背景音与用户音频的实时混合,再将处理后的流转发给Call-GPT的WebSocket地址。

常见问题排查

  • 音量溢出导致杂音:混合时限制采样值在[-32768, 32767]区间,可将背景音比例控制在0.2-0.4之间。
  • 格式不匹配:确保背景音是16kHz、单声道、16位LE的PCM格式,与Twilio Media Streams的格式一致。
  • ffmpeg离线混合无效:Call-GPT需要实时双向交互,离线混合的静态音频无法实现AI感知背景音的需求,必须在WebSocket链路中实时处理。

内容的提问来源于stack exchange,提问作者kapilkarda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 19:30:00