gpt4 book ai didi

amazon-web-services - AWS 转录流 BadRequestException : "Could not decode the audio stream..."

转载 作者:行者123 更新时间:2023-12-04 17:17:56 27 4
gpt4 key购买 nike

我正在使用 websockets 在 Dart/Flutter 中构建一个 Transcribe Streaming 应用程序。当我流式传输测试音频(从单声道、16kHz、16 位签名小端 WAV 文件中提取)时,我得到...

BadRequestException: Could not decode the audio stream that you provided. Check that the audio stream is valid and try your request again.


作为测试,我使用一个文件来传输音频。我每秒发送 32k 数据字节(大致模拟实时麦克风流)。如果我流式传输所有 0x00 或所有 0xFF 或随机字节,我什至会收到错误消息。如果我将块大小划分为 16k,将间隔时间划分为 0.5 秒,那么它会在出错之前再增加一帧......
至于数据,我只是简单地将字节打包在 EventStream 帧的数据部分中,就像它们在文件中一样。显然 Event Stream 打包是正确的(字节布局、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;
}

最佳答案

BadRequestException,至少在我的情况下,是指帧编码不正确,而不是音频数据错误。
AWS 事件流编码详细信息为 here .
我在字节序和字节大小方面遇到了一些问题。您需要对消息编码和音频缓冲区非常了解。音频需要是 16 位/有符号 (int)/小端 ( See here )。消息包装器中的那些长度参数是 32 位(4 字节)大端。 ByteData是你在 Dart 的 friend 。这是我更新后的代码中的一个片段:

final messageBytes = ByteData(totalLength);

...

for (var i=0; i<audioChunk.length; i++) {
messageBytes.setInt16(offset, audioChunk[i], Endian.little);
offset += 2;
}
请注意,16 位 int 实际上占用了 2 个字节的位置。如果您不指定 Endian 样式,那么它将默认为您的系统,这将导致标题 int 编码或音频数据出错...丢失丢失!
确保一切正确的最佳方法是编写 AWS 响应所需的解码函数,然后对编码的帧进行解码,看看结果是否相同。使用像 [-32000, -100, 0, 200 31000] 之类的 audo 测试数据或类似的东西,这样你就可以测试字节顺序等都是正确的。

关于amazon-web-services - AWS 转录流 BadRequestException : "Could not decode the audio stream...",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68037614/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com