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

Node.js中AWS Polly音频转Twilio μ-law格式的问题排查

问题解答

1. 是否需要剥离头部?需要

Twilio双向流接收的是原始的mu-law音频数据(无文件头),不需要带WAV格式的头部信息。如果你直接生成完整WAV文件,标准WAV头长度是44字节,需要剥离;但用WaveFile库处理时,wav.data.samples已经是纯音频样本数据,无需额外剥离——前提是你对音频的初始化参数正确,否则会导致数据错误。

2. 如何让呼叫者听到清晰语音?

你的代码核心问题是初始化WaveFile时的位深参数错误,导致后续转换完全偏离,产生杂音。以下是修正步骤和代码:

错误点分析

Polly返回的是带符号16位单声道小端PCM,但你调用wav.fromScratch(1, 8000, '8', audioData)时,错误指定了位深为8,相当于把16位数据当成8位处理,直接破坏了音频结构,后续转换自然全是杂音。

修正后的代码

try {
  // 注意:Polly的params里要确保设置正确:SampleRate: '8000', OutputFormat: 'pcm'
  const data = await this.polly.synthesizeSpeech(params).promise();
  const audioData = Buffer.from(data.AudioStream as Uint8Array);
  
  const wav = new WaveFile();
  // 正确初始化:单声道、8kHz采样率、16位带符号PCM
  wav.fromScratch(1, 8000, '16', audioData);
  // 转换为mu-law格式
  wav.toMuLaw();
  // 直接取纯mu-law样本数据,转base64
  const payload = Buffer.from(wav.data.samples).toString('base64');
  return payload;
} catch (err) {
  console.error('音频转换错误:', err);
  throw err;
}

关键注意事项

  • Polly参数配置:必须在synthesizeSpeech的params里指定SampleRate: '8000'和OutputFormat: 'pcm',确保输出和Twilio流要求的采样率匹配(Twilio流默认是8kHz)。
  • 无需额外位深转换:toMuLaw()方法会自动将16位PCM转换为8位的mu-law格式,不需要再调用toBitDepth('8'),多余操作会导致数据异常。
  • 发送纯样本数据:Twilio流只需要原始的mu-law字节,不能带任何文件头,所以直接用wav.data.samples即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 06:30:04