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

Node.js WebSocket接收Twilio mulaw音频输出杂音问题求助

Node.js WebSocket接收Twilio音频播放杂音问题

我正在搭建一个Node.js WebSocket服务器,用于接收Twilio发送的base64编码格式的audio/x-mulaw音频数据,解码后通过Speaker的write()方法播放。但运行代码时,扬声器输出的是断续杂音,虽能对应说话时段,但完全无法识别语音。

我的代码

import { WebSocketServer } from 'ws';
import Speaker from 'speaker';
import alawmulaw from 'alawmulaw';

// Create a new Speaker instance with the specified format
const speaker = new Speaker();

const wss = new WebSocketServer({ port: 5000 });

wss.on('connection', function connection(ws) {
  ws.on('message', function message(data) {
    let obj = JSON.parse(data);

    if (obj.event === "media") {
        let buff = Buffer.from(obj.media.payload, 'base64');

        let PCM = Buffer.from(alawmulaw.mulaw.decode(buff));

        speaker.write(PCM);
    }
  });
});

排查思路

  • 匹配Speaker的音频格式参数
    Twilio的audio/x-mulaw流默认参数是8kHz采样率、单声道,解码后是16位PCM。你的Speaker实例未指定格式,会使用系统默认参数(通常是44.1kHz),导致采样率不匹配出现杂音。必须显式配置:
const speaker = new Speaker({
  channels: 1,
  bitDepth: 16,
  sampleRate: 8000
});
  • 确保解码后Buffer的字节序正确
    alawmulaw.mulaw.decode()返回的是Int16Array,直接用Buffer.from(alawmulaw.mulaw.decode(buff))可能会导致字节序错误,应该基于ArrayBuffer创建Buffer:
const pcmInt16 = alawmulaw.mulaw.decode(buff);
const PCM = Buffer.from(pcmInt16.buffer);
  • 避免单次写入过小的数据
    WebSocket单次传递的音频数据量很小,直接写入Speaker会导致断续。可以维护一个缓冲区,累积到一定大小后再写入:
let audioBuffer = [];

// 在media事件处理内:
audioBuffer.push(Buffer.from(pcmInt16.buffer));
if (audioBuffer.reduce((total, buf) => total + buf.length, 0) >= 1024) {
  const combinedBuffer = Buffer.concat(audioBuffer);
  speaker.write(combinedBuffer);
  audioBuffer = [];
}
  • 验证解码数据的正确性
    把解码后的PCM数据写入WAV文件,用Audacity等工具查看是否正常。如果WAV文件正常,问题出在Speaker配置;如果WAV也是杂音,说明解码步骤有问题:
import fs from 'fs';
const wavStream = fs.createWriteStream('test.wav');
// 先写入标准WAV文件头(适配8kHz、16位、单声道),再写入PCM数据
  • 更换解码库排查
    尝试替换alawmulaw为其他成熟库(比如mulaw),排除当前库的解码问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 04:06:07