我正在使用 websockets 在 Dart/Flutter 中构建一个 Transcribe Streaming 应用程序。当我流式传输测试音频(从单声道、16kHz、16 位签名的小端 WAV 文件中提取)时,我得到...
BadRequestException:无法解码您提供的音频流。检查音频流是否有效,然后重试您的请求。
作为测试,我正在使用文件来流式传输音频。我每秒发送 32k 数据字节(大致模拟实时麦克风流)。如果我流式传输所有 0x00 或所有 0xFF 或随机字节,我什至会收到错误消息。如果我将块大小划分为 16k 并将间隔时间划分为 0.5 秒,那么它会在出错之前再多走一帧......
至于数据,我只是在 EventStream 帧的数据部分按字面意思将字节打包在文件中。显然,事件流包装是正确的(字节布局、CRC),否则我会收到一个错误指示,不是吗?
什么会向 AWSTrans 表明它不可解码?关于如何进行此操作的任何其他想法?
谢谢你的帮助...
这是打包的代码。完整版在这里(如果你敢……现在有点乱) https://pastebin.com/PKTj5xM2
Uint8List createEventStreamFrame(Uint8List audioChunk) {
final headers = [
EventStreamHeader(":content-type", 7, "application/octet-stream"),
EventStreamHeader(":event-type", 7, "AudioEvent"),
EventStreamHeader(":message-type", 7, "event")
];
final headersData = encodeEventStreamHeaders(headers);
final int totalLength = 16 + audioChunk.lengthInBytes + headersData.lengthInBytes;
// final prelude = [headersData.length, totalLength];
// print("Prelude: " + prelude.toString());
// Convert a 32b int to 4 bytes
List<int> int32ToBytes(int i) { return [(0xFF000000 & i) >> 24, (0x00FF0000 & i) >> 16, (0x0000FF00 & i) >> 8, (0x000000FF & i)]; }
final audioBytes = ByteData.sublistView(audioChunk);
var offset = 0;
var audioDataList = <int>[];
while (offset < audioBytes.lengthInBytes) {
audioDataList.add(audioBytes.getInt16(offset, Endian.little));
offset += 2;
}
final crc = CRC.crc32();
final messageBldr = BytesBuilder();
messageBldr.add(int32ToBytes(totalLength));
messageBldr.add(int32ToBytes(headersData.length));
// Now we can calc the CRC. We need to do it on the bytes, not the Ints
final preludeCrc = crc.calculate(messageBldr.toBytes());
// Continue adding data
messageBldr.add(int32ToBytes(preludeCrc));
messageBldr.add(headersData.toList());
// messageBldr.add(audioChunk.toList());
messageBldr.add(audioDataList);
final messageCrc = crc.calculate(messageBldr.toBytes().toList());
messageBldr.add(int32ToBytes(messageCrc));
final frame = messageBldr.toBytes();
//print("${frame.length} == $totalLength");
return frame;
}