fixes for broken STT
This commit is contained in:
@@ -32,12 +32,7 @@ public sealed class JiboWebSocketService(
|
||||
|
||||
var parsedType = ReadMessageType(envelope.Text);
|
||||
session.LastMessageType = parsedType;
|
||||
var parsedTransId = ReadTransId(envelope.Text);
|
||||
if (!string.IsNullOrWhiteSpace(parsedTransId))
|
||||
{
|
||||
session.LastTransId = parsedTransId;
|
||||
session.TurnState.TransId = parsedTransId;
|
||||
}
|
||||
turnFinalizationService.ObserveIncomingMessage(session, envelope.Text);
|
||||
|
||||
if (parsedType == "CONTEXT")
|
||||
{
|
||||
@@ -101,27 +96,4 @@ public sealed class JiboWebSocketService(
|
||||
|
||||
return "UNKNOWN";
|
||||
}
|
||||
|
||||
private static string? ReadTransId(string? text)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(text))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
using var document = JsonDocument.Parse(text);
|
||||
if (document.RootElement.TryGetProperty("transID", out var transId) && transId.ValueKind == JsonValueKind.String)
|
||||
{
|
||||
return transId.GetString();
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,6 +17,21 @@ public sealed class WebSocketTurnFinalizationService(
|
||||
private const int AutoFinalizeMinBufferedAudioChunks = 5;
|
||||
private static readonly TimeSpan AutoFinalizeMinTurnAge = TimeSpan.FromMilliseconds(1800);
|
||||
|
||||
public void ObserveIncomingMessage(CloudSession session, string? text)
|
||||
{
|
||||
if (!TryReadTransId(text, out var nextTransId) || string.IsNullOrWhiteSpace(nextTransId))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (!string.Equals(session.TurnState.TransId, nextTransId, StringComparison.Ordinal))
|
||||
{
|
||||
ResetTurnState(session.TurnState, nextTransId);
|
||||
}
|
||||
|
||||
session.LastTransId = nextTransId;
|
||||
}
|
||||
|
||||
public async Task<IReadOnlyList<WebSocketReply>> HandleBinaryAudioAsync(
|
||||
CloudSession session,
|
||||
WebSocketMessageEnvelope envelope,
|
||||
@@ -419,4 +434,30 @@ public sealed class WebSocketTurnFinalizationService(
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private static bool TryReadTransId(string? text, out string? transId)
|
||||
{
|
||||
transId = null;
|
||||
if (string.IsNullOrWhiteSpace(text))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
using var document = JsonDocument.Parse(text);
|
||||
if (!document.RootElement.TryGetProperty("transID", out var transIdProperty) ||
|
||||
transIdProperty.ValueKind != JsonValueKind.String)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
transId = transIdProperty.GetString();
|
||||
return !string.IsNullOrWhiteSpace(transId);
|
||||
}
|
||||
catch
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -646,6 +646,77 @@ public sealed class JiboWebSocketServiceTests
|
||||
Assert.Equal(0, session.TurnState.BufferedAudioChunkCount);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task NewTransId_OnContext_ResetsStaleBufferedAudioBeforeFollowUpTurn()
|
||||
{
|
||||
await _service.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
HostName = "neo-hub.jibo.com",
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Token = "hub-context-reset-token",
|
||||
Text = """{"type":"LISTEN","transID":"trans-first","data":{"rules":["wake-word"]}}"""
|
||||
});
|
||||
|
||||
await _service.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
HostName = "neo-hub.jibo.com",
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Token = "hub-context-reset-token",
|
||||
Text = """{"type":"CONTEXT","transID":"trans-first","data":{"audioTranscriptHint":"tell me a joke"}}"""
|
||||
});
|
||||
|
||||
await _service.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
HostName = "neo-hub.jibo.com",
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Token = "hub-context-reset-token",
|
||||
Binary = [1, 2, 3, 4]
|
||||
});
|
||||
|
||||
await _service.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
HostName = "neo-hub.jibo.com",
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Token = "hub-context-reset-token",
|
||||
Text = """{"type":"CLIENT_ASR","transID":"trans-first","data":{}}"""
|
||||
});
|
||||
|
||||
await _service.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
HostName = "neo-hub.jibo.com",
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Token = "hub-context-reset-token",
|
||||
Binary = [9, 9, 9, 9]
|
||||
});
|
||||
|
||||
var session = _store.FindSessionByToken("hub-context-reset-token");
|
||||
Assert.NotNull(session);
|
||||
Assert.Equal(4, session.TurnState.BufferedAudioBytes);
|
||||
|
||||
var contextReplies = await _service.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
HostName = "neo-hub.jibo.com",
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Token = "hub-context-reset-token",
|
||||
Text = """{"type":"CONTEXT","transID":"trans-second","data":{"topic":"conversation"}}"""
|
||||
});
|
||||
|
||||
Assert.Single(contextReplies);
|
||||
Assert.Equal("OPENJIBO_CONTEXT_ACK", ReadReplyType(contextReplies[0]));
|
||||
|
||||
session = _store.FindSessionByToken("hub-context-reset-token");
|
||||
Assert.NotNull(session);
|
||||
Assert.Equal("trans-second", session.TurnState.TransId);
|
||||
Assert.Equal(0, session.TurnState.BufferedAudioBytes);
|
||||
Assert.Equal(0, session.TurnState.BufferedAudioChunkCount);
|
||||
}
|
||||
|
||||
[Theory]
|
||||
[InlineData("fixtures\\neo-hub-client-asr-joke.flow.json")]
|
||||
[InlineData("fixtures\\neo-hub-context-client-nlu.flow.json")]
|
||||
|
||||
Reference in New Issue
Block a user