Watson Speech to Text: ответное сообщение слишком длинное - отрезано
У меня есть полнофункциональный клиент для IBM Watson Speech To Text. Я хотел начать записывать больше метаданных (достоверность слов, время начала / окончания и т. Д.), Поэтому я добавил соответствующие поля в свой первоначальный запрос.
Все работало гладко, пока я не столкнулся с исключением, десериализующим ответ текстового сообщения Уотсона в объект 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 - Ограничение в 1 КБ, наложенное Уотсоном, или это ограничение библиотеки.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
это локальный тип для десериализации.
1 ответ
Оказалось, что сообщение отправлялось несколькими частями. Решение было это исправить:
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();
}