基于Twilio与Deepgram实时电话转写遇SchemaError问题求助
解决Twilio媒体流对接Deepgram实时转写的SchemaError问题
问题原因
你遇到的SchemaError核心原因是:Deepgram WebSocket API要求接收二进制音频数据帧,但你当前是把音频转成Base64编码的文本字符串发送,导致Deepgram无法解析这种格式的消息。
修正后的代码
// 初始化Deepgram WebSocket连接 const deepgram = new WebSocket('wss://api.deepgram.com/v1/listen', { headers: { Authorization: `Token c5a8a4337xxxxxxxxxx38e56456a52557a5`, }, }); // 缓存音频块的数组 const chunks = []; // 处理Twilio媒体消息 if (msg.event === 'media') { if (deepgram.readyState === WebSocket.OPEN) { const twilioData = msg.media.payload; const wav = new WaveFile(); // 解析Twilio的μLaw格式音频 wav.fromScratch(1, 8000, '8m', Buffer.from(twilioData, 'base64')); // 转成Deepgram支持的16位PCM格式 wav.fromMuLaw(); // 直接提取PCM原始二进制数据,跳过WAV文件头(从第44字节开始) const pcmData = wav.data.samples.slice(44); chunks.push(pcmData); // 凑够至少100ms音频再发送(Twilio每块约20ms,5块即100ms) if (chunks.length >= 5) { const audioBuffer = Buffer.concat(chunks); // 发送二进制帧,而非Base64字符串 deepgram.send(audioBuffer); // 清空缓存,准备下一批数据 chunks.length = 0; } } }
关键调整点
- 直接发送二进制数据:删除将Buffer转成Base64字符串的步骤,直接把PCM二进制Buffer通过WebSocket发送,完全匹配Deepgram的接收要求。
- 简化音频处理流程:跳过
toDataURI中转步骤,直接从WaveFile对象提取PCM数据,减少不必要的编码转换。 - 优化缓存逻辑:明确凑够5块音频再发送,避免发送过小的音频块,同时发送后清空缓存,防止内存占用过高。
错误响应说明
之前收到的Could not deserialize last text message: expected value at line 1 column 1提示,本质是Deepgram尝试解析文本消息时,发现内容是Base64编码的音频,不符合它的消息格式规范——它只接受二进制音频帧,不接受文本类型的音频编码内容。
内容的提问来源于stack exchange,提问作者Osman Aziz
相关产品推荐
相关产品推荐

