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

向Twilio WebSocket发送8kHz μ-law音频出现杂音问题及解决

Twilio WebSocket TTS音频杂音问题及解决方法

问题背景

我正在使用文本转语音(TTS)系统,通过Twilio Connect功能将指定文本写入WebSocket。根据Twilio要求,音频需为8kHz的Base64编码μ-law格式。我的TTS系统生成24kHz浮点数组,将其降采样至8kHz后写入WAV文件,本地播放音质正常。

初始尝试代码

生成并降采样音频

# 从文本生成音频
audio_array = generate_audio(text_prompt)

# 从24000重采样到8000
from scipy.signal import resample
audio_resampled = resample(audio_array, len(audio_array) * PHONE_SAMPLE_RATE // SAMPLE_RATE)

with open('out.wav', 'wb') as f:
    write_wav(f, PHONE_SAMPLE_RATE, audio_resampled)
# 已验证out.wav在本地播放音质正常

μ-law编码与Base64转换

from librosa import mu_compress
mulaw_audio = mu_compress(audio_resampled).astype(np.uint8)
wav_base64 = base64.b64encode(mulaw_audio).decode()

遇到的问题

按要求将Base64字符串以JSON格式写入WebSocket后,电话端播放的是刺耳杂音,无有效内容。已确认Base64结果不受无符号/有符号整数影响,本地生成的音频音质正常,问题出在μ-law编码或Base64转换环节,且audio_array无头部信息。暂未找到Python向Twilio WebSocket写入音频的示例,急需调试帮助。

解决方案

改用标准库中的audioop库(虽标记为即将弃用),生成的音频可被Twilio正常识别:

# 从文本生成音频
audio_array = generate_audio(text_prompt, history_prompt="v2/en_speaker_6")

# 从24000重采样到8000
audio_resampled = resample(audio_array, len(audio_array) * PHONE_SAMPLE_RATE // SAMPLE_RATE)

# 量化为PCM格式
pcm_array = np.int16(audio_resampled * 32768).tobytes()

# 将16位PCM线性音频转换为8位μ-law
mulaw_array = audioop.lin2ulaw(pcm_array, 2)

# 转换为Base64编码
wav_base64 = base64.b64encode(mulaw_array).decode()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 08:37:44