update version
This commit is contained in:
@@ -233,6 +233,9 @@ Useful external references:
|
||||
- The `jibo test 19` bundle confirmed that gallery follow-up confirmation uses the stock local `shared/yes_no` rule family, not just the create/settings/surprise yes-no families. Spoken `yes` was being heard correctly, but leaking the global rules back into Nimbus instead of staying local.
|
||||
- The same bundle also confirmed some `OPENJIBO_AUDIO_RECEIVED` noise was still coming from an older running build, because the current `.NET` source no longer emits that synthetic websocket event. When a live session still shows it, operator workflow should treat that as a rebuild/restart sanity-check clue before assuming a new regression.
|
||||
- Spoken `cancel alarm` should map into stock `@be/clock` `delete` semantics, not generic chat. The current cloud path now mirrors that local intent so voice cancel can follow the same lane as the robot's clock skill.
|
||||
- The `jibo test 20` bundle suggests gallery itself is mostly okay in the latest pass, but clock and protocol polish still matter: stock `CLIENT_NLU intent="set"` with only `domain="alarm"` should stay on the local clarification path instead of defaulting the cloud payload to `7:00`, and stock `CLIENT_NLU intent="cancel"` on `clock/alarm_timer_query_menu` should reuse the last active clock domain so delete actually lands on alarm/timer instead of generic chat.
|
||||
- The same `jibo test 20` robot logs also showed `OPENJIBO_TURN_PENDING` and `OPENJIBO_CONTEXT_ACK` are just unknown-event noise on stock OS 1.9, so the compatibility layer now keeps that turn state internally and stops sending those synthetic websocket event types to the robot.
|
||||
- That bundle still contains real `ffmpeg` / `whisper.cpp` failures in the buffered-audio STT seam, and it also includes a genuine `jibo-server-service` broken-pipe / server-connection-lost episode, so not every freeze in that round should be blamed on cloud turn routing alone.
|
||||
|
||||
## MCP-Like Ideas
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
This is the production-oriented path for restoring device connectivity and creating a foundation for future runtime, AI, and OTA work.
|
||||
|
||||
Current spoken cloud version: `Open Jibo Cloud version 1.0.16.`
|
||||
Current spoken cloud version: `Open Jibo Cloud version 1.0.17.`
|
||||
|
||||
Release hygiene reminder:
|
||||
|
||||
|
||||
@@ -22,6 +22,9 @@ public sealed class JiboInteractionService(
|
||||
var listenRules = ReadRules(turn, "listenRules").ToArray();
|
||||
var listenAsrHints = ReadRules(turn, "listenAsrHints").ToArray();
|
||||
var clientEntities = ReadEntities(turn);
|
||||
var lastClockDomain = turn.Attributes.TryGetValue("lastClockDomain", out var rawLastClockDomain)
|
||||
? rawLastClockDomain?.ToString()
|
||||
: null;
|
||||
var isYesNoTurn = IsYesNoTurn(turn);
|
||||
|
||||
var isTimerValueTurn = IsClockTimerValueTurn(clientRules, listenRules);
|
||||
@@ -33,6 +36,7 @@ public sealed class JiboInteractionService(
|
||||
clientRules,
|
||||
listenRules,
|
||||
clientEntities,
|
||||
lastClockDomain,
|
||||
isYesNoTurn,
|
||||
isTimerValueTurn,
|
||||
isAlarmValueTurn);
|
||||
@@ -53,8 +57,8 @@ public sealed class JiboInteractionService(
|
||||
"alarm_menu" => BuildClockLaunchDecision("alarm", "Opening the alarm."),
|
||||
"timer_delete" => BuildClockLaunchDecision("timer_delete", "timer", "delete", "Canceling the timer."),
|
||||
"alarm_delete" => BuildClockLaunchDecision("alarm_delete", "alarm", "delete", "Canceling the alarm."),
|
||||
"timer_value" => BuildTimerValueDecision(lowered, isTimerValueTurn),
|
||||
"alarm_value" => BuildAlarmValueDecision(lowered, isAlarmValueTurn, referenceLocalTime),
|
||||
"timer_value" => BuildTimerValueDecision(lowered, isTimerValueTurn, clientEntities),
|
||||
"alarm_value" => BuildAlarmValueDecision(lowered, isAlarmValueTurn, referenceLocalTime, clientEntities),
|
||||
"timer_clarify" => new JiboInteractionDecision("timer_clarify", "How long should I set the timer for?"),
|
||||
"alarm_clarify" => new JiboInteractionDecision("alarm_clarify", "What time should I set the alarm for?"),
|
||||
"photo_gallery" => BuildPhotoGalleryLaunchDecision(),
|
||||
@@ -156,6 +160,7 @@ public sealed class JiboInteractionService(
|
||||
IReadOnlyList<string> clientRules,
|
||||
IReadOnlyList<string> listenRules,
|
||||
IReadOnlyDictionary<string, string> clientEntities,
|
||||
string? lastClockDomain,
|
||||
bool isYesNoTurn,
|
||||
bool isTimerValueTurn,
|
||||
bool isAlarmValueTurn)
|
||||
@@ -219,12 +224,26 @@ public sealed class JiboInteractionService(
|
||||
{
|
||||
return startDomain.ToLowerInvariant() switch
|
||||
{
|
||||
"timer" => "timer_value",
|
||||
"alarm" => "alarm_value",
|
||||
"timer" => HasStructuredTimerValue(clientEntities) || TryParseTimerValue(loweredTranscript, isTimerValueTurn) is not null
|
||||
? "timer_value"
|
||||
: "timer_clarify",
|
||||
"alarm" => HasStructuredAlarmValue(clientEntities) || TryParseAlarmValue(loweredTranscript, isAlarmValueTurn, referenceLocalTime) is not null
|
||||
? "alarm_value"
|
||||
: "alarm_clarify",
|
||||
_ => "chat"
|
||||
};
|
||||
}
|
||||
|
||||
if ((string.Equals(clientIntent, "cancel", StringComparison.OrdinalIgnoreCase) ||
|
||||
string.Equals(clientIntent, "delete", StringComparison.OrdinalIgnoreCase)) &&
|
||||
clientRules.Concat(listenRules).Any(rule => string.Equals(rule, "clock/alarm_timer_query_menu", StringComparison.OrdinalIgnoreCase)))
|
||||
{
|
||||
var cancelDomain = ResolveClockDomain(clientEntities, clientRules, listenRules, lastClockDomain);
|
||||
return string.Equals(cancelDomain, "timer", StringComparison.OrdinalIgnoreCase)
|
||||
? "timer_delete"
|
||||
: "alarm_delete";
|
||||
}
|
||||
|
||||
if (string.Equals(clientIntent, "menu", StringComparison.OrdinalIgnoreCase) &&
|
||||
clientEntities.TryGetValue("domain", out var clockDomain))
|
||||
{
|
||||
@@ -520,9 +539,14 @@ public sealed class JiboInteractionService(
|
||||
return BuildClockLaunchDecision($"{domain}_menu", domain, "menu", replyText);
|
||||
}
|
||||
|
||||
private static JiboInteractionDecision BuildTimerValueDecision(string loweredTranscript, bool allowImplicit)
|
||||
private static JiboInteractionDecision BuildTimerValueDecision(
|
||||
string loweredTranscript,
|
||||
bool allowImplicit,
|
||||
IReadOnlyDictionary<string, string> clientEntities)
|
||||
{
|
||||
var timer = TryParseTimerValue(loweredTranscript, allowImplicit) ?? new ClockTimerValue("0", "1", "null");
|
||||
var timer = TryReadStructuredTimerValue(clientEntities) ??
|
||||
TryParseTimerValue(loweredTranscript, allowImplicit) ??
|
||||
new ClockTimerValue("0", "1", "null");
|
||||
|
||||
return new JiboInteractionDecision(
|
||||
"timer_value",
|
||||
@@ -542,9 +566,12 @@ public sealed class JiboInteractionService(
|
||||
private static JiboInteractionDecision BuildAlarmValueDecision(
|
||||
string loweredTranscript,
|
||||
bool allowImplicit,
|
||||
DateTimeOffset? referenceLocalTime)
|
||||
DateTimeOffset? referenceLocalTime,
|
||||
IReadOnlyDictionary<string, string> clientEntities)
|
||||
{
|
||||
var alarm = TryParseAlarmValue(loweredTranscript, allowImplicit, referenceLocalTime) ?? new ClockAlarmValue("7:00", "am");
|
||||
var alarm = TryReadStructuredAlarmValue(clientEntities) ??
|
||||
TryParseAlarmValue(loweredTranscript, allowImplicit, referenceLocalTime) ??
|
||||
new ClockAlarmValue("7:00", "am");
|
||||
|
||||
return new JiboInteractionDecision(
|
||||
"alarm_value",
|
||||
@@ -959,6 +986,81 @@ public sealed class JiboInteractionService(
|
||||
return candidate;
|
||||
}
|
||||
|
||||
private static bool HasStructuredTimerValue(IReadOnlyDictionary<string, string> clientEntities)
|
||||
{
|
||||
return clientEntities.ContainsKey("hours") ||
|
||||
clientEntities.ContainsKey("minutes") ||
|
||||
clientEntities.ContainsKey("seconds");
|
||||
}
|
||||
|
||||
private static bool HasStructuredAlarmValue(IReadOnlyDictionary<string, string> clientEntities)
|
||||
{
|
||||
return clientEntities.TryGetValue("time", out var time) &&
|
||||
!string.IsNullOrWhiteSpace(time);
|
||||
}
|
||||
|
||||
private static ClockTimerValue? TryReadStructuredTimerValue(IReadOnlyDictionary<string, string> clientEntities)
|
||||
{
|
||||
if (!HasStructuredTimerValue(clientEntities))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
clientEntities.TryGetValue("hours", out var hours);
|
||||
clientEntities.TryGetValue("minutes", out var minutes);
|
||||
clientEntities.TryGetValue("seconds", out var seconds);
|
||||
return new ClockTimerValue(
|
||||
string.IsNullOrWhiteSpace(hours) ? "0" : hours,
|
||||
string.IsNullOrWhiteSpace(minutes) ? "0" : minutes,
|
||||
string.IsNullOrWhiteSpace(seconds) ? "null" : seconds);
|
||||
}
|
||||
|
||||
private static ClockAlarmValue? TryReadStructuredAlarmValue(IReadOnlyDictionary<string, string> clientEntities)
|
||||
{
|
||||
if (!clientEntities.TryGetValue("time", out var time) || string.IsNullOrWhiteSpace(time))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
clientEntities.TryGetValue("ampm", out var ampm);
|
||||
return new ClockAlarmValue(time, string.IsNullOrWhiteSpace(ampm) ? "am" : ampm.ToLowerInvariant());
|
||||
}
|
||||
|
||||
private static string? ResolveClockDomain(
|
||||
IReadOnlyDictionary<string, string> clientEntities,
|
||||
IReadOnlyList<string> clientRules,
|
||||
IReadOnlyList<string> listenRules,
|
||||
string? lastClockDomain)
|
||||
{
|
||||
if (clientEntities.TryGetValue("domain", out var clientDomain) &&
|
||||
!string.IsNullOrWhiteSpace(clientDomain))
|
||||
{
|
||||
return clientDomain;
|
||||
}
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(lastClockDomain))
|
||||
{
|
||||
return lastClockDomain;
|
||||
}
|
||||
|
||||
var combinedRules = clientRules.Concat(listenRules);
|
||||
if (combinedRules.Any(rule =>
|
||||
rule.Contains("timer", StringComparison.OrdinalIgnoreCase) &&
|
||||
!rule.Contains("alarm_timer_query_menu", StringComparison.OrdinalIgnoreCase)))
|
||||
{
|
||||
return "timer";
|
||||
}
|
||||
|
||||
if (combinedRules.Any(rule =>
|
||||
rule.Contains("alarm", StringComparison.OrdinalIgnoreCase) &&
|
||||
!rule.Contains("alarm_timer_query_menu", StringComparison.OrdinalIgnoreCase)))
|
||||
{
|
||||
return "alarm";
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private static bool IsTimerRequest(string loweredTranscript)
|
||||
{
|
||||
return MatchesAny(
|
||||
|
||||
@@ -2,7 +2,7 @@ namespace Jibo.Cloud.Application.Services;
|
||||
|
||||
public static class OpenJiboCloudBuildInfo
|
||||
{
|
||||
public const string Version = "1.0.16";
|
||||
public const string Version = "1.0.17";
|
||||
|
||||
public static string VersionWords => Version.Replace(".", " dot ");
|
||||
|
||||
|
||||
@@ -26,6 +26,13 @@ public sealed class ProtocolToTurnContextMapper
|
||||
attributes["context"] = turnState.ContextPayload;
|
||||
}
|
||||
|
||||
if (session.Metadata.TryGetValue("lastClockDomain", out var lastClockDomain) &&
|
||||
lastClockDomain is string lastClockDomainText &&
|
||||
!string.IsNullOrWhiteSpace(lastClockDomainText))
|
||||
{
|
||||
attributes["lastClockDomain"] = lastClockDomainText;
|
||||
}
|
||||
|
||||
attributes["listenHotphrase"] = turnState.ListenHotphrase;
|
||||
|
||||
if (turnState.ListenRules.Count > 0)
|
||||
|
||||
@@ -95,21 +95,7 @@ public sealed class WebSocketTurnFinalizationService(
|
||||
turnState.IgnoreAdditionalAudioUntilUtc = DateTimeOffset.UtcNow.Add(WebSocketTurnState.DefaultLateAudioIgnoreWindow);
|
||||
ResetBufferedAudio(session);
|
||||
turnState.SawContext = false;
|
||||
return
|
||||
[
|
||||
new WebSocketReply
|
||||
{
|
||||
Text = JsonSerializer.Serialize(new
|
||||
{
|
||||
type = "OPENJIBO_CONTEXT_ACK",
|
||||
data = new
|
||||
{
|
||||
sessionId = session.SessionId,
|
||||
transID = session.LastTransId
|
||||
}
|
||||
})
|
||||
}
|
||||
];
|
||||
return [];
|
||||
}
|
||||
|
||||
if (ShouldAutoFinalize(session))
|
||||
@@ -117,21 +103,7 @@ public sealed class WebSocketTurnFinalizationService(
|
||||
return await FinalizeTurnAsync(session, envelope, "AUTO_FINALIZE", allowFallbackOnMissingTranscript: true, cancellationToken);
|
||||
}
|
||||
|
||||
return
|
||||
[
|
||||
new WebSocketReply
|
||||
{
|
||||
Text = JsonSerializer.Serialize(new
|
||||
{
|
||||
type = "OPENJIBO_CONTEXT_ACK",
|
||||
data = new
|
||||
{
|
||||
sessionId = session.SessionId,
|
||||
transID = session.LastTransId
|
||||
}
|
||||
})
|
||||
}
|
||||
];
|
||||
return [];
|
||||
}
|
||||
|
||||
public async Task<IReadOnlyList<WebSocketReply>> HandleTurnAsync(
|
||||
@@ -170,26 +142,7 @@ public sealed class WebSocketTurnFinalizationService(
|
||||
}
|
||||
|
||||
session.TurnState.AwaitingTurnCompletion = true;
|
||||
return
|
||||
[
|
||||
new WebSocketReply
|
||||
{
|
||||
Text = JsonSerializer.Serialize(new
|
||||
{
|
||||
type = "OPENJIBO_TURN_PENDING",
|
||||
data = new
|
||||
{
|
||||
sessionId = session.SessionId,
|
||||
transID = session.LastTransId,
|
||||
bufferedAudioBytes = session.TurnState.BufferedAudioBytes,
|
||||
bufferedAudioChunks = session.TurnState.BufferedAudioChunkCount,
|
||||
awaitingAudio = session.TurnState.BufferedAudioBytes == 0,
|
||||
awaitingTranscriptHint = session.TurnState.BufferedAudioBytes > 0 && string.IsNullOrWhiteSpace(session.TurnState.AudioTranscriptHint),
|
||||
finalizeAttempts = session.TurnState.FinalizeAttemptCount
|
||||
}
|
||||
})
|
||||
}
|
||||
];
|
||||
return [];
|
||||
}
|
||||
|
||||
private async Task<TurnContext> ResolveTranscriptAsync(TurnContext turn, CloudSession session, CancellationToken cancellationToken)
|
||||
@@ -475,26 +428,7 @@ public sealed class WebSocketTurnFinalizationService(
|
||||
{
|
||||
turnState.HotphraseEmptyTurnCount += 1;
|
||||
turnState.AwaitingTurnCompletion = true;
|
||||
return
|
||||
[
|
||||
new WebSocketReply
|
||||
{
|
||||
Text = JsonSerializer.Serialize(new
|
||||
{
|
||||
type = "OPENJIBO_TURN_PENDING",
|
||||
data = new
|
||||
{
|
||||
sessionId = session.SessionId,
|
||||
transID = session.LastTransId,
|
||||
bufferedAudioBytes = turnState.BufferedAudioBytes,
|
||||
bufferedAudioChunks = turnState.BufferedAudioChunkCount,
|
||||
awaitingAudio = turnState.BufferedAudioBytes == 0,
|
||||
awaitingTranscriptHint = turnState.BufferedAudioBytes > 0 && string.IsNullOrWhiteSpace(turnState.AudioTranscriptHint),
|
||||
finalizeAttempts = turnState.FinalizeAttemptCount
|
||||
}
|
||||
})
|
||||
}
|
||||
];
|
||||
return [];
|
||||
}
|
||||
|
||||
if (ShouldTreatEmptyHotphraseTurnAsGreeting(finalizedTurn))
|
||||
@@ -551,26 +485,7 @@ public sealed class WebSocketTurnFinalizationService(
|
||||
return fallbackReplies;
|
||||
}
|
||||
|
||||
return
|
||||
[
|
||||
new WebSocketReply
|
||||
{
|
||||
Text = JsonSerializer.Serialize(new
|
||||
{
|
||||
type = "OPENJIBO_TURN_PENDING",
|
||||
data = new
|
||||
{
|
||||
sessionId = session.SessionId,
|
||||
transID = session.LastTransId,
|
||||
bufferedAudioBytes = turnState.BufferedAudioBytes,
|
||||
bufferedAudioChunks = turnState.BufferedAudioChunkCount,
|
||||
awaitingAudio = turnState.BufferedAudioBytes == 0,
|
||||
awaitingTranscriptHint = turnState.BufferedAudioBytes > 0 && string.IsNullOrWhiteSpace(turnState.AudioTranscriptHint),
|
||||
finalizeAttempts = turnState.FinalizeAttemptCount
|
||||
}
|
||||
})
|
||||
}
|
||||
];
|
||||
return [];
|
||||
}
|
||||
|
||||
var plan = await conversationBroker.HandleTurnAsync(finalizedTurn, cancellationToken);
|
||||
@@ -578,6 +493,12 @@ public sealed class WebSocketTurnFinalizationService(
|
||||
session.LastTranscript = finalizedTurn.NormalizedTranscript ?? finalizedTurn.RawTranscript;
|
||||
session.LastIntent = plan.IntentName;
|
||||
session.LastListenType = listenAction?.Mode;
|
||||
if (plan.Actions.OfType<InvokeNativeSkillAction>().FirstOrDefault() is { SkillName: "@be/clock", Payload: not null } clockAction &&
|
||||
clockAction.Payload.TryGetValue("domain", out var lastClockDomainValue) &&
|
||||
lastClockDomainValue is not null)
|
||||
{
|
||||
session.Metadata["lastClockDomain"] = lastClockDomainValue.ToString();
|
||||
}
|
||||
session.FollowUpExpiresUtc = plan.FollowUp.KeepMicOpen
|
||||
? DateTimeOffset.UtcNow.Add(plan.FollowUp.Timeout)
|
||||
: null;
|
||||
|
||||
@@ -17,9 +17,7 @@
|
||||
]
|
||||
}
|
||||
},
|
||||
"expectedReplyTypes": [
|
||||
"OPENJIBO_TURN_PENDING"
|
||||
]
|
||||
"expectedReplyTypes": []
|
||||
},
|
||||
{
|
||||
"binary": [1, 2, 3, 4],
|
||||
@@ -31,9 +29,7 @@
|
||||
"transID": "fixture-trans-pending",
|
||||
"data": { }
|
||||
},
|
||||
"expectedReplyTypes": [
|
||||
"OPENJIBO_TURN_PENDING"
|
||||
]
|
||||
"expectedReplyTypes": []
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -17,9 +17,7 @@
|
||||
]
|
||||
}
|
||||
},
|
||||
"expectedReplyTypes": [
|
||||
"OPENJIBO_TURN_PENDING"
|
||||
]
|
||||
"expectedReplyTypes": []
|
||||
},
|
||||
{
|
||||
"text": {
|
||||
@@ -30,9 +28,7 @@
|
||||
"audioTranscriptHint": "tell me a joke"
|
||||
}
|
||||
},
|
||||
"expectedReplyTypes": [
|
||||
"OPENJIBO_CONTEXT_ACK"
|
||||
]
|
||||
"expectedReplyTypes": []
|
||||
},
|
||||
{
|
||||
"binary": [1, 2, 3, 4, 5, 6],
|
||||
|
||||
@@ -20,9 +20,7 @@
|
||||
"mode": "CLIENT_NLU"
|
||||
}
|
||||
},
|
||||
"expectedReplyTypes": [
|
||||
"OPENJIBO_TURN_PENDING"
|
||||
]
|
||||
"expectedReplyTypes": []
|
||||
},
|
||||
{
|
||||
"text": {
|
||||
|
||||
@@ -33,9 +33,7 @@
|
||||
"screen": "home"
|
||||
}
|
||||
},
|
||||
"expectedReplyTypes": [
|
||||
"OPENJIBO_CONTEXT_ACK"
|
||||
]
|
||||
"expectedReplyTypes": []
|
||||
},
|
||||
{
|
||||
"text": {
|
||||
|
||||
@@ -17,9 +17,7 @@
|
||||
]
|
||||
}
|
||||
},
|
||||
"expectedReplyTypes": [
|
||||
"OPENJIBO_TURN_PENDING"
|
||||
]
|
||||
"expectedReplyTypes": []
|
||||
},
|
||||
{
|
||||
"text": {
|
||||
@@ -29,9 +27,7 @@
|
||||
"audioTranscriptHint": "hello from buffered audio"
|
||||
}
|
||||
},
|
||||
"expectedReplyTypes": [
|
||||
"OPENJIBO_CONTEXT_ACK"
|
||||
]
|
||||
"expectedReplyTypes": []
|
||||
},
|
||||
{
|
||||
"binary": [1, 2, 3],
|
||||
|
||||
@@ -519,6 +519,53 @@ public sealed class JiboInteractionServiceTests
|
||||
Assert.Equal("delete", decision.SkillPayload["clockIntent"]);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task BuildDecisionAsync_ClientNluSetAlarmWithoutTime_AsksForClarification()
|
||||
{
|
||||
var service = CreateService();
|
||||
|
||||
var decision = await service.BuildDecisionAsync(new TurnContext
|
||||
{
|
||||
RawTranscript = "set",
|
||||
NormalizedTranscript = "set",
|
||||
Attributes = new Dictionary<string, object?>
|
||||
{
|
||||
["clientIntent"] = "set",
|
||||
["clientEntities"] = new Dictionary<string, object?>
|
||||
{
|
||||
["domain"] = "alarm"
|
||||
},
|
||||
["clientRules"] = new[] { "clock/clock_menu" }
|
||||
}
|
||||
});
|
||||
|
||||
Assert.Equal("alarm_clarify", decision.IntentName);
|
||||
Assert.Null(decision.SkillName);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task BuildDecisionAsync_ClientNluCancelFromAlarmQueryMenu_UsesLastClockDomain()
|
||||
{
|
||||
var service = CreateService();
|
||||
|
||||
var decision = await service.BuildDecisionAsync(new TurnContext
|
||||
{
|
||||
RawTranscript = "cancel",
|
||||
NormalizedTranscript = "cancel",
|
||||
Attributes = new Dictionary<string, object?>
|
||||
{
|
||||
["clientIntent"] = "cancel",
|
||||
["clientRules"] = new[] { "clock/alarm_timer_query_menu" },
|
||||
["lastClockDomain"] = "alarm"
|
||||
}
|
||||
});
|
||||
|
||||
Assert.Equal("alarm_delete", decision.IntentName);
|
||||
Assert.Equal("@be/clock", decision.SkillName);
|
||||
Assert.Equal("alarm", decision.SkillPayload!["domain"]);
|
||||
Assert.Equal("delete", decision.SkillPayload["clockIntent"]);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task BuildDecisionAsync_SetTimerWithoutDuration_AsksForClarification()
|
||||
{
|
||||
|
||||
@@ -279,8 +279,7 @@ public sealed class JiboWebSocketServiceTests
|
||||
Text = """{"type":"CONTEXT","transID":"trans-follow-up","data":{"topic":"conversation","screen":"home"}}"""
|
||||
});
|
||||
|
||||
Assert.Single(contextReplies);
|
||||
Assert.Equal("OPENJIBO_CONTEXT_ACK", ReadReplyType(contextReplies[0]));
|
||||
Assert.Empty(contextReplies);
|
||||
|
||||
var nluReplies = await _service.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
@@ -314,8 +313,7 @@ public sealed class JiboWebSocketServiceTests
|
||||
Text = """{"type":"LISTEN","transID":"trans-clock-time","data":{"lang":"en-US","rules":["clock/clock_menu","globals/global_commands_launch"],"mode":"CLIENT_NLU"}}"""
|
||||
});
|
||||
|
||||
Assert.Single(listenReplies);
|
||||
Assert.Equal("OPENJIBO_TURN_PENDING", ReadReplyType(listenReplies[0]));
|
||||
Assert.Empty(listenReplies);
|
||||
|
||||
var nluReplies = await _service.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
@@ -719,6 +717,85 @@ public sealed class JiboWebSocketServiceTests
|
||||
Assert.Equal("delete", redirectPayload.RootElement.GetProperty("data").GetProperty("nlu").GetProperty("intent").GetString());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task ClientNlu_SetAlarmWithoutTime_StaysInClarificationInsteadOfDefaultingToSeven()
|
||||
{
|
||||
await _service.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
HostName = "neo-hub.jibo.com",
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Token = "hub-clock-set-alarm-query-token",
|
||||
Text = """{"type":"LISTEN","transID":"trans-clock-set-alarm-query","data":{"rules":["clock/clock_menu","globals/global_commands_launch"],"mode":"CLIENT_NLU"}}"""
|
||||
});
|
||||
|
||||
var replies = await _service.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
HostName = "neo-hub.jibo.com",
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Token = "hub-clock-set-alarm-query-token",
|
||||
Text = """{"type":"CLIENT_NLU","transID":"trans-clock-set-alarm-query","data":{"entities":{"domain":"alarm"},"intent":"set","rules":["clock/clock_menu"]}}"""
|
||||
});
|
||||
|
||||
Assert.Equal(2, replies.Count);
|
||||
Assert.Equal("LISTEN", ReadReplyType(replies[0]));
|
||||
Assert.Equal("EOS", ReadReplyType(replies[1]));
|
||||
|
||||
using var listenPayload = JsonDocument.Parse(replies[0].Text!);
|
||||
Assert.Equal("set", listenPayload.RootElement.GetProperty("data").GetProperty("nlu").GetProperty("intent").GetString());
|
||||
Assert.Equal("alarm", listenPayload.RootElement.GetProperty("data").GetProperty("nlu").GetProperty("entities").GetProperty("domain").GetString());
|
||||
Assert.False(listenPayload.RootElement.GetProperty("data").GetProperty("nlu").GetProperty("entities").TryGetProperty("time", out _));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task ClientNlu_CancelFromAlarmQueryMenu_UsesLastClockDomainAndDeletesAlarm()
|
||||
{
|
||||
await _service.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
HostName = "neo-hub.jibo.com",
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Token = "hub-clock-cancel-query-token",
|
||||
Text = """{"type":"LISTEN","transID":"trans-clock-cancel-query","data":{"rules":["globals/global_commands_launch"]}}"""
|
||||
});
|
||||
|
||||
await _service.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
HostName = "neo-hub.jibo.com",
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Token = "hub-clock-cancel-query-token",
|
||||
Text = """{"type":"CLIENT_ASR","transID":"trans-clock-cancel-query","data":{"text":"set an alarm for 7:16 am"}}"""
|
||||
});
|
||||
|
||||
await _service.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
HostName = "neo-hub.jibo.com",
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Token = "hub-clock-cancel-query-token",
|
||||
Text = """{"type":"LISTEN","transID":"trans-clock-cancel-query-menu","data":{"rules":["clock/alarm_timer_query_menu","globals/global_commands_launch"],"mode":"CLIENT_NLU"}}"""
|
||||
});
|
||||
|
||||
var replies = await _service.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
HostName = "neo-hub.jibo.com",
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Token = "hub-clock-cancel-query-token",
|
||||
Text = """{"type":"CLIENT_NLU","transID":"trans-clock-cancel-query-menu","data":{"entities":{},"intent":"cancel","rules":["clock/alarm_timer_query_menu"]}}"""
|
||||
});
|
||||
|
||||
Assert.Equal(2, replies.Count);
|
||||
Assert.Equal("LISTEN", ReadReplyType(replies[0]));
|
||||
Assert.Equal("EOS", ReadReplyType(replies[1]));
|
||||
|
||||
using var listenPayload = JsonDocument.Parse(replies[0].Text!);
|
||||
Assert.Equal("delete", listenPayload.RootElement.GetProperty("data").GetProperty("nlu").GetProperty("intent").GetString());
|
||||
Assert.Equal("alarm", listenPayload.RootElement.GetProperty("data").GetProperty("nlu").GetProperty("entities").GetProperty("domain").GetString());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task ClientAsr_OpenPhotoGallery_RedirectsIntoGallerySkill()
|
||||
{
|
||||
@@ -791,8 +868,7 @@ public sealed class JiboWebSocketServiceTests
|
||||
Text = """{"type":"CONTEXT","transID":"trans-photo-gallery-context","data":{"skill":{"id":"@be/gallery"}}}"""
|
||||
});
|
||||
|
||||
Assert.Single(replies);
|
||||
Assert.Equal("OPENJIBO_CONTEXT_ACK", ReadReplyType(replies[0]));
|
||||
Assert.Empty(replies);
|
||||
|
||||
var session = _store.FindSessionByToken("hub-photo-gallery-context-token");
|
||||
Assert.NotNull(session);
|
||||
@@ -1077,7 +1153,7 @@ public sealed class JiboWebSocketServiceTests
|
||||
Assert.Single(rules.EnumerateArray());
|
||||
Assert.Equal("surprises-date/offer_date_fact", rules[0].GetString());
|
||||
Assert.Equal("surprises-date/offer_date_fact", listenPayload.RootElement.GetProperty("data").GetProperty("match").GetProperty("rule").GetString());
|
||||
Assert.Equal(0, listenPayload.RootElement.GetProperty("data").GetProperty("nlu").GetProperty("entities").EnumerateObject().Count());
|
||||
Assert.Empty(listenPayload.RootElement.GetProperty("data").GetProperty("nlu").GetProperty("entities").EnumerateObject());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
@@ -1202,7 +1278,7 @@ public sealed class JiboWebSocketServiceTests
|
||||
Assert.Equal("menu", listenPayload.RootElement.GetProperty("data").GetProperty("nlu").GetProperty("intent").GetString());
|
||||
Assert.Equal("@be/radio", listenPayload.RootElement.GetProperty("data").GetProperty("nlu").GetProperty("skill").GetString());
|
||||
Assert.Equal(0, listenPayload.RootElement.GetProperty("data").GetProperty("nlu").GetProperty("rules").GetArrayLength());
|
||||
Assert.Equal(0, listenPayload.RootElement.GetProperty("data").GetProperty("nlu").GetProperty("entities").EnumerateObject().Count());
|
||||
Assert.Empty(listenPayload.RootElement.GetProperty("data").GetProperty("nlu").GetProperty("entities").EnumerateObject());
|
||||
|
||||
using var redirectPayload = JsonDocument.Parse(replies[2].Text!);
|
||||
Assert.Equal("@be/radio", redirectPayload.RootElement.GetProperty("data").GetProperty("match").GetProperty("skillID").GetString());
|
||||
@@ -1623,8 +1699,7 @@ public sealed class JiboWebSocketServiceTests
|
||||
Text = """{"type":"LISTEN","transID":"trans-listen-setup","data":{"rules":["main-menu/execute_fun_stuff","globals/global_commands_launch"],"mode":"CLIENT_NLU"}}"""
|
||||
});
|
||||
|
||||
Assert.Single(replies);
|
||||
Assert.Equal("OPENJIBO_TURN_PENDING", ReadReplyType(replies[0]));
|
||||
Assert.Empty(replies);
|
||||
|
||||
var session = _store.FindSessionByToken("hub-listen-setup-token");
|
||||
Assert.NotNull(session);
|
||||
@@ -1706,8 +1781,7 @@ public sealed class JiboWebSocketServiceTests
|
||||
Text = """{"type":"LISTEN","transID":"trans-initial-hotphrase","data":{"hotphrase":true,"rules":["launch","globals/global_commands_launch"]}}"""
|
||||
});
|
||||
|
||||
Assert.Single(replies);
|
||||
Assert.Equal("OPENJIBO_TURN_PENDING", ReadReplyType(replies[0]));
|
||||
Assert.Empty(replies);
|
||||
|
||||
var session = _store.FindSessionByToken("hub-initial-hotphrase-token");
|
||||
Assert.NotNull(session);
|
||||
@@ -1736,8 +1810,7 @@ public sealed class JiboWebSocketServiceTests
|
||||
Text = """{"type":"CLIENT_ASR","transID":"trans-empty-hotphrase","data":{}}"""
|
||||
});
|
||||
|
||||
Assert.Single(firstReplies);
|
||||
Assert.Equal("OPENJIBO_TURN_PENDING", ReadReplyType(firstReplies[0]));
|
||||
Assert.Empty(firstReplies);
|
||||
|
||||
var replies = await _service.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
@@ -1774,8 +1847,7 @@ public sealed class JiboWebSocketServiceTests
|
||||
Text = """{"type":"LISTEN","transID":"trans-audio","data":{"rules":["wake-word"]}}"""
|
||||
});
|
||||
|
||||
Assert.Single(listenReplies);
|
||||
Assert.Equal("OPENJIBO_TURN_PENDING", ReadReplyType(listenReplies[0]));
|
||||
Assert.Empty(listenReplies);
|
||||
|
||||
var contextReplies = await _service.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
@@ -1786,8 +1858,7 @@ public sealed class JiboWebSocketServiceTests
|
||||
Text = """{"type":"CONTEXT","transID":"trans-audio","data":{"topic":"conversation","audioTranscriptHint":"tell me a joke"}}"""
|
||||
});
|
||||
|
||||
Assert.Single(contextReplies);
|
||||
Assert.Equal("OPENJIBO_CONTEXT_ACK", ReadReplyType(contextReplies[0]));
|
||||
Assert.Empty(contextReplies);
|
||||
|
||||
var audioReplies = await _service.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
@@ -1856,12 +1927,12 @@ public sealed class JiboWebSocketServiceTests
|
||||
Text = """{"type":"CLIENT_ASR","transID":"trans-pending","data":{}}"""
|
||||
});
|
||||
|
||||
Assert.Single(finalizeReplies);
|
||||
Assert.Equal("OPENJIBO_TURN_PENDING", ReadReplyType(finalizeReplies[0]));
|
||||
Assert.Empty(finalizeReplies);
|
||||
|
||||
using var payload = JsonDocument.Parse(finalizeReplies[0].Text!);
|
||||
Assert.True(payload.RootElement.GetProperty("data").GetProperty("awaitingTranscriptHint").GetBoolean());
|
||||
Assert.Equal(1, payload.RootElement.GetProperty("data").GetProperty("finalizeAttempts").GetInt32());
|
||||
var session = _store.FindSessionByToken("hub-pending-token");
|
||||
Assert.NotNull(session);
|
||||
Assert.True(session.TurnState.AwaitingTurnCompletion);
|
||||
Assert.Equal(1, session.TurnState.FinalizeAttemptCount);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
@@ -2187,8 +2258,7 @@ public sealed class JiboWebSocketServiceTests
|
||||
Text = """{"type":"CONTEXT","transID":"trans-second","data":{"topic":"conversation"}}"""
|
||||
});
|
||||
|
||||
Assert.Single(contextReplies);
|
||||
Assert.Equal("OPENJIBO_CONTEXT_ACK", ReadReplyType(contextReplies[0]));
|
||||
Assert.Empty(contextReplies);
|
||||
|
||||
session = _store.FindSessionByToken("hub-context-reset-token");
|
||||
Assert.NotNull(session);
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"exception": "System.InvalidOperationException: whisper.cpp returned no transcript for the buffered audio turn.\n at Jibo.Cloud.Infrastructure.Audio.LocalWhisperCppBufferedAudioSttStrategy.TranscribeAsync(TurnContext turn, CancellationToken cancellationToken) in /home/jake-dubin/JiboExperiments/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/Audio/LocalWhisperCppBufferedAudioSttStrategy.cs:line 58\n at Jibo.Cloud.Application.Services.WebSocketTurnFinalizationService.ResolveTranscriptAsync(TurnContext turn, CloudSession session, CancellationToken cancellationToken) in /home/jake-dubin/JiboExperiments/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Application/Services/WebSocketTurnFinalizationService.cs:line 219",
|
||||
"message": "Error during STT processing"
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"exception": "System.InvalidOperationException: whisper.cpp returned no transcript for the buffered audio turn.\n at Jibo.Cloud.Infrastructure.Audio.LocalWhisperCppBufferedAudioSttStrategy.TranscribeAsync(TurnContext turn, CancellationToken cancellationToken) in /home/jake-dubin/JiboExperiments/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/Audio/LocalWhisperCppBufferedAudioSttStrategy.cs:line 58\n at Jibo.Cloud.Application.Services.WebSocketTurnFinalizationService.ResolveTranscriptAsync(TurnContext turn, CloudSession session, CancellationToken cancellationToken) in /home/jake-dubin/JiboExperiments/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Application/Services/WebSocketTurnFinalizationService.cs:line 242",
|
||||
"message": "Error during STT processing"
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"exception": "System.InvalidOperationException: External process \u0027/usr/bin/ffmpeg\u0027 failed with exit code 187: ffmpeg version 6.1.1-3ubuntu5\u002Besm7 Copyright (c) 2000-2023 the FFmpeg developers\n built with gcc 13 (Ubuntu 13.3.0-6ubuntu2~24.04)\n configuration: --prefix=/usr --extra-version=3ubuntu5\u002Besm7 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --disable-omx --enable-gnutls --enable-libaom --enable-libass --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libglslang --enable-libgme --enable-libgsm --enable-libharfbuzz --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-openal --enable-opencl --enable-opengl --disable-sndio --enable-libvpl --disable-libmfx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-ladspa --enable-libbluray --enable-libjack --enable-libpulse --enable-librabbitmq --enable-librist --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libx264 --enable-libzmq --enable-libzvbi --enable-lv2 --enable-sdl2 --enable-libplacebo --enable-librav1e --enable-pocketsphinx --enable-librsvg --enable-libjxl --enable-shared\n libavutil 58. 29.100 / 58. 29.100\n libavcodec 60. 31.102 / 60. 31.102\n libavformat 60. 16.100 / 60. 16.100\n libavdevice 60. 3.100 / 60. 3.100\n libavfilter 9. 12.100 / 9. 12.100\n libswscale 7. 5.100 / 7. 5.100\n libswresample 4. 12.100 / 4. 12.100\n libpostproc 57. 3.100 / 57. 3.100\n[ogg @ 0x5d01666aaec0] Codec not found\n[in#0 @ 0x5d01666aadc0] Error opening input: End of file\nError opening input file /tmp/openjibo-stt/turn-3982e2cda6124a3cb01b848ba11678cd.ogg.\nError opening input files: End of file\n\n at Jibo.Cloud.Infrastructure.Audio.ExternalProcessRunner.RunAsync(String fileName, IReadOnlyList\u00601 arguments, CancellationToken cancellationToken) in /home/jake-dubin/JiboExperiments/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/Audio/ExternalProcessRunner.cs:line 35\n at Jibo.Cloud.Infrastructure.Audio.LocalWhisperCppBufferedAudioSttStrategy.TranscribeAsync(TurnContext turn, CancellationToken cancellationToken) in /home/jake-dubin/JiboExperiments/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/Audio/LocalWhisperCppBufferedAudioSttStrategy.cs:line 45\n at Jibo.Cloud.Application.Services.WebSocketTurnFinalizationService.ResolveTranscriptAsync(TurnContext turn, CloudSession session, CancellationToken cancellationToken) in /home/jake-dubin/JiboExperiments/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Application/Services/WebSocketTurnFinalizationService.cs:line 226",
|
||||
"message": "Error during STT processing"
|
||||
}
|
||||
{
|
||||
"exception": "System.InvalidOperationException: External process \u0027/usr/bin/ffmpeg\u0027 failed with exit code 187: ffmpeg version 6.1.1-3ubuntu5\u002Besm7 Copyright (c) 2000-2023 the FFmpeg developers\n built with gcc 13 (Ubuntu 13.3.0-6ubuntu2~24.04)\n configuration: --prefix=/usr --extra-version=3ubuntu5\u002Besm7 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --disable-omx --enable-gnutls --enable-libaom --enable-libass --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libglslang --enable-libgme --enable-libgsm --enable-libharfbuzz --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-openal --enable-opencl --enable-opengl --disable-sndio --enable-libvpl --disable-libmfx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-ladspa --enable-libbluray --enable-libjack --enable-libpulse --enable-librabbitmq --enable-librist --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libx264 --enable-libzmq --enable-libzvbi --enable-lv2 --enable-sdl2 --enable-libplacebo --enable-librav1e --enable-pocketsphinx --enable-librsvg --enable-libjxl --enable-shared\n libavutil 58. 29.100 / 58. 29.100\n libavcodec 60. 31.102 / 60. 31.102\n libavformat 60. 16.100 / 60. 16.100\n libavdevice 60. 3.100 / 60. 3.100\n libavfilter 9. 12.100 / 9. 12.100\n libswscale 7. 5.100 / 7. 5.100\n libswresample 4. 12.100 / 4. 12.100\n libpostproc 57. 3.100 / 57. 3.100\n[ogg @ 0x55706380bec0] Codec not found\n[in#0 @ 0x55706380bdc0] Error opening input: End of file\nError opening input file /tmp/openjibo-stt/turn-c160a3d8c93b41b48344b51e4bf50ea3.ogg.\nError opening input files: End of file\n\n at Jibo.Cloud.Infrastructure.Audio.ExternalProcessRunner.RunAsync(String fileName, IReadOnlyList\u00601 arguments, CancellationToken cancellationToken) in /home/jake-dubin/JiboExperiments/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/Audio/ExternalProcessRunner.cs:line 35\n at Jibo.Cloud.Infrastructure.Audio.LocalWhisperCppBufferedAudioSttStrategy.TranscribeAsync(TurnContext turn, CancellationToken cancellationToken) in /home/jake-dubin/JiboExperiments/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/Audio/LocalWhisperCppBufferedAudioSttStrategy.cs:line 45\n at Jibo.Cloud.Application.Services.WebSocketTurnFinalizationService.ResolveTranscriptAsync(TurnContext turn, CloudSession session, CancellationToken cancellationToken) in /home/jake-dubin/JiboExperiments/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Application/Services/WebSocketTurnFinalizationService.cs:line 226",
|
||||
"message": "Error during STT processing"
|
||||
}
|
||||
{
|
||||
"exception": "System.InvalidOperationException: External process \u0027/usr/bin/ffmpeg\u0027 failed with exit code 187: ffmpeg version 6.1.1-3ubuntu5\u002Besm7 Copyright (c) 2000-2023 the FFmpeg developers\n built with gcc 13 (Ubuntu 13.3.0-6ubuntu2~24.04)\n configuration: --prefix=/usr --extra-version=3ubuntu5\u002Besm7 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --disable-omx --enable-gnutls --enable-libaom --enable-libass --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libglslang --enable-libgme --enable-libgsm --enable-libharfbuzz --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-openal --enable-opencl --enable-opengl --disable-sndio --enable-libvpl --disable-libmfx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-ladspa --enable-libbluray --enable-libjack --enable-libpulse --enable-librabbitmq --enable-librist --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libx264 --enable-libzmq --enable-libzvbi --enable-lv2 --enable-sdl2 --enable-libplacebo --enable-librav1e --enable-pocketsphinx --enable-librsvg --enable-libjxl --enable-shared\n libavutil 58. 29.100 / 58. 29.100\n libavcodec 60. 31.102 / 60. 31.102\n libavformat 60. 16.100 / 60. 16.100\n libavdevice 60. 3.100 / 60. 3.100\n libavfilter 9. 12.100 / 9. 12.100\n libswscale 7. 5.100 / 7. 5.100\n libswresample 4. 12.100 / 4. 12.100\n libpostproc 57. 3.100 / 57. 3.100\n[ogg @ 0x56a6ea456ec0] Codec not found\n[in#0 @ 0x56a6ea456dc0] Error opening input: End of file\nError opening input file /tmp/openjibo-stt/turn-9b3c0bd8da344f1f92732cf59c33bfca.ogg.\nError opening input files: End of file\n\n at Jibo.Cloud.Infrastructure.Audio.ExternalProcessRunner.RunAsync(String fileName, IReadOnlyList\u00601 arguments, CancellationToken cancellationToken) in /home/jake-dubin/JiboExperiments/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/Audio/ExternalProcessRunner.cs:line 35\n at Jibo.Cloud.Infrastructure.Audio.LocalWhisperCppBufferedAudioSttStrategy.TranscribeAsync(TurnContext turn, CancellationToken cancellationToken) in /home/jake-dubin/JiboExperiments/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/Audio/LocalWhisperCppBufferedAudioSttStrategy.cs:line 45\n at Jibo.Cloud.Application.Services.WebSocketTurnFinalizationService.ResolveTranscriptAsync(TurnContext turn, CloudSession session, CancellationToken cancellationToken) in /home/jake-dubin/JiboExperiments/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Application/Services/WebSocketTurnFinalizationService.cs:line 226",
|
||||
"message": "Error during STT processing"
|
||||
}
|
||||
{
|
||||
"exception": "System.InvalidOperationException: External process \u0027/usr/bin/ffmpeg\u0027 failed with exit code 187: ffmpeg version 6.1.1-3ubuntu5\u002Besm7 Copyright (c) 2000-2023 the FFmpeg developers\n built with gcc 13 (Ubuntu 13.3.0-6ubuntu2~24.04)\n configuration: --prefix=/usr --extra-version=3ubuntu5\u002Besm7 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --disable-omx --enable-gnutls --enable-libaom --enable-libass --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libglslang --enable-libgme --enable-libgsm --enable-libharfbuzz --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-openal --enable-opencl --enable-opengl --disable-sndio --enable-libvpl --disable-libmfx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-ladspa --enable-libbluray --enable-libjack --enable-libpulse --enable-librabbitmq --enable-librist --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libx264 --enable-libzmq --enable-libzvbi --enable-lv2 --enable-sdl2 --enable-libplacebo --enable-librav1e --enable-pocketsphinx --enable-librsvg --enable-libjxl --enable-shared\n libavutil 58. 29.100 / 58. 29.100\n libavcodec 60. 31.102 / 60. 31.102\n libavformat 60. 16.100 / 60. 16.100\n libavdevice 60. 3.100 / 60. 3.100\n libavfilter 9. 12.100 / 9. 12.100\n libswscale 7. 5.100 / 7. 5.100\n libswresample 4. 12.100 / 4. 12.100\n libpostproc 57. 3.100 / 57. 3.100\n[ogg @ 0x55daa6a51ec0] Codec not found\n[in#0 @ 0x55daa6a51dc0] Error opening input: End of file\nError opening input file /tmp/openjibo-stt/turn-f48d6333cb3e42e09d4b84a343eb1eda.ogg.\nError opening input files: End of file\n\n at Jibo.Cloud.Infrastructure.Audio.ExternalProcessRunner.RunAsync(String fileName, IReadOnlyList\u00601 arguments, CancellationToken cancellationToken) in /home/jake-dubin/JiboExperiments/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/Audio/ExternalProcessRunner.cs:line 35\n at Jibo.Cloud.Infrastructure.Audio.LocalWhisperCppBufferedAudioSttStrategy.TranscribeAsync(TurnContext turn, CancellationToken cancellationToken) in /home/jake-dubin/JiboExperiments/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/Audio/LocalWhisperCppBufferedAudioSttStrategy.cs:line 45\n at Jibo.Cloud.Application.Services.WebSocketTurnFinalizationService.ResolveTranscriptAsync(TurnContext turn, CloudSession session, CancellationToken cancellationToken) in /home/jake-dubin/JiboExperiments/OpenJibo/src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Application/Services/WebSocketTurnFinalizationService.cs:line 226",
|
||||
"message": "Error during STT processing"
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,127 @@
|
||||
{
|
||||
"name": "neohubjibocom-neohublisten-tid52b6f46e3b6a11f191515cf821ea55ae",
|
||||
"session": {
|
||||
"hostName": "neo-hub.jibo.com",
|
||||
"path": "/v1/listen",
|
||||
"kind": "neo-hub-listen",
|
||||
"token": "hub-usr_openjibo_owner-1776545569192"
|
||||
},
|
||||
"steps": [
|
||||
{
|
||||
"text": {
|
||||
"type": "LISTEN",
|
||||
"ts": 1776546327052,
|
||||
"msgID": "mid-5303b5f6-3b6a-11f1-adc4-5cf821ea55ae",
|
||||
"transID": "tid-52b6f46e-3b6a-11f1-9151-5cf821ea55ae",
|
||||
"data": {
|
||||
"lang": "en-US",
|
||||
"hotphrase": true,
|
||||
"rules": [
|
||||
"launch",
|
||||
"globals/global_commands_launch"
|
||||
],
|
||||
"mode": "CLIENT_ASR",
|
||||
"asr": {
|
||||
"hints": [],
|
||||
"earlyEOS": [],
|
||||
"encoding": "OGG_OPUS",
|
||||
"sampleRate": 16000,
|
||||
"sosTimeout": 7000,
|
||||
"maxSpeechTimeout": 20000
|
||||
}
|
||||
}
|
||||
},
|
||||
"binary": null,
|
||||
"expectedReplyTypes": [
|
||||
"OPENJIBO_TURN_PENDING"
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": {
|
||||
"type": "CLIENT_ASR",
|
||||
"ts": 1776546327052,
|
||||
"msgID": "mid-5303bd76-3b6a-11f1-81d4-5cf821ea55ae",
|
||||
"transID": "tid-52b6f46e-3b6a-11f1-9151-5cf821ea55ae",
|
||||
"data": {
|
||||
"text": "tell me about the news"
|
||||
}
|
||||
},
|
||||
"binary": null,
|
||||
"expectedReplyTypes": [
|
||||
"LISTEN",
|
||||
"EOS",
|
||||
"SKILL_ACTION"
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": {
|
||||
"type": "CONTEXT",
|
||||
"ts": 1776546327177,
|
||||
"msgID": "mid-5316cf2e-3b6a-11f1-8aa7-5cf821ea55ae",
|
||||
"transID": "tid-52b6f46e-3b6a-11f1-9151-5cf821ea55ae",
|
||||
"data": {
|
||||
"runtime": {
|
||||
"character": {
|
||||
"emotion": {
|
||||
"name": "NEUTRAL",
|
||||
"valence": 0.45,
|
||||
"confidence": 0.2
|
||||
},
|
||||
"motivation": {
|
||||
"social": 1,
|
||||
"playful": 1
|
||||
}
|
||||
},
|
||||
"perception": {
|
||||
"speaker": null,
|
||||
"peoplePresent": []
|
||||
},
|
||||
"location": {
|
||||
"city": "Pleasant Hill",
|
||||
"state": "Missouri",
|
||||
"stateAbbr": "MO",
|
||||
"country": "United States",
|
||||
"countryCode": "US",
|
||||
"lat": 38.8358494,
|
||||
"lng": -94.1427229,
|
||||
"iso": "2026-04-18T16:05:27.073-05:00"
|
||||
},
|
||||
"loop": {
|
||||
"loopId": "5c0b221fdf9d450019c5e253",
|
||||
"users": [
|
||||
{
|
||||
"firstName": "Erin",
|
||||
"lastName": "Picone",
|
||||
"phoneticName": "Erin",
|
||||
"gender": "female",
|
||||
"birthdate": 649209600000,
|
||||
"id": "5c0b221fdf9d450019c5e255",
|
||||
"accountId": "5c0b20547c46170019235759"
|
||||
}
|
||||
],
|
||||
"jibo": {
|
||||
"color": "WHITE",
|
||||
"birthdate": 1544234645598,
|
||||
"id": "5c0b221fdf9d450019c5e254"
|
||||
},
|
||||
"owner": "5c0b221fdf9d450019c5e255"
|
||||
},
|
||||
"dialog": {
|
||||
"referent": null
|
||||
}
|
||||
},
|
||||
"skill": {
|
||||
"id": null
|
||||
},
|
||||
"general": {
|
||||
"release": "1.9.2"
|
||||
}
|
||||
}
|
||||
},
|
||||
"binary": null,
|
||||
"expectedReplyTypes": [
|
||||
"OPENJIBO_CONTEXT_ACK"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,174 @@
|
||||
{
|
||||
"name": "neohubjibocom-neohublisten-tida8165b823b9411f195545cf821ea55ae",
|
||||
"session": {
|
||||
"hostName": "neo-hub.jibo.com",
|
||||
"path": "/v1/listen",
|
||||
"kind": "neo-hub-listen",
|
||||
"token": "hub-usr_openjibo_owner-1776563295273"
|
||||
},
|
||||
"steps": [
|
||||
{
|
||||
"text": {
|
||||
"type": "LISTEN",
|
||||
"ts": 1776564508900,
|
||||
"msgID": "mid-a83d9076-3b94-11f1-978d-5cf821ea55ae",
|
||||
"transID": "tid-a8165b82-3b94-11f1-9554-5cf821ea55ae",
|
||||
"data": {
|
||||
"lang": "en-US",
|
||||
"hotphrase": true,
|
||||
"rules": [
|
||||
"launch",
|
||||
"globals/global_commands_launch"
|
||||
],
|
||||
"mode": "",
|
||||
"asr": {
|
||||
"hints": [],
|
||||
"earlyEOS": [],
|
||||
"encoding": "OGG_OPUS",
|
||||
"sampleRate": 16000,
|
||||
"sosTimeout": 7000,
|
||||
"maxSpeechTimeout": 20000
|
||||
}
|
||||
}
|
||||
},
|
||||
"binary": null,
|
||||
"expectedReplyTypes": [
|
||||
"LISTEN",
|
||||
"EOS",
|
||||
"SKILL_ACTION"
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": null,
|
||||
"binary": [
|
||||
79,
|
||||
103,
|
||||
103,
|
||||
83,
|
||||
0,
|
||||
2,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
62,
|
||||
200,
|
||||
6,
|
||||
48,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
146,
|
||||
142,
|
||||
146,
|
||||
101,
|
||||
1,
|
||||
19,
|
||||
79,
|
||||
112,
|
||||
117,
|
||||
115,
|
||||
72,
|
||||
101,
|
||||
97,
|
||||
100,
|
||||
1,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
128,
|
||||
62,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"expectedReplyTypes": [
|
||||
"OPENJIBO_AUDIO_RECEIVED"
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": {
|
||||
"type": "CONTEXT",
|
||||
"ts": 1776564510009,
|
||||
"msgID": "mid-a8e6d640-3b94-11f1-b2b0-5cf821ea55ae",
|
||||
"transID": "tid-a8165b82-3b94-11f1-9554-5cf821ea55ae",
|
||||
"data": {
|
||||
"runtime": {
|
||||
"character": {
|
||||
"emotion": {
|
||||
"name": "NEUTRAL",
|
||||
"valence": 0.45,
|
||||
"confidence": 0.2
|
||||
},
|
||||
"motivation": {
|
||||
"social": 1,
|
||||
"playful": 1
|
||||
}
|
||||
},
|
||||
"perception": {
|
||||
"speaker": null,
|
||||
"peoplePresent": [
|
||||
{
|
||||
"id": "NOT_TRAINED",
|
||||
"entityId": 1282,
|
||||
"type": "fused",
|
||||
"confidence": 0.25
|
||||
}
|
||||
]
|
||||
},
|
||||
"location": {
|
||||
"city": "Pleasant Hill",
|
||||
"state": "Missouri",
|
||||
"stateAbbr": "MO",
|
||||
"country": "United States",
|
||||
"countryCode": "US",
|
||||
"lat": 38.8358494,
|
||||
"lng": -94.1427229,
|
||||
"iso": "2026-04-18T21:08:29.921-05:00"
|
||||
},
|
||||
"loop": {
|
||||
"loopId": "5c0b221fdf9d450019c5e253",
|
||||
"users": [
|
||||
{
|
||||
"firstName": "Erin",
|
||||
"lastName": "Picone",
|
||||
"phoneticName": "Erin",
|
||||
"gender": "female",
|
||||
"birthdate": 649209600000,
|
||||
"id": "5c0b221fdf9d450019c5e255",
|
||||
"accountId": "5c0b20547c46170019235759"
|
||||
}
|
||||
],
|
||||
"jibo": {
|
||||
"color": "WHITE",
|
||||
"birthdate": 1544234645598,
|
||||
"id": "5c0b221fdf9d450019c5e254"
|
||||
},
|
||||
"owner": "5c0b221fdf9d450019c5e255"
|
||||
},
|
||||
"dialog": {
|
||||
"referent": null
|
||||
}
|
||||
},
|
||||
"skill": {
|
||||
"id": null
|
||||
},
|
||||
"general": {
|
||||
"release": "1.9.2"
|
||||
}
|
||||
}
|
||||
},
|
||||
"binary": null,
|
||||
"expectedReplyTypes": [
|
||||
"OPENJIBO_CONTEXT_ACK"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,95 @@
|
||||
{
|
||||
"name": "neohubjibocom-neohublisten-tidd2b591403b6811f1a5735cf821ea55ae",
|
||||
"session": {
|
||||
"hostName": "neo-hub.jibo.com",
|
||||
"path": "/v1/listen",
|
||||
"kind": "neo-hub-listen",
|
||||
"token": "hub-usr_openjibo_owner-1776545569192"
|
||||
},
|
||||
"steps": [
|
||||
{
|
||||
"text": {
|
||||
"type": "LISTEN",
|
||||
"ts": 1776545682509,
|
||||
"msgID": "mid-d2d657ea-3b68-11f1-985b-5cf821ea55ae",
|
||||
"transID": "tid-d2b59140-3b68-11f1-a573-5cf821ea55ae",
|
||||
"data": {
|
||||
"lang": "en-US",
|
||||
"hotphrase": true,
|
||||
"rules": [
|
||||
"launch",
|
||||
"globals/global_commands_launch"
|
||||
],
|
||||
"mode": "",
|
||||
"asr": {
|
||||
"hints": [],
|
||||
"earlyEOS": [],
|
||||
"encoding": "OGG_OPUS",
|
||||
"sampleRate": 16000,
|
||||
"sosTimeout": 7000,
|
||||
"maxSpeechTimeout": 20000
|
||||
}
|
||||
}
|
||||
},
|
||||
"binary": null,
|
||||
"expectedReplyTypes": [
|
||||
"OPENJIBO_TURN_PENDING"
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": null,
|
||||
"binary": [
|
||||
79,
|
||||
103,
|
||||
103,
|
||||
83,
|
||||
0,
|
||||
2,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
94,
|
||||
132,
|
||||
99,
|
||||
103,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
234,
|
||||
141,
|
||||
12,
|
||||
246,
|
||||
1,
|
||||
19,
|
||||
79,
|
||||
112,
|
||||
117,
|
||||
115,
|
||||
72,
|
||||
101,
|
||||
97,
|
||||
100,
|
||||
1,
|
||||
1,
|
||||
0,
|
||||
0,
|
||||
128,
|
||||
62,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0
|
||||
],
|
||||
"expectedReplyTypes": [
|
||||
"OPENJIBO_AUDIO_RECEIVED"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
3732
artifact-output/jibo-test-20/jibo test 20.txt
Normal file
3732
artifact-output/jibo-test-20/jibo test 20.txt
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user