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

