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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 22:07:49