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
相关产品推荐
相关产品推荐

