From 1c687e33809dd9647c34d0c1436e61a6554468ab Mon Sep 17 00:00:00 2001
From: cai <cai@nbcai.cc>
Date: Sat, 08 Aug 2026 18:22:26 +0800
Subject: [PATCH] fix: refresh ASR ingress attributes per session
---
src/asr_realtime.rs | 18 ++++++++++++++++++
src/main.rs | 28 ++++++++++++++--------------
2 files changed, 32 insertions(+), 14 deletions(-)
diff --git a/src/asr_realtime.rs b/src/asr_realtime.rs
index 16d2fd3..9358d23 100644
--- a/src/asr_realtime.rs
+++ b/src/asr_realtime.rs
@@ -520,6 +520,24 @@
.expect("bound json");
assert_eq!("controlled_fixture", with_metadata["inputSourceCategory"]);
assert_eq!("fixture-01", with_metadata["clientFixtureSequence"]);
+ let next = AudioIngressMetadata {
+ input_source_category: "controlled_fixture".to_string(),
+ client_fixture_sequence: "fixture-02".to_string(),
+ };
+ let next_line = session_start_line(
+ "call-001",
+ "trace-001",
+ "turn-0002",
+ "nonce-001",
+ Some(&next),
+ )
+ .expect("next bound session line");
+ let next_value: serde_json::Value = serde_json::from_slice(&next_line).expect("next json");
+ assert_eq!("fixture-02", next_value["clientFixtureSequence"]);
+ assert_ne!(
+ with_metadata["clientFixtureSequence"],
+ next_value["clientFixtureSequence"]
+ );
}
#[test]
diff --git a/src/main.rs b/src/main.rs
index c3fa805..eed3859 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -30,7 +30,7 @@
options::TrackPublishOptions,
prelude::{
DataPacket, LocalAudioTrack, LocalTrack, ParticipantIdentity, RemoteAudioTrack,
- RemoteTrack, Room, RoomEvent, RoomOptions,
+ RemoteParticipant, RemoteTrack, Room, RoomEvent, RoomOptions,
},
};
use reqwest::Client;
@@ -780,16 +780,6 @@
"runtime helper ignored non-user audio participant");
continue;
}
- let ingress_metadata =
- match AudioIngressMetadata::from_participant(&participant.attributes()) {
- Ok(value) => value,
- Err(reason) => {
- warn!(call_id = %call_id, trace_id = %trace_id,
- metadata_status = "invalid", reason = reason,
- "runtime helper ignored invalid audio ingress metadata");
- None
- }
- };
let participant_alias = redact(&participant.identity().to_string());
let track_sid_alias = redact(&track.sid().to_string());
let track_name = track.name();
@@ -801,9 +791,6 @@
track_sid_alias = %track_sid_alias,
track_name = %track_name,
track_source = %track_source,
- metadata_status = if ingress_metadata.is_some() { "bound" } else { "absent" },
- metadata_source = ingress_metadata.as_ref().map(|_| "controlled_fixture"),
- metadata_sequence_present = ingress_metadata.is_some(),
"runtime helper user_track_subscribed"
);
spawn_user_audio_frame_observer(
@@ -818,6 +805,7 @@
turn_bridge_config.clone(),
http.clone(),
sink.clone(),
+ participant,
);
}
RoomEvent::TrackSubscribed {
@@ -2929,6 +2917,7 @@
turn_bridge_config: TurnBridgeConfig,
http: Client,
sink: Arc<BotAudioOutputSink>,
+ participant: RemoteParticipant,
) -> JoinHandle<()> {
tokio::spawn(async move {
let mut stream = NativeAudioStream::new(
@@ -3054,6 +3043,17 @@
if !was_in_speech && is_in_speech {
let turn_id = format!("turn-{:04}", vad.turn_index);
+ let ingress_metadata = match AudioIngressMetadata::from_participant(
+ &participant.attributes(),
+ ) {
+ Ok(value) => value,
+ Err(reason) => {
+ warn!(call_id = %call_id, trace_id = %trace_id,
+ turn_id = %turn_id, metadata_status = "invalid", reason = reason,
+ "runtime helper ignored invalid audio ingress metadata");
+ None
+ }
+ };
match RealtimeAsrUpload::start(
http.clone(),
turn_bridge_config.realtime_asr_config(),
--
Gitblit v1.9.3