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

