作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 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.
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 编码或音频数据出错...丢失丢失!
关于amazon-web-services - AWS 转录流 BadRequestException : "Could not decode the audio stream...",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68037614/
我是一名优秀的程序员,十分优秀!