我有一个功能齐全的IBM Watson Speech To Text客户端。我想开始记录更多的元数据(词的置信度,开始/结束时间等),因此我在初始请求中添加了适当的字段。
一切正常,直到我遇到将Watson文本消息响应反序列化为JSON对象的异常。当我打印字符串时,这就是结果。请注意,它已被切断,这说明了反序列化错误:
{
"results": [
{
"word_alternatives": [
{
"start_time": 3.71,
"alternatives": [
{
"confidence": 1.0,
"word": "Hey"
}
],
"end_time": 3.97
},
{
"start_time": 3.97,
"alternatives": [
{
"confidence": 1.0,
"word": "what's"
}
],
"end_time": 4.54
},
{
"start_time": 4.54,
"alternatives": [
{
"confidence": 1.0,
我似乎要求太多信息。从System.Net.WebSockets.WebSocketReceiveResult
返回的ClientWebSocket.ReceiveAsync()
对象具有属性result.Count
,该属性描述了所发送信息的字节数。在调试中,我发现result.Count = 1024.
我的问题是这些:
1-1kB限制是由Watson强加还是.NET WebSocket库的限制?
2-如何取消该限制以接收完整消息?
编辑:最小示例
有很多代码可以解决此问题,但是希望可以提供足够的上下文来提供帮助:
// Set up connection
ClientWebSocket socket = new ClientWebSocket();
// Works:
//string headerInfo = "{ \"content-type\":\"audio/l16;rate=8000\",\"interim_results\":true,\"smart_formatting\":true,\"timestamps\":false,\"inactivity_timeout\":-1,\"word_confidence\":false,\"profanity_filter\":false,\"action\":\"start\"}";
// Doesn't:
string headerInfo = "{ \"content-type\":\"audio/l16;rate=8000\",\"interim_results\":true,\"smart_formatting\":true,\"timestamps\":true,\"inactivity_timeout\":-1,\"word_confidence\":true,\"profanity_filter\":false,\"action\":\"start\"}";
var startMsg = new ArraySegment<byte>(Encoding.UTF8.GetBytes(headerInfo));
var endOfMsg = true;
await socket.SendAsync(startMsg, WebSocketMessageType.Text, endOfMsg, default(CancellationToken));
// Send Audio bytes
// Receive response
var msgBuffer = new byte[8 * 1024];
var receiver = new ArraySegment<byte>(msgBuffer);
var result = await socket.ReceiveAsync(receiver, CancellationToken.None);
var message = Encoding.UTF8.GetString(receiver.Array.Take(result.Count).ToArray());
var result = JsonConvert.DeserializeObject<ResultsObject>(watsonMsg);
ResultsObject
是要反序列化为的本地类型。
答案 0 :(得分:0)
事实证明,一条消息正在分几块发送。解决方法是此修复程序:
var ResultMsg = new List<byte>();
if (receiver.Array.Length > 0)
{
ResultMsg.AddRange(receiver.Array.Take(result.Count));
}
if (result.EndOfMessage)
{
var msgBytes = ResultMsg.ToArray();
var message = Encoding.UTF8.GetString(msgBytes);
TextMessageHandler(message);
ResultMsg.Clear();
}