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

Telnyx音频流传输至AssemblyAI无有效转录结果问题排查

排查Telnyx音频流转AssemblyAI无转录结果问题

根据你提供的代码和日志,核心问题是AssemblyAI返回空转录结果,结合双方音频格式一致的前提,从以下几个方向排查:

1. 音频块顺序错误

你的代码注释提到要按event.media.chunk排序,但实际只是直接push到数组,没有处理网络延迟导致的chunk乱序问题。Telnyx的media事件中parsedMessage.media.chunk是递增序号,乱序拼接会导致音频数据混乱,AssemblyAI无法识别。

修改代码,按chunk序号排序后再拼接:

if (parsedMessage.event === 'media') {
  // 保存chunk序号和对应的payload
  chunks.push({
    index: parsedMessage.media.chunk,
    payload: parsedMessage.media.payload
  });

  if (chunks.length >= 5 && assembly.readyState === WebSocket.OPEN) {
    // 按chunk序号升序排序
    chunks.sort((a, b) => a.index - b.index);
    // 提取payload并解码
    const audioBuffers = chunks.map(item => decodeBase64ToBuffer(item.payload));
    assembly.send(Buffer.concat(audioBuffers));

    chunks = [];
  }
}

2. 验证解码后的音频数据是否有效

把解码后的PCM数据保存成可播放的WAV文件,确认音频是否正常:

const fs = require('fs');

// 在decodeBase64ToBuffer后添加保存逻辑(测试用)
function decodeBase64ToBuffer(base64String) {
  const buff = Buffer.from(base64String, 'base64');
  // 生成WAV头并保存文件
  const wavHeader = createWavHeader(8000, 1, 16, buff.length);
  const wavBuffer = Buffer.concat([wavHeader, buff]);
  fs.writeFileSync('test_audio.wav', wavBuffer);
  return buff;
}

// 生成WAV头的工具函数
function createWavHeader(sampleRate, channels, bitDepth, dataLength) {
  const header = Buffer.alloc(44);
  header.write('RIFF', 0);
  header.writeUInt32LE(36 + dataLength, 4);
  header.write('WAVE', 8);
  header.write('fmt ', 12);
  header.writeUInt32LE(16, 16); // PCM格式
  header.writeUInt16LE(1, 20); // 线性PCM
  header.writeUInt16LE(channels, 22);
  header.writeUInt32LE(sampleRate, 24);
  header.writeUInt32LE(sampleRate * channels * bitDepth / 8, 28);
  header.writeUInt16LE(channels * bitDepth / 8, 32);
  header.writeUInt16LE(bitDepth, 34);
  header.write('data', 36);
  header.writeUInt32LE(dataLength, 40);
  return header;
}

播放生成的test_audio.wav,如果没有声音或杂音,说明解码后的音频本身存在问题。

3. 确认AssemblyAI WebSocket初始化参数

连接AssemblyAI的WebSocket时,必须发送初始化消息指定采样率为8000,否则默认是16000,会导致音频采样率不匹配:

// 建立AssemblyAI连接后发送初始化消息
assembly.onopen = () => {
  assembly.send(JSON.stringify({
    sample_rate: 8000,
    enable_partial_transcripts: true
  }));
};

4. 检查PCM字节序

Telnyx的PCM16可能是大端字节序,而AssemblyAI默认使用小端。可以尝试转换字节序后再发送:

function decodeBase64ToBuffer(base64String) {
  const buff = Buffer.from(base64String, 'base64');
  // 转换为小端字节序
  buff.swap16();
  return buff;
}

5. 调整音频发送的批量大小

当前攒5个chunk再发送,可能单次发送的音频量不足,或攒的时间太长。试试每次收到media事件就直接发送,或调整为攒2个chunk发送,看是否有转录结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 17:37:17