Compare commits
No commits in common. "9257f4c7de1f1881cc3edb46315b0ec2762e32fb" and "12225329713f4cd73df0e9ec1c53c0649b238a50" have entirely different histories.
9257f4c7de
...
1222532971
@ -143,13 +143,9 @@ class SocialEnrollmentNode(Node):
|
|||||||
self.create_timer(0.5, self._enrollment_timeout_check)
|
self.create_timer(0.5, self._enrollment_timeout_check)
|
||||||
|
|
||||||
self.get_logger().info(
|
self.get_logger().info(
|
||||||
<<<<<<< HEAD
|
|
||||||
f'Social enrollment node initialized. '
|
f'Social enrollment node initialized. '
|
||||||
f'Queue: {self.queue_dir}, '
|
f'Queue: {self.queue_dir}, '
|
||||||
f'Speakers: {self.speaker_embeddings_path}'
|
f'Speakers: {self.speaker_embeddings_path}'
|
||||||
=======
|
|
||||||
f'Social enrollment node initialized. Queue: {self.queue_dir}'
|
|
||||||
>>>>>>> origin/sl-firmware/issue-400-encounter-enrollment
|
|
||||||
)
|
)
|
||||||
|
|
||||||
def _on_orchestrator_state(self, msg: String) -> None:
|
def _on_orchestrator_state(self, msg: String) -> None:
|
||||||
@ -170,12 +166,9 @@ class SocialEnrollmentNode(Node):
|
|||||||
context=context,
|
context=context,
|
||||||
timestamp=time.time()
|
timestamp=time.time()
|
||||||
)
|
)
|
||||||
<<<<<<< HEAD
|
|
||||||
self._face_embedding_timestamp = 0.0
|
self._face_embedding_timestamp = 0.0
|
||||||
self._voice_embedding_timestamp = 0.0
|
self._voice_embedding_timestamp = 0.0
|
||||||
self._image_timestamp = 0.0
|
self._image_timestamp = 0.0
|
||||||
=======
|
|
||||||
>>>>>>> origin/sl-firmware/issue-400-encounter-enrollment
|
|
||||||
|
|
||||||
self.get_logger().info(
|
self.get_logger().info(
|
||||||
f'Enrollment triggered: {name} (ID: {person_id})'
|
f'Enrollment triggered: {name} (ID: {person_id})'
|
||||||
@ -193,23 +186,16 @@ class SocialEnrollmentNode(Node):
|
|||||||
if self._enrollment_request is None:
|
if self._enrollment_request is None:
|
||||||
return
|
return
|
||||||
|
|
||||||
<<<<<<< HEAD
|
|
||||||
# Take first detected face embedding
|
# Take first detected face embedding
|
||||||
=======
|
|
||||||
>>>>>>> origin/sl-firmware/issue-400-encounter-enrollment
|
|
||||||
face_emb = msg.embeddings[0]
|
face_emb = msg.embeddings[0]
|
||||||
emb_array = np.frombuffer(face_emb.embedding, dtype=np.float32)
|
emb_array = np.frombuffer(face_emb.embedding, dtype=np.float32)
|
||||||
|
|
||||||
if len(emb_array) == self.face_emb_dim:
|
if len(emb_array) == self.face_emb_dim:
|
||||||
self._latest_face_embedding = emb_array.copy()
|
self._latest_face_embedding = emb_array.copy()
|
||||||
self._face_embedding_timestamp = time.time()
|
self._face_embedding_timestamp = time.time()
|
||||||
<<<<<<< HEAD
|
|
||||||
self.get_logger().debug(
|
self.get_logger().debug(
|
||||||
f'Face embedding captured: {face_emb.track_id}'
|
f'Face embedding captured: {face_emb.track_id}'
|
||||||
)
|
)
|
||||||
=======
|
|
||||||
self.get_logger().debug(f'Face embedding captured')
|
|
||||||
>>>>>>> origin/sl-firmware/issue-400-encounter-enrollment
|
|
||||||
|
|
||||||
def _on_speaker_embedding(self, msg: String) -> None:
|
def _on_speaker_embedding(self, msg: String) -> None:
|
||||||
"""Capture voice speaker embedding from ECAPA-TDNN."""
|
"""Capture voice speaker embedding from ECAPA-TDNN."""
|
||||||
@ -226,13 +212,9 @@ class SocialEnrollmentNode(Node):
|
|||||||
if len(emb_array) == self.voice_emb_dim:
|
if len(emb_array) == self.voice_emb_dim:
|
||||||
self._latest_voice_embedding = emb_array.copy()
|
self._latest_voice_embedding = emb_array.copy()
|
||||||
self._voice_embedding_timestamp = time.time()
|
self._voice_embedding_timestamp = time.time()
|
||||||
<<<<<<< HEAD
|
|
||||||
self.get_logger().debug(
|
self.get_logger().debug(
|
||||||
f'Voice embedding captured: {len(emb_array)} dims'
|
f'Voice embedding captured: {len(emb_array)} dims'
|
||||||
)
|
)
|
||||||
=======
|
|
||||||
self.get_logger().debug(f'Voice embedding captured')
|
|
||||||
>>>>>>> origin/sl-firmware/issue-400-encounter-enrollment
|
|
||||||
|
|
||||||
except json.JSONDecodeError as e:
|
except json.JSONDecodeError as e:
|
||||||
self.get_logger().error(f'Invalid speaker embedding JSON: {e}')
|
self.get_logger().error(f'Invalid speaker embedding JSON: {e}')
|
||||||
@ -244,10 +226,7 @@ class SocialEnrollmentNode(Node):
|
|||||||
if self._enrollment_request is None:
|
if self._enrollment_request is None:
|
||||||
return
|
return
|
||||||
|
|
||||||
<<<<<<< HEAD
|
|
||||||
# Store latest image
|
# Store latest image
|
||||||
=======
|
|
||||||
>>>>>>> origin/sl-firmware/issue-400-encounter-enrollment
|
|
||||||
self._latest_image = msg
|
self._latest_image = msg
|
||||||
self._image_timestamp = time.time()
|
self._image_timestamp = time.time()
|
||||||
|
|
||||||
@ -261,22 +240,15 @@ class SocialEnrollmentNode(Node):
|
|||||||
return
|
return
|
||||||
|
|
||||||
now = time.time()
|
now = time.time()
|
||||||
<<<<<<< HEAD
|
|
||||||
timeout = 10.0 # 10 seconds to collect embeddings
|
timeout = 10.0 # 10 seconds to collect embeddings
|
||||||
=======
|
|
||||||
timeout = 10.0
|
|
||||||
>>>>>>> origin/sl-firmware/issue-400-encounter-enrollment
|
|
||||||
|
|
||||||
# Check if all data collected
|
# Check if all data collected
|
||||||
has_face = self._latest_face_embedding is not None and \
|
has_face = self._latest_face_embedding is not None and \
|
||||||
(now - self._face_embedding_timestamp < 5.0)
|
(now - self._face_embedding_timestamp < 5.0)
|
||||||
has_voice = self._latest_voice_embedding is not None and \
|
has_voice = self._latest_voice_embedding is not None and \
|
||||||
(now - self._voice_embedding_timestamp < 5.0)
|
(now - self._voice_embedding_timestamp < 5.0)
|
||||||
<<<<<<< HEAD
|
|
||||||
has_image = self._latest_image is not None and \
|
has_image = self._latest_image is not None and \
|
||||||
(now - self._image_timestamp < 5.0)
|
(now - self._image_timestamp < 5.0)
|
||||||
=======
|
|
||||||
>>>>>>> origin/sl-firmware/issue-400-encounter-enrollment
|
|
||||||
|
|
||||||
# If we have face + voice, proceed with enrollment
|
# If we have face + voice, proceed with enrollment
|
||||||
if has_face and has_voice:
|
if has_face and has_voice:
|
||||||
@ -303,7 +275,6 @@ class SocialEnrollmentNode(Node):
|
|||||||
'context': request.context,
|
'context': request.context,
|
||||||
'timestamp': request.timestamp,
|
'timestamp': request.timestamp,
|
||||||
'datetime': datetime.fromtimestamp(request.timestamp).isoformat(),
|
'datetime': datetime.fromtimestamp(request.timestamp).isoformat(),
|
||||||
<<<<<<< HEAD
|
|
||||||
'face_embedding_shape': list(self._latest_face_embedding.shape)
|
'face_embedding_shape': list(self._latest_face_embedding.shape)
|
||||||
if self._latest_face_embedding is not None else None,
|
if self._latest_face_embedding is not None else None,
|
||||||
'voice_embedding_shape': list(self._latest_voice_embedding.shape)
|
'voice_embedding_shape': list(self._latest_voice_embedding.shape)
|
||||||
@ -311,10 +282,6 @@ class SocialEnrollmentNode(Node):
|
|||||||
}
|
}
|
||||||
|
|
||||||
# Save queue JSON
|
# Save queue JSON
|
||||||
=======
|
|
||||||
}
|
|
||||||
|
|
||||||
>>>>>>> origin/sl-firmware/issue-400-encounter-enrollment
|
|
||||||
queue_file = self.queue_dir / f"enrollment_{request.person_id}_{int(request.timestamp)}.json"
|
queue_file = self.queue_dir / f"enrollment_{request.person_id}_{int(request.timestamp)}.json"
|
||||||
with open(queue_file, 'w') as f:
|
with open(queue_file, 'w') as f:
|
||||||
json.dump(enroll_data, f, indent=2)
|
json.dump(enroll_data, f, indent=2)
|
||||||
@ -418,10 +385,7 @@ class SocialEnrollmentNode(Node):
|
|||||||
)
|
)
|
||||||
return
|
return
|
||||||
|
|
||||||
<<<<<<< HEAD
|
|
||||||
# Call EnrollPerson service
|
# Call EnrollPerson service
|
||||||
=======
|
|
||||||
>>>>>>> origin/sl-firmware/issue-400-encounter-enrollment
|
|
||||||
req = EnrollPerson.Request()
|
req = EnrollPerson.Request()
|
||||||
req.name = request.name
|
req.name = request.name
|
||||||
req.mode = 'face'
|
req.mode = 'face'
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user