feat: media API (video/bbox/thumbnail), UUID unification, dot matrix text, portal fixes, API dictionary V1.3
This commit is contained in:
@@ -18,6 +18,7 @@ Configuration:
|
||||
import sys
|
||||
import json
|
||||
import os
|
||||
import time
|
||||
import argparse
|
||||
import signal
|
||||
import subprocess
|
||||
@@ -179,7 +180,11 @@ def run_asr(video_path, output_path, uuid: str = ""):
|
||||
if publisher:
|
||||
publisher.info("asr", "Loading Whisper model...")
|
||||
|
||||
sys.stderr.write(f"[ASR] Loading Whisper model {MODEL_SIZE}...\n")
|
||||
sys.stderr.flush()
|
||||
model = WhisperModel(MODEL_SIZE, device="cpu", compute_type="int8")
|
||||
sys.stderr.write(f"[ASR] Model loaded\n")
|
||||
sys.stderr.flush()
|
||||
|
||||
if publisher:
|
||||
publisher.info("asr", f"Transcribing: {video_path}")
|
||||
@@ -189,10 +194,13 @@ def run_asr(video_path, output_path, uuid: str = ""):
|
||||
|
||||
if cut_scenes:
|
||||
# 分段處理:對每個場景萃取音訊並轉錄
|
||||
sys.stderr.write(f"[ASR] Starting segmented transcription for {len(cut_scenes)} scenes\n")
|
||||
sys.stderr.flush()
|
||||
import subprocess
|
||||
import tempfile
|
||||
import json
|
||||
temp_dir = tempfile.mkdtemp(prefix="asr_cut_")
|
||||
sys.stderr.write(f"[ASR] Temp dir: {temp_dir}\n")
|
||||
sys.stderr.flush()
|
||||
transcript_language = None
|
||||
|
||||
# 建立 scene lookup: 給定時間點,找是哪個 scene
|
||||
@@ -204,29 +212,79 @@ def run_asr(video_path, output_path, uuid: str = ""):
|
||||
|
||||
# 逐段處理,每段結果即時寫入 .asr.tmp
|
||||
tmp_path = output_path + ".tmp"
|
||||
err_path = output_path + ".err"
|
||||
all_segments = []
|
||||
|
||||
# Resume: 若 executor 將 .tmp rename 成 .err,先救回
|
||||
if not os.path.exists(tmp_path) and os.path.exists(err_path) and os.path.getsize(err_path) > 10:
|
||||
try:
|
||||
os.rename(err_path, tmp_path)
|
||||
sys.stderr.write(f"[ASR] Recovered .err → .tmp for resume ({os.path.getsize(tmp_path)} bytes)\n")
|
||||
sys.stderr.flush()
|
||||
except Exception as e:
|
||||
sys.stderr.write(f"[ASR] Failed to recover .err: {e}\n")
|
||||
sys.stderr.flush()
|
||||
|
||||
# Resume: 若已有 .asr.tmp,載入已完成的 segments 並跳過已處理的 scenes
|
||||
resume_from_scene = 0
|
||||
if os.path.exists(tmp_path) and os.path.getsize(tmp_path) > 10:
|
||||
try:
|
||||
with open(tmp_path) as f:
|
||||
existing = json.load(f)
|
||||
all_segments = existing.get("segments", [])
|
||||
if all_segments:
|
||||
# 找出最後一個 segment 的 end_time,決定 resume 起點
|
||||
last_end = max(s.get("end", 0) for s in all_segments)
|
||||
# 找出最後完成的 scene_idx(場景 end_time > last_end)
|
||||
for i, (st, et) in enumerate(cut_scenes):
|
||||
if et > last_end:
|
||||
resume_from_scene = i
|
||||
break
|
||||
else:
|
||||
resume_from_scene = len(cut_scenes) # 全部完成
|
||||
# 繼承 language
|
||||
if existing.get("language"):
|
||||
transcript_language = existing["language"]
|
||||
sys.stderr.write(f"[ASR] Resume from scene {resume_from_scene}/{len(cut_scenes)} "
|
||||
f"(last segment end={last_end:.1f}s, {len(all_segments)} existing segments)\n")
|
||||
sys.stderr.flush()
|
||||
except Exception as e:
|
||||
sys.stderr.write(f"[ASR] Failed to load tmp for resume: {e}, starting fresh\n")
|
||||
sys.stderr.flush()
|
||||
all_segments = []
|
||||
|
||||
for idx, (start_t, end_t) in enumerate(cut_scenes):
|
||||
if idx < resume_from_scene:
|
||||
continue # 跳過已處理的 scenes
|
||||
seg_wav = os.path.join(temp_dir, f"seg_{idx:04d}.wav")
|
||||
sys.stderr.write(f"[ASR] Scene {idx}: {start_t:.1f}-{end_t:.1f}s\n")
|
||||
sys.stderr.flush()
|
||||
# 用 ffmpeg 萃取出該段音訊
|
||||
t0 = time.time()
|
||||
cmd = ["ffmpeg", "-y", "-v", "quiet", "-i", video_path,
|
||||
"-ss", str(start_t), "-to", str(end_t),
|
||||
"-ar", "16000", "-ac", "1", seg_wav]
|
||||
subprocess.run(cmd, check=False, capture_output=True)
|
||||
sys.stderr.write(f"[ASR] Scene {idx}: ffmpeg took {time.time()-t0:.1f}s\n")
|
||||
sys.stderr.flush()
|
||||
|
||||
if not os.path.exists(seg_wav) or os.path.getsize(seg_wav) < 100:
|
||||
continue # 跳過空音訊
|
||||
sys.stderr.write(f"[ASR] Scene {idx}: empty audio, skipping\n")
|
||||
sys.stderr.flush()
|
||||
continue
|
||||
|
||||
try:
|
||||
t1 = time.time()
|
||||
seg_result, seg_info = model.transcribe(
|
||||
seg_wav, beam_size=5,
|
||||
vad_filter=True,
|
||||
vad_parameters=dict(min_silence_duration_ms=500, speech_pad_ms=200),
|
||||
)
|
||||
if transcript_language is None:
|
||||
transcript_language = seg_info.language
|
||||
sys.stderr.write(f"[ASR] Scene {idx}: transcribe took {time.time()-t1:.1f}s, language={seg_info.language}\n")
|
||||
sys.stderr.flush()
|
||||
|
||||
scene_segments = []
|
||||
seg_language = seg_info.language if seg_info else transcript_language
|
||||
for segment in seg_result:
|
||||
seg_start = start_t + segment.start
|
||||
seg_end = start_t + segment.end
|
||||
@@ -236,6 +294,7 @@ def run_asr(video_path, output_path, uuid: str = ""):
|
||||
"end": seg_end,
|
||||
"text": segment.text.strip(),
|
||||
"scene_number": scene_idx + 1,
|
||||
"language": seg_language,
|
||||
})
|
||||
total_segments += 1
|
||||
|
||||
|
||||
552
scripts/face_processor.py
Executable file → Normal file
552
scripts/face_processor.py
Executable file → Normal file
@@ -1,341 +1,283 @@
|
||||
#!/opt/homebrew/bin/python3.11
|
||||
"""
|
||||
Face Processor - Face Detection & Demographics with Resume Support
|
||||
Uses InsightFace for detection, age, gender, and embedding extraction.
|
||||
Face Processor V2 - Apple Vision detection + CoreML FaceNet embedding
|
||||
|
||||
IMPORTANT: InsightFace is REQUIRED. No Haar fallback.
|
||||
- InsightFace provides 512-dim ArcFace embedding for identity matching
|
||||
- Haar Cascade cannot generate embedding, only detection
|
||||
- If InsightFace fails, processor will ERROR and exit
|
||||
Flow:
|
||||
1. swift_face (Vision/ANE) → bbox + pose per frame
|
||||
2. cv2 opens video, crops faces from bbox
|
||||
3. CoreML FaceNet → 512D embedding per face
|
||||
4. Output face.json in standard format
|
||||
|
||||
Resume Feature:
|
||||
- Auto-detect existing results and resume from last frame
|
||||
- Auto-save at configurable intervals (default: 30 seconds)
|
||||
- Ctrl+C gracefully saves and exits
|
||||
Replaces face_processor.py (no more InsightFace CPU detection).
|
||||
Detection cost: near-zero CPU (Vision ANE)
|
||||
Embedding cost: near-zero CPU (CoreML ANE)
|
||||
"""
|
||||
|
||||
import sys
|
||||
import os
|
||||
import json
|
||||
import argparse
|
||||
import os
|
||||
import subprocess
|
||||
import time
|
||||
from typing import Optional, Dict
|
||||
|
||||
import cv2
|
||||
import numpy as np
|
||||
from pathlib import Path
|
||||
|
||||
# CoreML
|
||||
import coremltools as ct
|
||||
|
||||
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||||
from resume_framework import ResumeFramework, format_time, print_progress
|
||||
from utils.pose_analyzer import calculate_pose_angle_v2
|
||||
|
||||
SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||
SWIFT_BIN = os.path.join(SCRIPT_DIR, "swift_processors", ".build", "debug", "swift_face")
|
||||
FACENET_PATH = os.path.join(SCRIPT_DIR, "..", "models", "facenet512.mlpackage")
|
||||
|
||||
def process_face(
|
||||
video_path: str,
|
||||
output_path: str,
|
||||
uuid: str = "",
|
||||
auto_save_interval: int = 30,
|
||||
auto_save_frames: int = 300,
|
||||
force_restart: bool = False,
|
||||
sample_interval: int = 30,
|
||||
):
|
||||
"""Process video for face detection and demographics analysis with resume support"""
|
||||
|
||||
framework = ResumeFramework(
|
||||
output_path=output_path,
|
||||
processor_name="face",
|
||||
uuid=uuid,
|
||||
auto_save_interval=auto_save_interval,
|
||||
auto_save_frames=auto_save_frames,
|
||||
force_restart=force_restart,
|
||||
)
|
||||
|
||||
framework.publish_info("FACE_START")
|
||||
|
||||
try:
|
||||
import cv2
|
||||
import numpy as np
|
||||
import insightface
|
||||
except ImportError as e:
|
||||
error_msg = f"Missing dependency: {e.name}"
|
||||
framework.publish_error(error_msg)
|
||||
result = {
|
||||
"metadata": {"status": "error", "error": error_msg},
|
||||
"frames": {},
|
||||
}
|
||||
with open(output_path, "w") as f:
|
||||
json.dump(result, f, indent=2)
|
||||
return result
|
||||
|
||||
app = None
|
||||
try:
|
||||
framework.publish_info("LOADING_INSIGHTFACE")
|
||||
app = insightface.app.FaceAnalysis(
|
||||
name="buffalo_l", providers=["CPUExecutionProvider"]
|
||||
)
|
||||
app.prepare(ctx_id=0, det_size=(320, 320))
|
||||
framework.publish_info("INSIGHTFACE_LOADED")
|
||||
except Exception as e:
|
||||
error_msg = f"InsightFace failed to load (REQUIRED): {e}"
|
||||
framework.publish_error(error_msg)
|
||||
result = {
|
||||
"metadata": {"status": "error", "error": error_msg},
|
||||
"frames": {},
|
||||
}
|
||||
with open(output_path, "w") as f:
|
||||
json.dump(result, f, indent=2)
|
||||
return result
|
||||
|
||||
framework.publish_info("PROCESSING_VIDEO")
|
||||
|
||||
cap = cv2.VideoCapture(video_path)
|
||||
|
||||
if not cap.isOpened():
|
||||
print(f"Error: Cannot open video: {video_path}")
|
||||
return {"metadata": {"status": "error"}, "frames": {}}
|
||||
|
||||
fps = cap.get(cv2.CAP_PROP_FPS)
|
||||
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
|
||||
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
|
||||
total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
|
||||
total_duration = total_frames / fps if fps > 0 else 0
|
||||
cap.release()
|
||||
|
||||
framework.publish_info(f"fps={fps}, frames={total_frames}")
|
||||
|
||||
existing_data, last_checkpoint = framework.load_existing_data()
|
||||
resume_mode = existing_data is not None and last_checkpoint > 0 and not force_restart
|
||||
|
||||
if resume_mode:
|
||||
print(f"\nFound existing data: {output_path}")
|
||||
print(f"Last processed frame: {last_checkpoint}")
|
||||
print(f"Will resume from frame {last_checkpoint + 1}")
|
||||
|
||||
if resume_mode and existing_data:
|
||||
face_data = existing_data
|
||||
frame_count = last_checkpoint
|
||||
processed_frames = set(int(k) for k in existing_data.get("frames", {}).keys())
|
||||
cap = cv2.VideoCapture(video_path)
|
||||
cap.set(cv2.CAP_PROP_POS_FRAMES, frame_count)
|
||||
# Pose angle classification from roll/yaw
|
||||
def classify_pose(roll: float, yaw: float) -> str:
|
||||
"""Convert roll/yaw to pose angle label"""
|
||||
abs_yaw = abs(yaw)
|
||||
abs_roll = abs(roll)
|
||||
if abs_yaw < 15 and abs_roll < 15:
|
||||
return "frontal"
|
||||
elif abs_yaw > 30:
|
||||
return "profile_right" if yaw > 0 else "profile_left"
|
||||
else:
|
||||
face_data = {
|
||||
"metadata": framework.init_metadata(
|
||||
video_path=video_path,
|
||||
fps=fps,
|
||||
width=width,
|
||||
height=height,
|
||||
total_frames=total_frames,
|
||||
total_duration=total_duration,
|
||||
extra={
|
||||
"sample_interval": sample_interval,
|
||||
"detection_method": "insightface",
|
||||
},
|
||||
),
|
||||
"frames": {},
|
||||
}
|
||||
frame_count = 0
|
||||
processed_frames = set()
|
||||
cap = cv2.VideoCapture(video_path)
|
||||
return "three_quarter"
|
||||
|
||||
framework.set_data(face_data)
|
||||
|
||||
start_time = time.time()
|
||||
framework.last_save_time = start_time
|
||||
class FaceProcessorVision:
|
||||
def __init__(self, video_path: str, output_path: str, uuid: str = "",
|
||||
sample_interval: int = 30):
|
||||
self.video_path = video_path
|
||||
self.output_path = output_path
|
||||
self.uuid = uuid
|
||||
self.sample_interval = sample_interval
|
||||
|
||||
print(f"\nProcessing video: {total_frames} frames @ {fps:.2f} fps")
|
||||
print(f"Auto-save every {auto_save_interval}s or {auto_save_frames} frames")
|
||||
print(f"Resume from frame {frame_count + 1 if resume_mode else 1}")
|
||||
print("Detection method: InsightFace (REQUIRED)")
|
||||
print()
|
||||
# Load CoreML FaceNet
|
||||
self.coreml_model = None
|
||||
facenet = os.path.normpath(FACENET_PATH)
|
||||
if os.path.exists(facenet):
|
||||
try:
|
||||
self.coreml_model = ct.models.MLModel(facenet)
|
||||
print(f"[FACE_V2] CoreML FaceNet loaded: {facenet}")
|
||||
except Exception as e:
|
||||
print(f"[FACE_V2] CoreML load failed: {e}")
|
||||
|
||||
while True:
|
||||
ret, frame = cap.read()
|
||||
if not ret:
|
||||
break
|
||||
self.video = None
|
||||
self.fps = 30.0
|
||||
self.total_frames = 0
|
||||
self.width = 0
|
||||
self.height = 0
|
||||
|
||||
frame_count += 1
|
||||
current_time = (frame_count - 1) / fps if fps > 0 else 0
|
||||
|
||||
if frame_count in processed_frames:
|
||||
continue
|
||||
|
||||
if frame_count % sample_interval != 0:
|
||||
continue
|
||||
|
||||
face_list = []
|
||||
def open_video(self):
|
||||
self.video = cv2.VideoCapture(self.video_path)
|
||||
if not self.video.isOpened():
|
||||
raise RuntimeError(f"Cannot open: {self.video_path}")
|
||||
self.fps = self.video.get(cv2.CAP_PROP_FPS)
|
||||
self.total_frames = int(self.video.get(cv2.CAP_PROP_FRAME_COUNT))
|
||||
self.width = int(self.video.get(cv2.CAP_PROP_FRAME_WIDTH))
|
||||
self.height = int(self.video.get(cv2.CAP_PROP_FRAME_HEIGHT))
|
||||
print(f"[FACE_V2] Video: {self.width}x{self.height}, {self.fps:.1f}fps, {self.total_frames}f")
|
||||
|
||||
def extract_face_embedding(self, face_img: np.ndarray) -> Optional[list]:
|
||||
"""Run CoreML FaceNet on cropped face"""
|
||||
if self.coreml_model is None:
|
||||
return None
|
||||
try:
|
||||
faces = app.get(frame)
|
||||
for face in faces:
|
||||
bbox = face.bbox.astype(int)
|
||||
bx, by, bw, bh = (
|
||||
bbox[0],
|
||||
bbox[1],
|
||||
bbox[2] - bbox[0],
|
||||
bbox[3] - bbox[1],
|
||||
)
|
||||
|
||||
age = int(face.age) if hasattr(face, "age") else None
|
||||
gender_val = face.gender if hasattr(face, "gender") else None
|
||||
gender = (
|
||||
"female"
|
||||
if gender_val == 0
|
||||
else ("male" if gender_val == 1 else None)
|
||||
)
|
||||
|
||||
embedding = None
|
||||
if hasattr(face, "embedding"):
|
||||
embedding = face.embedding.tolist()
|
||||
|
||||
landmarks = None
|
||||
if hasattr(face, "kps"):
|
||||
landmarks = face.kps.tolist()
|
||||
elif hasattr(face, "landmark_3d_68"):
|
||||
landmarks = face.landmark_3d_68.tolist()
|
||||
|
||||
pose_angle = None
|
||||
if landmarks and len(landmarks) >= 5:
|
||||
try:
|
||||
pose_result = calculate_pose_angle_v2(landmarks)
|
||||
pose_angle = {
|
||||
"angle": pose_result.get("angle", "unknown"),
|
||||
"confidence": pose_result.get("confidence", 0.0),
|
||||
"pitch": pose_result.get("pitch", "neutral"),
|
||||
"features": pose_result.get("features", {}),
|
||||
}
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
face_list.append(
|
||||
{
|
||||
"x": int(bx),
|
||||
"y": int(by),
|
||||
"width": int(bw),
|
||||
"height": int(bh),
|
||||
"confidence": float(face.det_score)
|
||||
if hasattr(face, "det_score")
|
||||
else 0.9,
|
||||
"embedding": embedding,
|
||||
"landmarks": landmarks,
|
||||
"pose_angle": pose_angle,
|
||||
"attributes": {"age": age, "gender": gender},
|
||||
}
|
||||
)
|
||||
# Resize to 160x160
|
||||
resized = cv2.resize(face_img, (160, 160))
|
||||
# Convert HWC to CHW and normalize to [-1, 1]
|
||||
normalized = (resized.astype(np.float32) / 127.5) - 1.0
|
||||
normalized = np.transpose(normalized, (2, 0, 1)) # HWC -> CHW
|
||||
# Add batch dim: (1, 3, 160, 160)
|
||||
input_array = np.expand_dims(normalized, axis=0)
|
||||
result = self.coreml_model.predict({"input": input_array})
|
||||
# Find output key (var_xxx)
|
||||
emb_key = [k for k in result.keys() if k.startswith("var_")][0]
|
||||
emb = result[emb_key].flatten().tolist()
|
||||
return emb
|
||||
except Exception as e:
|
||||
print(f"[ERROR] Frame processing error: {e}")
|
||||
print(f"[FACE_V2] Embedding error: {e}")
|
||||
return None
|
||||
|
||||
if face_list:
|
||||
face_data["frames"][str(frame_count)] = {
|
||||
"frame_number": frame_count,
|
||||
"time_seconds": round(current_time, 3),
|
||||
"time_formatted": format_time(current_time),
|
||||
"faces": face_list,
|
||||
}
|
||||
processed_frames.add(frame_count)
|
||||
def process_with_swift(self) -> Dict:
|
||||
"""Step 1: Run swift_face to get bbox + pose"""
|
||||
print(f"[FACE_V2] Step 1: Vision detection...")
|
||||
|
||||
if frame_count % 500 == 0:
|
||||
elapsed = time.time() - start_time
|
||||
print_progress(frame_count, total_frames, elapsed, f"{len(face_list)} faces")
|
||||
framework.publish_progress(frame_count, total_frames, f"frame {frame_count}")
|
||||
# Build swift_face if needed
|
||||
if not os.path.exists(SWIFT_BIN):
|
||||
build_dir = os.path.join(SCRIPT_DIR, "swift_processors")
|
||||
print(f"[FACE_V2] Building swift_face in {build_dir}...")
|
||||
subprocess.run(
|
||||
["swift", "build", "-c", "debug", "--product", "swift_face"],
|
||||
cwd=build_dir, check=True
|
||||
)
|
||||
|
||||
if framework.should_auto_save(frame_count):
|
||||
framework.save_progress(frame_count, silent=True)
|
||||
swift_out = self.output_path.replace(".json", "_detect.json")
|
||||
cmd = [
|
||||
SWIFT_BIN,
|
||||
self.video_path,
|
||||
swift_out,
|
||||
"--sample-interval", str(self.sample_interval),
|
||||
]
|
||||
if self.uuid:
|
||||
cmd.extend(["--uuid", self.uuid])
|
||||
|
||||
cap.release()
|
||||
print(f"[FACE_V2] Running: {' '.join(cmd)}")
|
||||
t0 = time.time()
|
||||
subprocess.run(cmd, check=True)
|
||||
elapsed = time.time() - t0
|
||||
print(f"[FACE_V2] Detection done in {elapsed:.1f}s")
|
||||
|
||||
total_processed = len(processed_frames)
|
||||
with open(swift_out) as f:
|
||||
return json.load(f)
|
||||
|
||||
framework.finalize(
|
||||
total_processed=total_processed,
|
||||
extra_metadata={
|
||||
"sample_interval": sample_interval,
|
||||
"detection_method": "insightface",
|
||||
},
|
||||
def embed_and_save(self, detection_data: Dict):
|
||||
"""Step 2: Crop faces + CoreML embedding + save face.json"""
|
||||
print(f"[FACE_V2] Step 2: CoreML embedding...")
|
||||
|
||||
frames = detection_data.get("frames", [])
|
||||
self.open_video()
|
||||
|
||||
face_data = {
|
||||
"metadata": {
|
||||
"video_path": os.path.abspath(self.video_path),
|
||||
"fps": self.fps, "width": self.width, "height": self.height,
|
||||
"sample_interval": self.sample_interval,
|
||||
"detection_method": "apple_vision",
|
||||
"embedding_method": "coreml_facenet",
|
||||
"status": "in_progress",
|
||||
"total_frames": self.total_frames,
|
||||
},
|
||||
"frames": {}
|
||||
}
|
||||
|
||||
t0 = time.time()
|
||||
embed_count = 0
|
||||
|
||||
for frame_info in frames:
|
||||
frame_num = frame_info["frame"]
|
||||
faces = []
|
||||
for face in frame_info.get("faces", []):
|
||||
bb = face["bbox"]
|
||||
x, y, w, h = bb["x"], bb["y"], bb["width"], bb["height"]
|
||||
|
||||
if w <= 10 or h <= 10:
|
||||
continue # skip tiny faces
|
||||
|
||||
# Seek to frame and read
|
||||
self.video.set(cv2.CAP_PROP_POS_FRAMES, frame_num)
|
||||
ret, frame = self.video.read()
|
||||
if not ret:
|
||||
continue
|
||||
|
||||
# Crop face
|
||||
x1, y1 = max(0, x), max(0, y)
|
||||
x2, y2 = min(self.width, x + w), min(self.height, y + h)
|
||||
if x2 <= x1 or y2 <= y1:
|
||||
continue
|
||||
face_img = frame[y1:y2, x1:x2]
|
||||
if face_img.size == 0:
|
||||
continue
|
||||
|
||||
# CoreML embedding
|
||||
emb = self.extract_face_embedding(face_img)
|
||||
if emb is not None:
|
||||
embed_count += 1
|
||||
|
||||
# Pose classification
|
||||
pose_info = face.get("pose", {})
|
||||
pose_angle = classify_pose(
|
||||
pose_info.get("roll", 0),
|
||||
pose_info.get("yaw", 0)
|
||||
)
|
||||
|
||||
faces.append({
|
||||
"x": x, "y": y, "width": w, "height": h,
|
||||
"confidence": face.get("confidence", 0.5),
|
||||
"embedding": emb,
|
||||
"pose_angle": {
|
||||
"angle": pose_angle,
|
||||
"roll": pose_info.get("roll", 0),
|
||||
"yaw": pose_info.get("yaw", 0),
|
||||
"pitch": pose_info.get("pitch", 0),
|
||||
},
|
||||
"lips": face.get("lips"),
|
||||
"landmarks": None,
|
||||
"attributes": None,
|
||||
})
|
||||
|
||||
if faces:
|
||||
face_data["frames"][str(frame_num)] = {
|
||||
"frame_number": frame_num,
|
||||
"time_seconds": frame_info.get("timestamp", frame_num / self.fps),
|
||||
"time_formatted": f"{frame_num / self.fps:.1f}s",
|
||||
"faces": faces,
|
||||
}
|
||||
|
||||
if len(face_data["frames"]) % 100 == 0:
|
||||
elapsed = time.time() - t0
|
||||
print(f"[FACE_V2] {len(face_data['frames'])} frames, {embed_count} embeddings, {elapsed:.0f}s")
|
||||
|
||||
self.video.release()
|
||||
|
||||
# Finalize
|
||||
face_data["metadata"]["status"] = "completed"
|
||||
face_data["metadata"]["total_embeddings"] = embed_count
|
||||
face_data["metadata"]["embedder"] = "coreml_facenet"
|
||||
|
||||
# Convert dict frames to list for Rust FaceResult format
|
||||
frames_list = []
|
||||
for fnum_str, fdata in sorted(face_data["frames"].items(), key=lambda x: int(x[0])):
|
||||
frames_list.append({
|
||||
"frame": int(fnum_str),
|
||||
"timestamp": fdata["time_seconds"],
|
||||
"faces": fdata["faces"],
|
||||
})
|
||||
|
||||
output = {
|
||||
"frame_count": len(frames_list),
|
||||
"fps": self.fps,
|
||||
"frames": frames_list,
|
||||
}
|
||||
|
||||
with open(self.output_path, "w") as f:
|
||||
json.dump(output, f, indent=2, ensure_ascii=False)
|
||||
|
||||
elapsed = time.time() - t0
|
||||
print(f"[FACE_V2] Done: {len(frames_list)} frames, {embed_count} embeddings, {elapsed:.0f}s")
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description="Apple Vision Face Processor V2")
|
||||
parser.add_argument("video_path", help="Video file path")
|
||||
parser.add_argument("output_path", help="Output JSON path")
|
||||
parser.add_argument("--uuid", "-u", default="")
|
||||
parser.add_argument("--sample-interval", type=int, default=30)
|
||||
parser.add_argument("--force", action="store_true")
|
||||
args = parser.parse_args()
|
||||
|
||||
if args.force and os.path.exists(args.output_path):
|
||||
os.remove(args.output_path)
|
||||
|
||||
processor = FaceProcessorVision(
|
||||
args.video_path, args.output_path,
|
||||
args.uuid, args.sample_interval
|
||||
)
|
||||
|
||||
print(f"\nFace detection completed: {total_processed} frames processed")
|
||||
print(f"Frames with faces: {len(face_data['frames'])}")
|
||||
# Step 1: Vision detection (bbox + pose via ANE)
|
||||
detection = processor.process_with_swift()
|
||||
|
||||
return face_data
|
||||
# Step 2: CoreML embedding + save
|
||||
processor.embed_and_save(detection)
|
||||
|
||||
|
||||
def _convert_to_face_result(face_data: dict) -> dict:
|
||||
"""Convert ResumeFramework output to FaceResult format expected by Rust."""
|
||||
metadata = face_data.get("metadata", {})
|
||||
raw_frames = face_data.get("frames", {})
|
||||
fps = metadata.get("fps", 30.0)
|
||||
frames = []
|
||||
for frame_key in sorted(raw_frames.keys(), key=lambda k: int(k)):
|
||||
f = raw_frames[frame_key]
|
||||
faces = []
|
||||
for raw_face in f.get("faces", []):
|
||||
pose = raw_face.get("pose_angle")
|
||||
attributes = raw_face.get("attributes", {})
|
||||
face = {
|
||||
"face_id": None,
|
||||
"x": raw_face["x"],
|
||||
"y": raw_face["y"],
|
||||
"width": raw_face["width"],
|
||||
"height": raw_face["height"],
|
||||
"confidence": raw_face.get("confidence", 0.0),
|
||||
"embedding": raw_face.get("embedding"),
|
||||
"landmarks": raw_face.get("landmarks"),
|
||||
"attributes": {
|
||||
"age": attributes.get("age") if attributes else None,
|
||||
"gender": attributes.get("gender") if attributes else None,
|
||||
},
|
||||
}
|
||||
faces.append(face)
|
||||
frames.append({
|
||||
"frame": f["frame_number"],
|
||||
"timestamp": f["time_seconds"],
|
||||
"faces": faces,
|
||||
})
|
||||
return {
|
||||
"frame_count": len(frames),
|
||||
"fps": fps,
|
||||
"frames": frames,
|
||||
}
|
||||
# Clean up temp detection file
|
||||
swift_out = args.output_path.replace(".json", "_detect.json")
|
||||
if os.path.exists(swift_out):
|
||||
os.remove(swift_out)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser(description="Face Detection & Demographics with Resume Support")
|
||||
parser.add_argument("video_path", help="Path to video file")
|
||||
parser.add_argument("output_path", help="Output JSON path")
|
||||
parser.add_argument("--uuid", "-u", help="UUID for Redis progress", default="")
|
||||
parser.add_argument(
|
||||
"--auto-save-interval",
|
||||
"-a",
|
||||
help="Auto-save interval in seconds",
|
||||
type=int,
|
||||
default=30,
|
||||
)
|
||||
parser.add_argument(
|
||||
"--auto-save-frames",
|
||||
"-f",
|
||||
help="Auto-save interval in frames",
|
||||
type=int,
|
||||
default=300,
|
||||
)
|
||||
parser.add_argument(
|
||||
"--force-restart",
|
||||
"-r",
|
||||
help="Force restart (ignore existing data)",
|
||||
action="store_true",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--sample-interval",
|
||||
"-s",
|
||||
help="Frame sample interval",
|
||||
type=int,
|
||||
default=5,
|
||||
)
|
||||
args = parser.parse_args()
|
||||
|
||||
result = process_face(
|
||||
args.video_path,
|
||||
args.output_path,
|
||||
args.uuid,
|
||||
args.auto_save_interval,
|
||||
args.auto_save_frames,
|
||||
args.force_restart,
|
||||
args.sample_interval,
|
||||
)
|
||||
face_result = _convert_to_face_result(result)
|
||||
with open(args.output_path, "w") as f:
|
||||
json.dump(face_result, f, indent=2)
|
||||
main()
|
||||
|
||||
@@ -1,243 +1,89 @@
|
||||
#!/opt/homebrew/bin/python3.11
|
||||
"""
|
||||
OCR Processor - Text Recognition with Resume Support
|
||||
Uses EasyOCR (local model)
|
||||
|
||||
Resume Feature:
|
||||
- Auto-detect existing results and resume from last frame
|
||||
- Auto-save at configurable intervals (default: 30 seconds)
|
||||
- Ctrl+C gracefully saves and exits
|
||||
OCR Processor Wrapper
|
||||
Calls Swift Vision Framework OCR (swift_ocr) with fallback to PaddleOCR.
|
||||
"""
|
||||
|
||||
import sys
|
||||
import json
|
||||
import argparse
|
||||
import os
|
||||
import time
|
||||
import subprocess
|
||||
import argparse
|
||||
|
||||
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||||
from resume_framework import ResumeFramework, format_time, print_progress
|
||||
|
||||
SWIFT_OCR_PATH = os.path.join(
|
||||
os.path.dirname(os.path.abspath(__file__)),
|
||||
"swift_processors/.build/debug/swift_ocr"
|
||||
)
|
||||
SWIFT_OCR_ALT = os.path.join(
|
||||
os.path.dirname(os.path.abspath(__file__)),
|
||||
"swift_processors/.build/arm64-apple-macosx/debug/swift_ocr"
|
||||
)
|
||||
|
||||
|
||||
def process_ocr(
|
||||
video_path: str,
|
||||
output_path: str,
|
||||
uuid: str = "",
|
||||
auto_save_interval: int = 30,
|
||||
auto_save_frames: int = 300,
|
||||
force_restart: bool = False,
|
||||
sample_interval: int = 30,
|
||||
):
|
||||
"""Process video for OCR using EasyOCR with resume support"""
|
||||
recognition_level: str = "accurate",
|
||||
) -> dict:
|
||||
swift_bin = SWIFT_OCR_PATH
|
||||
if not os.path.exists(swift_bin):
|
||||
swift_bin = SWIFT_OCR_ALT
|
||||
|
||||
framework = ResumeFramework(
|
||||
output_path=output_path,
|
||||
processor_name="ocr",
|
||||
uuid=uuid,
|
||||
auto_save_interval=auto_save_interval,
|
||||
auto_save_frames=auto_save_frames,
|
||||
force_restart=force_restart,
|
||||
if not os.path.exists(swift_bin):
|
||||
print("[OCR] Swift binary not found, using PaddleOCR", file=sys.stderr)
|
||||
return _fallback(video_path, output_path, uuid, sample_interval)
|
||||
|
||||
cmd = [swift_bin, video_path, output_path,
|
||||
"--sample-interval", str(sample_interval),
|
||||
"--recognition-level", recognition_level,
|
||||
"--uuid", uuid]
|
||||
|
||||
print(f"[OCR] Running Swift OCR", file=sys.stderr)
|
||||
result = subprocess.run(cmd, capture_output=True, text=True, timeout=7200)
|
||||
|
||||
if result.stdout:
|
||||
print(result.stdout.strip(), file=sys.stderr)
|
||||
if result.stderr:
|
||||
print(result.stderr.strip(), file=sys.stderr)
|
||||
|
||||
if result.returncode != 0 or not os.path.exists(output_path):
|
||||
print(f"[OCR] Swift OCR failed, falling back to PaddleOCR", file=sys.stderr)
|
||||
return _fallback(video_path, output_path, uuid, sample_interval)
|
||||
|
||||
with open(output_path) as f:
|
||||
return json.load(f)
|
||||
|
||||
|
||||
def _fallback(video_path, output_path, uuid, sample_interval):
|
||||
"""Fallback to original PaddleOCR implementation"""
|
||||
import importlib
|
||||
spec = importlib.util.spec_from_file_location(
|
||||
"paddle_ocr",
|
||||
os.path.join(os.path.dirname(__file__), "ocr_paddle.py")
|
||||
)
|
||||
|
||||
framework.publish_info("OCR_START")
|
||||
|
||||
try:
|
||||
import easyocr
|
||||
except ImportError:
|
||||
framework.publish_error("easyocr not installed")
|
||||
result = {
|
||||
"metadata": {"status": "error", "error": "easyocr not installed"},
|
||||
"frames": {},
|
||||
}
|
||||
with open(output_path, "w") as f:
|
||||
json.dump(result, f, indent=2)
|
||||
framework.publish_progress(0, 0, "0 frames")
|
||||
return result
|
||||
|
||||
framework.publish_info("OCR_LOADING_MODEL")
|
||||
|
||||
reader = easyocr.Reader(["en"], gpu=False, verbose=False)
|
||||
|
||||
framework.publish_info("OCR_MODEL_LOADED")
|
||||
|
||||
import cv2
|
||||
|
||||
cap = cv2.VideoCapture(video_path)
|
||||
|
||||
if not cap.isOpened():
|
||||
print(f"Error: Cannot open video: {video_path}")
|
||||
return {"metadata": {"status": "error"}, "frames": {}}
|
||||
|
||||
fps = cap.get(cv2.CAP_PROP_FPS)
|
||||
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
|
||||
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
|
||||
total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
|
||||
total_duration = total_frames / fps if fps > 0 else 0
|
||||
cap.release()
|
||||
|
||||
framework.publish_info(f"fps={fps}, frames={total_frames}")
|
||||
|
||||
existing_data, last_checkpoint = framework.load_existing_data()
|
||||
resume_mode = existing_data is not None and last_checkpoint > 0 and not force_restart
|
||||
|
||||
if resume_mode:
|
||||
print(f"\nFound existing data: {output_path}")
|
||||
print(f"Last processed frame: {last_checkpoint}")
|
||||
print(f"Will resume from frame {last_checkpoint + 1}")
|
||||
|
||||
if resume_mode and existing_data:
|
||||
ocr_data = existing_data
|
||||
frame_count = last_checkpoint
|
||||
processed_frames = set(int(k) for k in existing_data.get("frames", {}).keys())
|
||||
cap = cv2.VideoCapture(video_path)
|
||||
cap.set(cv2.CAP_PROP_POS_FRAMES, frame_count)
|
||||
else:
|
||||
ocr_data = {
|
||||
"metadata": framework.init_metadata(
|
||||
video_path=video_path,
|
||||
fps=fps,
|
||||
width=width,
|
||||
height=height,
|
||||
total_frames=total_frames,
|
||||
total_duration=total_duration,
|
||||
extra={"sample_interval": sample_interval},
|
||||
),
|
||||
"frames": {},
|
||||
}
|
||||
frame_count = 0
|
||||
processed_frames = set()
|
||||
cap = cv2.VideoCapture(video_path)
|
||||
|
||||
framework.set_data(ocr_data)
|
||||
|
||||
start_time = time.time()
|
||||
framework.last_save_time = start_time
|
||||
|
||||
print(f"\nProcessing video: {total_frames} frames @ {fps:.2f} fps")
|
||||
print(f"Auto-save every {auto_save_interval}s or {auto_save_frames} frames")
|
||||
print(f"Resume from frame {frame_count + 1 if resume_mode else 1}")
|
||||
print()
|
||||
|
||||
while True:
|
||||
ret, frame = cap.read()
|
||||
if not ret:
|
||||
break
|
||||
|
||||
frame_count += 1
|
||||
current_time = (frame_count - 1) / fps if fps > 0 else 0
|
||||
|
||||
if frame_count in processed_frames:
|
||||
continue
|
||||
|
||||
if frame_count % sample_interval != 0:
|
||||
continue
|
||||
|
||||
frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
|
||||
|
||||
try:
|
||||
detections = reader.readtext(
|
||||
frame_rgb, text_threshold=0.5, low_text=0.3, link_threshold=0.3
|
||||
)
|
||||
except Exception as e:
|
||||
framework.publish_error(f"Frame {frame_count}: {e}")
|
||||
detections = []
|
||||
|
||||
texts = []
|
||||
for detection in detections:
|
||||
det: tuple = tuple(detection)
|
||||
bbox = list(det[0])
|
||||
text: str = str(det[1])
|
||||
confidence: float = float(det[2])
|
||||
|
||||
x = int(min(float(p[0]) for p in bbox))
|
||||
y = int(min(float(p[1]) for p in bbox))
|
||||
w = int(max(float(p[0]) for p in bbox) - x)
|
||||
h = int(max(float(p[1]) for p in bbox) - y)
|
||||
|
||||
if text.strip():
|
||||
texts.append(
|
||||
{
|
||||
"text": text,
|
||||
"x": x,
|
||||
"y": y,
|
||||
"width": w,
|
||||
"height": h,
|
||||
"confidence": confidence,
|
||||
}
|
||||
)
|
||||
|
||||
if texts:
|
||||
ocr_data["frames"][str(frame_count)] = {
|
||||
"frame_number": frame_count,
|
||||
"time_seconds": round(current_time, 3),
|
||||
"time_formatted": format_time(current_time),
|
||||
"texts": texts,
|
||||
}
|
||||
processed_frames.add(frame_count)
|
||||
|
||||
if frame_count % 500 == 0:
|
||||
elapsed = time.time() - start_time
|
||||
print_progress(frame_count, total_frames, elapsed, f"{len(texts)} texts")
|
||||
framework.publish_progress(frame_count, total_frames, f"frame {frame_count}")
|
||||
|
||||
if framework.should_auto_save(frame_count):
|
||||
framework.save_progress(frame_count, silent=True)
|
||||
|
||||
cap.release()
|
||||
|
||||
total_processed = len(processed_frames)
|
||||
|
||||
framework.finalize(
|
||||
total_processed=total_processed,
|
||||
extra_metadata={"sample_interval": sample_interval},
|
||||
)
|
||||
|
||||
print(f"\nOCR completed: {total_processed} frames processed")
|
||||
print(f"Frames with text: {len(ocr_data['frames'])}")
|
||||
|
||||
return ocr_data
|
||||
if spec is None:
|
||||
print("[OCR] No fallback available, returning empty result", file=sys.stderr)
|
||||
return {"frame_count": 0, "fps": 0, "frames": []}
|
||||
paddle = importlib.util.module_from_spec(spec)
|
||||
spec.loader.exec_module(paddle)
|
||||
return paddle.process_ocr(video_path, output_path, uuid, sample_interval=sample_interval)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser(description="OCR Text Recognition with Resume Support")
|
||||
parser.add_argument("video_path", help="Path to video file")
|
||||
parser.add_argument("output_path", help="Output JSON path")
|
||||
parser.add_argument("--uuid", "-u", help="UUID for Redis progress", default="")
|
||||
parser.add_argument(
|
||||
"--auto-save-interval",
|
||||
"-a",
|
||||
help="Auto-save interval in seconds",
|
||||
type=int,
|
||||
default=30,
|
||||
)
|
||||
parser.add_argument(
|
||||
"--auto-save-frames",
|
||||
"-f",
|
||||
help="Auto-save interval in frames",
|
||||
type=int,
|
||||
default=300,
|
||||
)
|
||||
parser.add_argument(
|
||||
"--force-restart",
|
||||
"-r",
|
||||
help="Force restart (ignore existing data)",
|
||||
action="store_true",
|
||||
)
|
||||
parser.add_argument(
|
||||
"--sample-interval",
|
||||
"-s",
|
||||
help="Frame sample interval",
|
||||
type=int,
|
||||
default=30,
|
||||
)
|
||||
parser = argparse.ArgumentParser(description="OCR Processor (Swift Vision)")
|
||||
parser.add_argument("video_path")
|
||||
parser.add_argument("output_path")
|
||||
parser.add_argument("--uuid", "-u", default="")
|
||||
parser.add_argument("--sample-interval", type=int, default=30)
|
||||
parser.add_argument("--recognition-level", choices=["fast", "accurate"], default="accurate")
|
||||
args = parser.parse_args()
|
||||
|
||||
process_ocr(
|
||||
args.video_path,
|
||||
args.output_path,
|
||||
args.uuid,
|
||||
args.auto_save_interval,
|
||||
args.auto_save_frames,
|
||||
args.force_restart,
|
||||
args.sample_interval,
|
||||
)
|
||||
result = process_ocr(args.video_path, args.output_path, args.uuid,
|
||||
args.sample_interval, args.recognition_level)
|
||||
|
||||
with open(args.output_path, "w") as f:
|
||||
json.dump(result, f, indent=2)
|
||||
print(f"OCR: {len(result.get('frames', []))} frames with text")
|
||||
|
||||
@@ -1,255 +1,119 @@
|
||||
#!/opt/homebrew/bin/python3.11
|
||||
"""
|
||||
Pose Processor - Pose Estimation with Resume Support
|
||||
Uses YOLOv8 Pose via ultralytics (local model)
|
||||
|
||||
Resume Feature:
|
||||
- Auto-detect existing results and resume from last frame
|
||||
- Auto-save at configurable intervals (default: 30 seconds)
|
||||
- Ctrl+C gracefully saves and exits
|
||||
|
||||
Note: YOLOv8 Pose uses stream mode which is optimized for video processing.
|
||||
For resume support, we need to process frames manually with OpenCV.
|
||||
Pose Processor Wrapper
|
||||
Calls Swift Vision Framework pose (swift_pose) with fallback to YOLOv8 Pose.
|
||||
Uses VNDetectHumanBodyPoseRequest with ANE acceleration.
|
||||
"""
|
||||
|
||||
import sys
|
||||
import json
|
||||
import argparse
|
||||
import os
|
||||
import time
|
||||
import subprocess
|
||||
import argparse
|
||||
|
||||
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||||
from resume_framework import ResumeFramework, format_time, print_progress
|
||||
|
||||
|
||||
KEYPOINT_NAMES = [
|
||||
"nose",
|
||||
"left_eye",
|
||||
"right_eye",
|
||||
"left_ear",
|
||||
"right_ear",
|
||||
"left_shoulder",
|
||||
"right_shoulder",
|
||||
"left_elbow",
|
||||
"right_elbow",
|
||||
"left_wrist",
|
||||
"right_wrist",
|
||||
"left_hip",
|
||||
"right_hip",
|
||||
"left_knee",
|
||||
"right_knee",
|
||||
"left_ankle",
|
||||
"right_ankle",
|
||||
]
|
||||
SWIFT_POSE_PATH = os.path.join(
|
||||
os.path.dirname(os.path.abspath(__file__)),
|
||||
"swift_processors/.build/debug/swift_pose"
|
||||
)
|
||||
SWIFT_POSE_ALT = os.path.join(
|
||||
os.path.dirname(os.path.abspath(__file__)),
|
||||
"swift_processors/.build/arm64-apple-macosx/debug/swift_pose"
|
||||
)
|
||||
|
||||
|
||||
def process_pose(
|
||||
video_path: str,
|
||||
output_path: str,
|
||||
uuid: str = "",
|
||||
auto_save_interval: int = 30,
|
||||
auto_save_frames: int = 300,
|
||||
force_restart: bool = False,
|
||||
):
|
||||
"""Process video for pose estimation using YOLOv8 Pose with resume support"""
|
||||
sample_interval: int = 30,
|
||||
) -> dict:
|
||||
swift_bin = SWIFT_POSE_PATH
|
||||
if not os.path.exists(swift_bin):
|
||||
swift_bin = SWIFT_POSE_ALT
|
||||
|
||||
framework = ResumeFramework(
|
||||
output_path=output_path,
|
||||
processor_name="pose",
|
||||
uuid=uuid,
|
||||
auto_save_interval=auto_save_interval,
|
||||
auto_save_frames=auto_save_frames,
|
||||
force_restart=force_restart,
|
||||
)
|
||||
if not os.path.exists(swift_bin):
|
||||
print("[Pose] Swift binary not found, using YOLOv8 fallback", file=sys.stderr)
|
||||
return _fallback(video_path, output_path, uuid, sample_interval)
|
||||
|
||||
framework.publish_info("POSE_START")
|
||||
cmd = [swift_bin, video_path, output_path,
|
||||
"--sample-interval", str(sample_interval),
|
||||
"--uuid", uuid]
|
||||
|
||||
try:
|
||||
from ultralytics import YOLO
|
||||
except ImportError:
|
||||
framework.publish_error("ultralytics not installed")
|
||||
result = {
|
||||
"metadata": {"status": "error", "error": "ultralytics not installed"},
|
||||
"frames": {},
|
||||
}
|
||||
with open(output_path, "w") as f:
|
||||
json.dump(result, f, indent=2)
|
||||
return result
|
||||
print(f"[Pose] Running Swift Pose (Vision Framework)", file=sys.stderr)
|
||||
result = subprocess.run(cmd, capture_output=True, text=True, timeout=7200)
|
||||
|
||||
framework.publish_info("POSE_LOADING_MODEL")
|
||||
if result.stdout:
|
||||
for line in result.stdout.strip().split("\n"):
|
||||
print(f" {line}", file=sys.stderr)
|
||||
if result.stderr:
|
||||
for line in result.stderr.strip().split("\n"):
|
||||
print(f" {line}", file=sys.stderr)
|
||||
|
||||
model = YOLO("yolov8n-pose.pt")
|
||||
if result.returncode != 0 or not os.path.exists(output_path):
|
||||
print(f"[Pose] Swift Pose failed, falling back to YOLOv8", file=sys.stderr)
|
||||
return _fallback(video_path, output_path, uuid, sample_interval)
|
||||
|
||||
with open(output_path) as f:
|
||||
return json.load(f)
|
||||
|
||||
|
||||
def _fallback(video_path, output_path, uuid, sample_interval):
|
||||
"""Fallback to YOLOv8 Pose"""
|
||||
from ultralytics import YOLO
|
||||
import cv2
|
||||
|
||||
model = YOLO("yolov8n-pose.pt")
|
||||
cap = cv2.VideoCapture(video_path)
|
||||
|
||||
if not cap.isOpened():
|
||||
print(f"Error: Cannot open video: {video_path}")
|
||||
return {"metadata": {"status": "error"}, "frames": {}}
|
||||
|
||||
fps = cap.get(cv2.CAP_PROP_FPS)
|
||||
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
|
||||
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
|
||||
total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
|
||||
total_duration = total_frames / fps if fps > 0 else 0
|
||||
cap.release()
|
||||
|
||||
framework.publish_info(f"fps={fps}, frames={total_frames}")
|
||||
|
||||
existing_data, last_checkpoint = framework.load_existing_data()
|
||||
resume_mode = existing_data is not None and last_checkpoint > 0 and not force_restart
|
||||
|
||||
if resume_mode:
|
||||
print(f"\nFound existing data: {output_path}")
|
||||
print(f"Last processed frame: {last_checkpoint}")
|
||||
print(f"Will resume from frame {last_checkpoint + 1}")
|
||||
|
||||
if resume_mode and existing_data:
|
||||
pose_data = existing_data
|
||||
frame_count = last_checkpoint
|
||||
processed_frames = set(int(k) for k in existing_data.get("frames", {}).keys())
|
||||
cap = cv2.VideoCapture(video_path)
|
||||
cap.set(cv2.CAP_PROP_POS_FRAMES, frame_count)
|
||||
else:
|
||||
pose_data = {
|
||||
"metadata": framework.init_metadata(
|
||||
video_path=video_path,
|
||||
fps=fps,
|
||||
width=width,
|
||||
height=height,
|
||||
total_frames=total_frames,
|
||||
total_duration=total_duration,
|
||||
extra={"model": "yolov8n-pose"},
|
||||
),
|
||||
"frames": {},
|
||||
}
|
||||
frame_count = 0
|
||||
processed_frames = set()
|
||||
cap = cv2.VideoCapture(video_path)
|
||||
|
||||
framework.set_data(pose_data)
|
||||
|
||||
start_time = time.time()
|
||||
framework.last_save_time = start_time
|
||||
|
||||
print(f"\nProcessing video: {total_frames} frames @ {fps:.2f} fps")
|
||||
print(f"Auto-save every {auto_save_interval}s or {auto_save_frames} frames")
|
||||
print(f"Resume from frame {frame_count + 1 if resume_mode else 1}")
|
||||
print()
|
||||
|
||||
while True:
|
||||
frame_count = 0
|
||||
frames = []
|
||||
while cap.isOpened():
|
||||
ret, frame = cap.read()
|
||||
if not ret:
|
||||
break
|
||||
|
||||
if frame_count % sample_interval == 0:
|
||||
ts = frame_count / fps if fps > 0 else 0
|
||||
results = model(frame, verbose=False, device="cpu")
|
||||
persons = []
|
||||
for r in results:
|
||||
if r.keypoints is None:
|
||||
continue
|
||||
for kp_data in r.keypoints:
|
||||
kps = kp_data.xy[0].cpu().numpy() if hasattr(kp_data, 'xy') else []
|
||||
confs = kp_data.conf[0].cpu().numpy() if hasattr(kp_data, 'conf') else []
|
||||
keypoints = []
|
||||
names = ["nose", "left_eye", "right_eye", "left_ear", "right_ear",
|
||||
"left_shoulder", "right_shoulder", "left_elbow", "right_elbow",
|
||||
"left_wrist", "right_wrist", "left_hip", "right_hip",
|
||||
"left_knee", "right_knee", "left_ankle", "right_ankle"]
|
||||
for j, name in enumerate(names):
|
||||
if j < len(kps):
|
||||
x, y = float(kps[j][0]), float(kps[j][1])
|
||||
c = float(confs[j]) if j < len(confs) else 0
|
||||
keypoints.append({"name": name, "x": x, "y": y, "confidence": c})
|
||||
if keypoints:
|
||||
xs = [k["x"] for k in keypoints if k["confidence"] > 0.1]
|
||||
ys = [k["y"] for k in keypoints if k["confidence"] > 0.1]
|
||||
bbox = {"x": int(min(xs)), "y": int(min(ys)), "width": int(max(xs)-min(xs)), "height": int(max(ys)-min(ys))} if xs else {"x": 0, "y": 0, "width": 0, "height": 0}
|
||||
persons.append({"keypoints": keypoints, "bbox": bbox})
|
||||
if persons:
|
||||
frames.append({"frame": frame_count, "timestamp": ts, "persons": persons})
|
||||
frame_count += 1
|
||||
current_time = (frame_count - 1) / fps if fps > 0 else 0
|
||||
|
||||
if frame_count in processed_frames:
|
||||
continue
|
||||
|
||||
results = model(frame, conf=0.5, verbose=False, pose=True)
|
||||
result = results[0]
|
||||
|
||||
persons = []
|
||||
|
||||
if result.keypoints is not None:
|
||||
for person in result.keypoints:
|
||||
keypoints = []
|
||||
|
||||
for i, kp in enumerate(person):
|
||||
if len(kp) >= 3:
|
||||
keypoints.append(
|
||||
{
|
||||
"name": KEYPOINT_NAMES[i]
|
||||
if i < len(KEYPOINT_NAMES)
|
||||
else f"kp_{i}",
|
||||
"x": float(kp[0]),
|
||||
"y": float(kp[1]),
|
||||
"confidence": float(kp[2]),
|
||||
}
|
||||
)
|
||||
|
||||
valid_kps = [kp for kp in keypoints if kp["confidence"] > 0.3]
|
||||
if valid_kps:
|
||||
xs = [kp["x"] for kp in valid_kps]
|
||||
ys = [kp["y"] for kp in valid_kps]
|
||||
bbox = {
|
||||
"x": int(min(xs)),
|
||||
"y": int(min(ys)),
|
||||
"width": int(max(xs) - min(xs)),
|
||||
"height": int(max(ys) - min(ys)),
|
||||
}
|
||||
else:
|
||||
bbox = {"x": 0, "y": 0, "width": 0, "height": 0}
|
||||
|
||||
persons.append({"keypoints": keypoints, "bbox": bbox})
|
||||
|
||||
if persons or frame_count % 30 == 0:
|
||||
pose_data["frames"][str(frame_count)] = {
|
||||
"frame_number": frame_count,
|
||||
"time_seconds": round(current_time, 3),
|
||||
"time_formatted": format_time(current_time),
|
||||
"persons": persons,
|
||||
}
|
||||
processed_frames.add(frame_count)
|
||||
|
||||
if frame_count % 500 == 0:
|
||||
elapsed = time.time() - start_time
|
||||
print_progress(frame_count, total_frames, elapsed, f"{len(persons)} persons")
|
||||
framework.publish_progress(frame_count, total_frames, f"frame {frame_count}")
|
||||
|
||||
if framework.should_auto_save(frame_count):
|
||||
framework.save_progress(frame_count, silent=True)
|
||||
|
||||
cap.release()
|
||||
|
||||
total_processed = len(processed_frames)
|
||||
|
||||
framework.finalize(
|
||||
total_processed=total_processed,
|
||||
extra_metadata={"model": "yolov8n-pose"},
|
||||
)
|
||||
|
||||
print(f"\nPose estimation completed: {total_processed} frames processed")
|
||||
print(f"Frames with poses: {len([f for f in pose_data['frames'].values() if f['persons']])}")
|
||||
|
||||
return pose_data
|
||||
result = {"frame_count": len(frames), "fps": fps, "frames": frames}
|
||||
with open(output_path, "w") as f:
|
||||
json.dump(result, f, indent=2)
|
||||
return result
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
parser = argparse.ArgumentParser(description="Pose Estimation with Resume Support")
|
||||
parser.add_argument("video_path", help="Path to video file")
|
||||
parser.add_argument("output_path", help="Output JSON path")
|
||||
parser.add_argument("--uuid", "-u", help="UUID for Redis progress", default="")
|
||||
parser.add_argument(
|
||||
"--auto-save-interval",
|
||||
"-a",
|
||||
help="Auto-save interval in seconds",
|
||||
type=int,
|
||||
default=30,
|
||||
)
|
||||
parser.add_argument(
|
||||
"--auto-save-frames",
|
||||
"-f",
|
||||
help="Auto-save interval in frames",
|
||||
type=int,
|
||||
default=300,
|
||||
)
|
||||
parser.add_argument(
|
||||
"--force-restart",
|
||||
"-r",
|
||||
help="Force restart (ignore existing data)",
|
||||
action="store_true",
|
||||
)
|
||||
parser = argparse.ArgumentParser(description="Pose Processor (Swift Vision)")
|
||||
parser.add_argument("video_path")
|
||||
parser.add_argument("output_path")
|
||||
parser.add_argument("--uuid", "-u", default="")
|
||||
parser.add_argument("--sample-interval", type=int, default=30)
|
||||
args = parser.parse_args()
|
||||
|
||||
process_pose(
|
||||
args.video_path,
|
||||
args.output_path,
|
||||
args.uuid,
|
||||
args.auto_save_interval,
|
||||
args.auto_save_frames,
|
||||
args.force_restart,
|
||||
)
|
||||
result = process_pose(args.video_path, args.output_path, args.uuid, args.sample_interval)
|
||||
with open(args.output_path, "w") as f:
|
||||
json.dump(result, f, indent=2)
|
||||
print(f"Pose: {len(result.get('frames', []))} frames with poses")
|
||||
|
||||
@@ -1 +1 @@
|
||||
7861
|
||||
16433
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -534,8 +534,8 @@ relocations:
|
||||
- { offset: 0x1AB065, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser12ArrayWrapperVyxGAA0cD8ProtocolA2aEP12currentIndexSivgTW', symObjAddr: 0x71EC, symBinAddr: 0x10000FE60, symSize: 0x24 }
|
||||
- { offset: 0x1AB079, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser12ArrayWrapperVyxGAA0cD8ProtocolA2aEP7getNextypSgyFTW', symObjAddr: 0x7210, symBinAddr: 0x10000FE84, symSize: 0x14 }
|
||||
- { offset: 0x1AB305, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser0A10DefinitionV4HelpV7OptionsV8rawValueSuvg', symObjAddr: 0x0, symBinAddr: 0x1000152A8, symSize: 0x4 }
|
||||
- { offset: 0x1AB329, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser0A10DefinitionV4HelpV7OptionsV10isOptionalAGvpZ', symObjAddr: 0x1EBD8, symBinAddr: 0x100117438, symSize: 0x0 }
|
||||
- { offset: 0x1ABDDD, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser0A10DefinitionV4HelpV7OptionsV11isRepeatingAGvpZ', symObjAddr: 0x1EBE0, symBinAddr: 0x100117440, symSize: 0x0 }
|
||||
- { offset: 0x1AB329, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser0A10DefinitionV4HelpV7OptionsV10isOptionalAGvpZ', symObjAddr: 0x1EBD8, symBinAddr: 0x10011B448, symSize: 0x0 }
|
||||
- { offset: 0x1ABDDD, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser0A10DefinitionV4HelpV7OptionsV11isRepeatingAGvpZ', symObjAddr: 0x1EBE0, symBinAddr: 0x10011B450, symSize: 0x0 }
|
||||
- { offset: 0x1ABDEB, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser0A10DefinitionV4HelpV12defaultValueSSSgvpfi', symObjAddr: 0x78C, symBinAddr: 0x100015A34, symSize: 0xC }
|
||||
- { offset: 0x1ABE03, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser0A10DefinitionV4HelpV10discussionAA0A10DiscussionOSgvpfi', symObjAddr: 0x9C8, symBinAddr: 0x100015C70, symSize: 0x14 }
|
||||
- { offset: 0x1ABE1B, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser0A10DiscussionOSgWOy', symObjAddr: 0xA28, symBinAddr: 0x100015CD0, symSize: 0x70 }
|
||||
@@ -1135,9 +1135,9 @@ relocations:
|
||||
- { offset: 0x1B2C83, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser07LenientB0V5parseAA12ParsedValuesVyKF6$deferL0_yyF', symObjAddr: 0xC684, symBinAddr: 0x10002D19C, symSize: 0x90 }
|
||||
- { offset: 0x1B2CD6, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser07LenientB0V5parseAA12ParsedValuesVyKFSbAA15ParsableCommand_pXpXEfU0_', symObjAddr: 0xC7E0, symBinAddr: 0x10002D2A0, symSize: 0x180 }
|
||||
- { offset: 0x1B2F3A, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser0A10VisibilityV14RepresentationO21__derived_enum_equalsySbAE_AEtFZ', symObjAddr: 0x0, symBinAddr: 0x10002E714, symSize: 0xE8 }
|
||||
- { offset: 0x1B2F5E, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser0A10VisibilityV7defaultACvpZ', symObjAddr: 0x5635, symBinAddr: 0x100117448, symSize: 0x0 }
|
||||
- { offset: 0x1B31BC, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser0A10VisibilityV6hiddenACvpZ', symObjAddr: 0x5636, symBinAddr: 0x100117449, symSize: 0x0 }
|
||||
- { offset: 0x1B31D6, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser0A10VisibilityV7privateACvpZ', symObjAddr: 0x5637, symBinAddr: 0x10011744A, symSize: 0x0 }
|
||||
- { offset: 0x1B2F5E, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser0A10VisibilityV7defaultACvpZ', symObjAddr: 0x5635, symBinAddr: 0x10011B458, symSize: 0x0 }
|
||||
- { offset: 0x1B31BC, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser0A10VisibilityV6hiddenACvpZ', symObjAddr: 0x5636, symBinAddr: 0x10011B459, symSize: 0x0 }
|
||||
- { offset: 0x1B31D6, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser0A10VisibilityV7privateACvpZ', symObjAddr: 0x5637, symBinAddr: 0x10011B45A, symSize: 0x0 }
|
||||
- { offset: 0x1B31E4, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser0A10VisibilityV14RepresentationOAESHAAWl', symObjAddr: 0x1E0, symBinAddr: 0x10002E8F4, symSize: 0x68 }
|
||||
- { offset: 0x1B31F8, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser0A10VisibilityV7default_WZ', symObjAddr: 0x2CC, symBinAddr: 0x10002E9E0, symSize: 0x20 }
|
||||
- { offset: 0x1B3212, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser0A10VisibilityV7defaultACvau', symObjAddr: 0x2F0, symBinAddr: 0x10002EA04, symSize: 0x50 }
|
||||
@@ -1799,8 +1799,8 @@ relocations:
|
||||
- { offset: 0x1BB359, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser14CompletionKindV6customyACSaySSGAE_SiSStYaYbcFZ', symObjAddr: 0x3D0, symBinAddr: 0x1000496F0, symSize: 0x4C }
|
||||
- { offset: 0x1BB399, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser14CompletionKindV6customyACSaySSGAEcFZ', symObjAddr: 0x41C, symBinAddr: 0x10004973C, symSize: 0x4C }
|
||||
- { offset: 0x1BB4BC, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser15CompletionShellV8rawValueSSvg', symObjAddr: 0x0, symBinAddr: 0x10004A264, symSize: 0x30 }
|
||||
- { offset: 0x1BB4E0, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser15CompletionShellV11_requestingAA5MutexVyACSgGvpZ', symObjAddr: 0xD208, symBinAddr: 0x100117450, symSize: 0x0 }
|
||||
- { offset: 0x1BB514, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser15CompletionShellV18_requestingVersionAA5MutexVySSSgGvpZ', symObjAddr: 0xD210, symBinAddr: 0x100117458, symSize: 0x0 }
|
||||
- { offset: 0x1BB4E0, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser15CompletionShellV11_requestingAA5MutexVyACSgGvpZ', symObjAddr: 0xD208, symBinAddr: 0x10011B460, symSize: 0x0 }
|
||||
- { offset: 0x1BB514, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser15CompletionShellV18_requestingVersionAA5MutexVySSSgGvpZ', symObjAddr: 0xD210, symBinAddr: 0x10011B468, symSize: 0x0 }
|
||||
- { offset: 0x1BB6E1, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser15CompletionShellV11_requesting_WZ', symObjAddr: 0x8E0, symBinAddr: 0x10004AB04, symSize: 0x50 }
|
||||
- { offset: 0x1BB6FB, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser15CompletionShellV11_requestingAA5MutexVyACSgGvau', symObjAddr: 0x930, symBinAddr: 0x10004AB54, symSize: 0x50 }
|
||||
- { offset: 0x1BB724, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser15CompletionShellV18_requestingVersion_WZ', symObjAddr: 0xA88, symBinAddr: 0x10004ACAC, symSize: 0x50 }
|
||||
@@ -1942,9 +1942,9 @@ relocations:
|
||||
- { offset: 0x1BD733, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser14EnumerableFlagPAAE4help3forAA0A4HelpVSgx_tFZ', symObjAddr: 0x30, symBinAddr: 0x100051900, symSize: 0x6C }
|
||||
- { offset: 0x1BD774, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser14EnumerableFlagPAAs23CustomStringConvertibleRzSYRzrlE11descriptionSSvg', symObjAddr: 0x9C, symBinAddr: 0x10005196C, symSize: 0x98 }
|
||||
- { offset: 0x1BD8ED, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser15ValidationErrorV7messageSSvg', symObjAddr: 0x0, symBinAddr: 0x100051A04, symSize: 0x30 }
|
||||
- { offset: 0x1BD911, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser8ExitCodeV7successACvpZ', symObjAddr: 0x6EC8, symBinAddr: 0x100117460, symSize: 0x0 }
|
||||
- { offset: 0x1BDA42, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser8ExitCodeV7failureACvpZ', symObjAddr: 0x6ECC, symBinAddr: 0x100117464, symSize: 0x0 }
|
||||
- { offset: 0x1BDA5C, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser8ExitCodeV17validationFailureACvpZ', symObjAddr: 0x6ED0, symBinAddr: 0x100117468, symSize: 0x0 }
|
||||
- { offset: 0x1BD911, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser8ExitCodeV7successACvpZ', symObjAddr: 0x6EC8, symBinAddr: 0x10011B470, symSize: 0x0 }
|
||||
- { offset: 0x1BDA42, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser8ExitCodeV7failureACvpZ', symObjAddr: 0x6ECC, symBinAddr: 0x10011B474, symSize: 0x0 }
|
||||
- { offset: 0x1BDA5C, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser8ExitCodeV17validationFailureACvpZ', symObjAddr: 0x6ED0, symBinAddr: 0x10011B478, symSize: 0x0 }
|
||||
- { offset: 0x1BDB11, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser15ValidationErrorVWOh', symObjAddr: 0x10C, symBinAddr: 0x100051B10, symSize: 0x28 }
|
||||
- { offset: 0x1BDB25, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser8ExitCodeV7success_WZ', symObjAddr: 0x250, symBinAddr: 0x100051C54, symSize: 0x20 }
|
||||
- { offset: 0x1BDB3F, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser8ExitCodeV7successACvau', symObjAddr: 0x270, symBinAddr: 0x100051C74, symSize: 0x50 }
|
||||
@@ -2407,7 +2407,7 @@ relocations:
|
||||
- { offset: 0x1C3F3C, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser11JSONEncoderOMa', symObjAddr: 0xB38, symBinAddr: 0x1000653F0, symSize: 0x14 }
|
||||
- { offset: 0x1C3F5D, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser11JSONEncoderO6encodeySSxSERzlFZ', symObjAddr: 0x420, symBinAddr: 0x100064F0C, symSize: 0x400 }
|
||||
- { offset: 0x1C4112, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser11HelpCommandV13configuration_WZ', symObjAddr: 0x0, symBinAddr: 0x100065404, symSize: 0x14C }
|
||||
- { offset: 0x1C4136, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser11HelpCommandV13configurationAA0D13ConfigurationVvpZ', symObjAddr: 0xAFD0, symBinAddr: 0x100117470, symSize: 0x0 }
|
||||
- { offset: 0x1C4136, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser11HelpCommandV13configurationAA0D13ConfigurationVvpZ', symObjAddr: 0xAFD0, symBinAddr: 0x10011B480, symSize: 0x0 }
|
||||
- { offset: 0x1C4144, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser11HelpCommandV13configuration_WZ', symObjAddr: 0x0, symBinAddr: 0x100065404, symSize: 0x14C }
|
||||
- { offset: 0x1C415E, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser11HelpCommandV13configurationAA0D13ConfigurationVvau', symObjAddr: 0x14C, symBinAddr: 0x100065550, symSize: 0x50 }
|
||||
- { offset: 0x1C458E, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser11HelpCommandV11subcommandsSaySSGvpfP', symObjAddr: 0x338, symBinAddr: 0x1000655C8, symSize: 0xA8 }
|
||||
@@ -2504,8 +2504,8 @@ relocations:
|
||||
- { offset: 0x1C50C5, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser11HelpCommandVAA17ParsableArgumentsA2aDP12_errorPrefixSSvgZTW', symObjAddr: 0x2908, symBinAddr: 0x100067290, symSize: 0x14 }
|
||||
- { offset: 0x1C50D9, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser11HelpCommandVSeAASe4fromxs7Decoder_p_tKcfCTW', symObjAddr: 0x291C, symBinAddr: 0x1000672A4, symSize: 0x6C }
|
||||
- { offset: 0x1C5220, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser13HelpGeneratorV10helpIndent_WZ', symObjAddr: 0x0, symBinAddr: 0x100068074, symSize: 0x4 }
|
||||
- { offset: 0x1C5244, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser13HelpGeneratorV10helpIndentSivpZ', symObjAddr: 0xE840, symBinAddr: 0x1000F2FF0, symSize: 0x0 }
|
||||
- { offset: 0x1C525E, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser13HelpGeneratorV16labelColumnWidthSivpZ', symObjAddr: 0xE848, symBinAddr: 0x1000F2FF8, symSize: 0x0 }
|
||||
- { offset: 0x1C5244, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser13HelpGeneratorV10helpIndentSivpZ', symObjAddr: 0xE840, symBinAddr: 0x1000F49B0, symSize: 0x0 }
|
||||
- { offset: 0x1C525E, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser13HelpGeneratorV16labelColumnWidthSivpZ', symObjAddr: 0xE848, symBinAddr: 0x1000F49B8, symSize: 0x0 }
|
||||
- { offset: 0x1C526C, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser13HelpGeneratorV10helpIndent_WZ', symObjAddr: 0x0, symBinAddr: 0x100068074, symSize: 0x4 }
|
||||
- { offset: 0x1C5286, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser13HelpGeneratorV10helpIndentSivau', symObjAddr: 0x4, symBinAddr: 0x100068078, symSize: 0xC }
|
||||
- { offset: 0x1C59CD, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser13HelpGeneratorV16labelColumnWidth_WZ', symObjAddr: 0x1C, symBinAddr: 0x100068090, symSize: 0x4 }
|
||||
@@ -3353,7 +3353,7 @@ relocations:
|
||||
- { offset: 0x1D124A, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser13ParentCommandV11descriptionSSvg', symObjAddr: 0x1558, symBinAddr: 0x10008F9B8, symSize: 0x1A0 }
|
||||
- { offset: 0x1D1293, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser13ParentCommandVyxGs23CustomStringConvertibleAAsAEP11descriptionSSvgTW', symObjAddr: 0x1728, symBinAddr: 0x10008FB88, symSize: 0x14 }
|
||||
- { offset: 0x1D1415, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser23_WrappedParsableCommandV12_commandNameSSvgZ', symObjAddr: 0x0, symBinAddr: 0x1000901C8, symSize: 0x300 }
|
||||
- { offset: 0x1D143A, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser24directlyInitializedErrorSSvp', symObjAddr: 0x10D18, symBinAddr: 0x100117508, symSize: 0x0 }
|
||||
- { offset: 0x1D143A, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser24directlyInitializedErrorSSvp', symObjAddr: 0x10D18, symBinAddr: 0x10011B518, symSize: 0x0 }
|
||||
- { offset: 0x1D16F0, size: 0x8, addend: 0x0, symName: '_$ss16PartialRangeUpToVySS5IndexVGAByxGSXsWl', symObjAddr: 0x470, symBinAddr: 0x1000904C8, symSize: 0x74 }
|
||||
- { offset: 0x1D1704, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser23_WrappedParsableCommandV7optionsxvpAA0D9ArgumentsRzlACyxGTK', symObjAddr: 0x5A0, symBinAddr: 0x100090580, symSize: 0x94 }
|
||||
- { offset: 0x1D172A, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser23_WrappedParsableCommandV7optionsxvpAA0D9ArgumentsRzlACyxGTk', symObjAddr: 0x634, symBinAddr: 0x100090614, symSize: 0x94 }
|
||||
@@ -3648,12 +3648,12 @@ relocations:
|
||||
- { offset: 0x1D55C9, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser18InternalParseErrorOs0E0AAsADP9_userInfoyXlSgvgTW', symObjAddr: 0x78, symBinAddr: 0x10009B158, symSize: 0x14 }
|
||||
- { offset: 0x1D55DD, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser18InternalParseErrorOs0E0AAsADP19_getEmbeddedNSErroryXlSgyFTW', symObjAddr: 0x8C, symBinAddr: 0x10009B16C, symSize: 0x14 }
|
||||
- { offset: 0x1D56C6, size: 0x8, addend: 0x0, symName: '_$ss11CommandLineO14ArgumentParserE16_staticArguments_WZ', symObjAddr: 0x0, symBinAddr: 0x10009BF30, symSize: 0x1C }
|
||||
- { offset: 0x1D56EA, size: 0x8, addend: 0x0, symName: '_$ss11CommandLineO14ArgumentParserE16_staticArgumentsSaySSGvpZ', symObjAddr: 0x99B0, symBinAddr: 0x100117518, symSize: 0x0 }
|
||||
- { offset: 0x1D5704, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser8PlatformO11EnvironmentO3KeyV5shellAGvpZ', symObjAddr: 0x99B8, symBinAddr: 0x100117520, symSize: 0x0 }
|
||||
- { offset: 0x1D5BA0, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser8PlatformO11EnvironmentO3KeyV7columnsAGvpZ', symObjAddr: 0x99C8, symBinAddr: 0x100117530, symSize: 0x0 }
|
||||
- { offset: 0x1D5BBA, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser8PlatformO11EnvironmentO3KeyV5linesAGvpZ', symObjAddr: 0x99D8, symBinAddr: 0x100117540, symSize: 0x0 }
|
||||
- { offset: 0x1D5BD4, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser8PlatformO11EnvironmentO3KeyV9shellNameAGvpZ', symObjAddr: 0x99E8, symBinAddr: 0x100117550, symSize: 0x0 }
|
||||
- { offset: 0x1D5BEE, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser8PlatformO11EnvironmentO3KeyV12shellVersionAGvpZ', symObjAddr: 0x99F8, symBinAddr: 0x100117560, symSize: 0x0 }
|
||||
- { offset: 0x1D56EA, size: 0x8, addend: 0x0, symName: '_$ss11CommandLineO14ArgumentParserE16_staticArgumentsSaySSGvpZ', symObjAddr: 0x99B0, symBinAddr: 0x10011B528, symSize: 0x0 }
|
||||
- { offset: 0x1D5704, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser8PlatformO11EnvironmentO3KeyV5shellAGvpZ', symObjAddr: 0x99B8, symBinAddr: 0x10011B530, symSize: 0x0 }
|
||||
- { offset: 0x1D5BA0, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser8PlatformO11EnvironmentO3KeyV7columnsAGvpZ', symObjAddr: 0x99C8, symBinAddr: 0x10011B540, symSize: 0x0 }
|
||||
- { offset: 0x1D5BBA, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser8PlatformO11EnvironmentO3KeyV5linesAGvpZ', symObjAddr: 0x99D8, symBinAddr: 0x10011B550, symSize: 0x0 }
|
||||
- { offset: 0x1D5BD4, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser8PlatformO11EnvironmentO3KeyV9shellNameAGvpZ', symObjAddr: 0x99E8, symBinAddr: 0x10011B560, symSize: 0x0 }
|
||||
- { offset: 0x1D5BEE, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser8PlatformO11EnvironmentO3KeyV12shellVersionAGvpZ', symObjAddr: 0x99F8, symBinAddr: 0x10011B570, symSize: 0x0 }
|
||||
- { offset: 0x1D5BFC, size: 0x8, addend: 0x0, symName: '_$ss11CommandLineO14ArgumentParserE16_staticArguments_WZ', symObjAddr: 0x0, symBinAddr: 0x10009BF30, symSize: 0x1C }
|
||||
- { offset: 0x1D5C16, size: 0x8, addend: 0x0, symName: '_$ss11CommandLineO14ArgumentParserE16_staticArgumentsSaySSGvau', symObjAddr: 0x1C, symBinAddr: 0x10009BF4C, symSize: 0x50 }
|
||||
- { offset: 0x1D5C34, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser8PlatformO11EnvironmentOySSSgAE3KeyVcipZAEmTK', symObjAddr: 0x654, symBinAddr: 0x10009C534, symSize: 0x64 }
|
||||
@@ -5014,187 +5014,192 @@ relocations:
|
||||
- { offset: 0x1E6B27, size: 0x8, addend: 0x0, symName: '_$s22ArgumentParserToolInfo0aD2V0VSHAASH4hash4intoys6HasherVz_tFTW', symObjAddr: 0x11BFC, symBinAddr: 0x1000D61A0, symSize: 0x44 }
|
||||
- { offset: 0x1E6B3B, size: 0x8, addend: 0x0, symName: '_$s22ArgumentParserToolInfo0aD2V0VSHAASH13_rawHashValue4seedS2i_tFTW', symObjAddr: 0x11C40, symBinAddr: 0x1000D61E4, symSize: 0x14 }
|
||||
- { offset: 0x1E6B4F, size: 0x8, addend: 0x0, symName: '_$s22ArgumentParserToolInfo0aD2V0VSQAASQ2eeoiySbx_xtFZTW', symObjAddr: 0x11C54, symBinAddr: 0x1000D61F8, symSize: 0x6C }
|
||||
- { offset: 0x1E6CCD, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV9inputPathSSvg', symObjAddr: 0x0, symBinAddr: 0x1000DCE28, symSize: 0x9C }
|
||||
- { offset: 0x1E6EE7, size: 0x8, addend: 0x0, symName: '_$sSo37SFSpeechRecognizerAuthorizationStatusVSQSCSQ2eeoiySbx_xtFZTW', symObjAddr: 0x8EE8, symBinAddr: 0x1000E56CC, symSize: 0x48 }
|
||||
- { offset: 0x1E711B, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVSQSCSQ2eeoiySbx_xtFZTW', symObjAddr: 0x9504, symBinAddr: 0x1000E5B04, symSize: 0x48 }
|
||||
- { offset: 0x1E767C, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser0A0VySSGWOc', symObjAddr: 0x9C, symBinAddr: 0x1000DCEC4, symSize: 0x58 }
|
||||
- { offset: 0x1E7690, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser0A0VySSGWOh', symObjAddr: 0x1B8, symBinAddr: 0x1000DCF1C, symSize: 0x34 }
|
||||
- { offset: 0x1E76A4, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV9inputPathSSvpACTK', symObjAddr: 0x230, symBinAddr: 0x1000DCF50, symSize: 0x78 }
|
||||
- { offset: 0x1E76BC, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV9inputPathSSvpACTk', symObjAddr: 0x2A8, symBinAddr: 0x1000DCFC8, symSize: 0x44 }
|
||||
- { offset: 0x1E76D4, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10_inputPath33_D25DB757439FC08881580587A9BB3263LL14ArgumentParser0K0VySSGvpfi', symObjAddr: 0x558, symBinAddr: 0x1000DD200, symSize: 0xAC }
|
||||
- { offset: 0x1E76EC, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10outputPathSSvpACTK', symObjAddr: 0x740, symBinAddr: 0x1000DD3E8, symSize: 0x78 }
|
||||
- { offset: 0x1E7704, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10outputPathSSvpACTk', symObjAddr: 0x7B8, symBinAddr: 0x1000DD460, symSize: 0x44 }
|
||||
- { offset: 0x1E771C, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV11_outputPath33_D25DB757439FC08881580587A9BB3263LL14ArgumentParser0K0VySSGvpfi', symObjAddr: 0xA00, symBinAddr: 0x1000DD6A8, symSize: 0xAC }
|
||||
- { offset: 0x1E7734, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV4uuidSSvpfP', symObjAddr: 0xB4C, symBinAddr: 0x1000DD7F4, symSize: 0x13C }
|
||||
- { offset: 0x1E7761, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV4uuidSSvpfF', symObjAddr: 0xCA8, symBinAddr: 0x1000DD930, symSize: 0x11C }
|
||||
- { offset: 0x1E778E, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser6OptionVySSGWOc', symObjAddr: 0xE60, symBinAddr: 0x1000DDAE8, symSize: 0x58 }
|
||||
- { offset: 0x1E77A2, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser6OptionVySSGWOh', symObjAddr: 0xEB8, symBinAddr: 0x1000DDB40, symSize: 0x34 }
|
||||
- { offset: 0x1E77B6, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV4uuidSSvpACTK', symObjAddr: 0xEEC, symBinAddr: 0x1000DDB74, symSize: 0x78 }
|
||||
- { offset: 0x1E77CE, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV4uuidSSvpACTk', symObjAddr: 0xF64, symBinAddr: 0x1000DDBEC, symSize: 0x44 }
|
||||
- { offset: 0x1E77E6, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV5_uuid33_D25DB757439FC08881580587A9BB3263LL14ArgumentParser6OptionVySSGvpfi', symObjAddr: 0x11AC, symBinAddr: 0x1000DDE34, symSize: 0x28 }
|
||||
- { offset: 0x1E77FE, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV8languageSSvpfP', symObjAddr: 0x1274, symBinAddr: 0x1000DDEFC, symSize: 0x13C }
|
||||
- { offset: 0x1E782B, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV8languageSSvpfF', symObjAddr: 0x13B0, symBinAddr: 0x1000DE038, symSize: 0x11C }
|
||||
- { offset: 0x1E7858, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV8languageSSvpACTK', symObjAddr: 0x1568, symBinAddr: 0x1000DE1F0, symSize: 0x78 }
|
||||
- { offset: 0x1E7870, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV8languageSSvpACTk', symObjAddr: 0x15E0, symBinAddr: 0x1000DE268, symSize: 0x44 }
|
||||
- { offset: 0x1E7888, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV9_language33_D25DB757439FC08881580587A9BB3263LL14ArgumentParser6OptionVySSGvpfi', symObjAddr: 0x1828, symBinAddr: 0x1000DE4B0, symSize: 0x28 }
|
||||
- { offset: 0x1E78A0, size: 0x8, addend: 0x0, symName: '_$sSo18SFSpeechRecognizerCMa', symObjAddr: 0x2084, symBinAddr: 0x1000DEBB8, symSize: 0x60 }
|
||||
- { offset: 0x1E78B4, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV3runyyKFySo37SFSpeechRecognizerAuthorizationStatusVcfU_TA', symObjAddr: 0x54C0, symBinAddr: 0x1000E1ED8, symSize: 0xC }
|
||||
- { offset: 0x1E78C8, size: 0x8, addend: 0x0, symName: '_$sSo37SFSpeechRecognizerAuthorizationStatusVIegy_ABIeyBy_TR', symObjAddr: 0x54CC, symBinAddr: 0x1000E1EE4, symSize: 0x50 }
|
||||
- { offset: 0x1E78E0, size: 0x8, addend: 0x0, symName: _block_copy_helper, symObjAddr: 0x551C, symBinAddr: 0x1000E1F34, symSize: 0x44 }
|
||||
- { offset: 0x1E78F4, size: 0x8, addend: 0x0, symName: _block_destroy_helper, symObjAddr: 0x5560, symBinAddr: 0x1000E1F78, symSize: 0x18 }
|
||||
- { offset: 0x1E7908, size: 0x8, addend: 0x0, symName: '_$sSo37SFSpeechRecognizerAuthorizationStatusVMa', symObjAddr: 0x5578, symBinAddr: 0x1000E1F90, symSize: 0x94 }
|
||||
- { offset: 0x1E791C, size: 0x8, addend: 0x0, symName: '_$sSo37SFSpeechRecognizerAuthorizationStatusVABSQSCWl', symObjAddr: 0x560C, symBinAddr: 0x1000E2024, symSize: 0x6C }
|
||||
- { offset: 0x1E7930, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftVWOc', symObjAddr: 0x5694, symBinAddr: 0x1000E20AC, symSize: 0x110 }
|
||||
- { offset: 0x1E7944, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftVWOh', symObjAddr: 0x57A4, symBinAddr: 0x1000E21BC, symSize: 0x70 }
|
||||
- { offset: 0x1E7958, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVMa', symObjAddr: 0x5814, symBinAddr: 0x1000E222C, symSize: 0x94 }
|
||||
- { offset: 0x1E796C, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVABs10SetAlgebraSCWl', symObjAddr: 0x58A8, symBinAddr: 0x1000E22C0, symSize: 0x6C }
|
||||
- { offset: 0x1E7980, size: 0x8, addend: 0x0, symName: '_$sSo29SFSpeechURLRecognitionRequestCMa', symObjAddr: 0x59B8, symBinAddr: 0x1000E2358, symSize: 0x60 }
|
||||
- { offset: 0x1E7994, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV3runyyKFySo25SFSpeechRecognitionResultCSg_s5Error_pSgtcfU0_TA', symObjAddr: 0x67E8, symBinAddr: 0x1000E3188, symSize: 0x64 }
|
||||
- { offset: 0x1E79A8, size: 0x8, addend: 0x0, symName: '_$sSo25SFSpeechRecognitionResultCSgs5Error_pSgIeggg_ACSo7NSErrorCSgIeyByy_TR', symObjAddr: 0x684C, symBinAddr: 0x1000E31EC, symSize: 0xC4 }
|
||||
- { offset: 0x1E79C0, size: 0x8, addend: 0x0, symName: _block_copy_helper.10, symObjAddr: 0x6910, symBinAddr: 0x1000E32B0, symSize: 0x44 }
|
||||
- { offset: 0x1E79D4, size: 0x8, addend: 0x0, symName: _block_destroy_helper.11, symObjAddr: 0x6954, symBinAddr: 0x1000E32F4, symSize: 0x18 }
|
||||
- { offset: 0x1E79E8, size: 0x8, addend: 0x0, symName: '_$s10Foundation3URLVACSQAAWl', symObjAddr: 0x696C, symBinAddr: 0x1000E330C, symSize: 0x6C }
|
||||
- { offset: 0x1E79FC, size: 0x8, addend: 0x0, symName: '_$sSo6NSTaskCMa', symObjAddr: 0x69D8, symBinAddr: 0x1000E3378, symSize: 0x60 }
|
||||
- { offset: 0x1E7A10, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftVAC14ArgumentParser15ParsableCommandAAWl', symObjAddr: 0x6ACC, symBinAddr: 0x1000E340C, symSize: 0x68 }
|
||||
- { offset: 0x1E7A24, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLOAFSHAAWl', symObjAddr: 0x7050, symBinAddr: 0x1000E3990, symSize: 0x68 }
|
||||
- { offset: 0x1E7A38, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLOAFs0D3KeyAAWl', symObjAddr: 0x72E8, symBinAddr: 0x1000E3C28, symSize: 0x68 }
|
||||
- { offset: 0x1E7A4C, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser0A0VySSGACyxGSeAAWl', symObjAddr: 0x7BFC, symBinAddr: 0x1000E4490, symSize: 0x74 }
|
||||
- { offset: 0x1E7A60, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV9inputPath06outputE04uuid8languageAC14ArgumentParser0I0VySSG_AKS2StcfcfA_', symObjAddr: 0x7CE4, symBinAddr: 0x1000E4504, symSize: 0xAC }
|
||||
- { offset: 0x1E7A7E, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV9inputPath06outputE04uuid8languageAC14ArgumentParser0I0VySSG_AKS2StcfcfA0_', symObjAddr: 0x7D90, symBinAddr: 0x1000E45B0, symSize: 0xAC }
|
||||
- { offset: 0x1E7A9C, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV9inputPath06outputE04uuid8languageAC14ArgumentParser0I0VySSG_AKS2StcfcfA1_', symObjAddr: 0x7E3C, symBinAddr: 0x1000E465C, symSize: 0x28 }
|
||||
- { offset: 0x1E7ABA, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV9inputPath06outputE04uuid8languageAC14ArgumentParser0I0VySSG_AKS2StcfcfA2_', symObjAddr: 0x7E64, symBinAddr: 0x1000E4684, symSize: 0x28 }
|
||||
- { offset: 0x1E7AD8, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV14ArgumentParser15ParsableCommandAAWI', symObjAddr: 0x812C, symBinAddr: 0x1000E494C, symSize: 0x28 }
|
||||
- { offset: 0x1E7AEC, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftVAC14ArgumentParser17ParsableArgumentsAAWl', symObjAddr: 0x8154, symBinAddr: 0x1000E4974, symSize: 0x68 }
|
||||
- { offset: 0x1E7B00, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV14ArgumentParser17ParsableArgumentsAAWI', symObjAddr: 0x81BC, symBinAddr: 0x1000E49DC, symSize: 0x28 }
|
||||
- { offset: 0x1E7B14, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftVACSeAAWl', symObjAddr: 0x81E4, symBinAddr: 0x1000E4A04, symSize: 0x68 }
|
||||
- { offset: 0x1E7B28, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftVwCP', symObjAddr: 0x824C, symBinAddr: 0x1000E4A6C, symSize: 0x3C }
|
||||
- { offset: 0x1E7B3C, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftVwxx', symObjAddr: 0x8288, symBinAddr: 0x1000E4AA8, symSize: 0x6C }
|
||||
- { offset: 0x1E7B50, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftVwcp', symObjAddr: 0x82F4, symBinAddr: 0x1000E4B14, symSize: 0x110 }
|
||||
- { offset: 0x1E7B64, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftVwca', symObjAddr: 0x8404, symBinAddr: 0x1000E4C24, symSize: 0x154 }
|
||||
- { offset: 0x1E7B78, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftVwta', symObjAddr: 0x8584, symBinAddr: 0x1000E4D78, symSize: 0xE0 }
|
||||
- { offset: 0x1E7B8C, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftVwet', symObjAddr: 0x8664, symBinAddr: 0x1000E4E58, symSize: 0xF8 }
|
||||
- { offset: 0x1E7BA0, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftVwst', symObjAddr: 0x875C, symBinAddr: 0x1000E4F50, symSize: 0x1D8 }
|
||||
- { offset: 0x1E7BB4, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftVMa', symObjAddr: 0x8934, symBinAddr: 0x1000E5128, symSize: 0x14 }
|
||||
- { offset: 0x1E7BC8, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLOwet', symObjAddr: 0x8958, symBinAddr: 0x1000E513C, symSize: 0x168 }
|
||||
- { offset: 0x1E7BDC, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLOwst', symObjAddr: 0x8AC0, symBinAddr: 0x1000E52A4, symSize: 0x1FC }
|
||||
- { offset: 0x1E7BF0, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLOwug', symObjAddr: 0x8CBC, symBinAddr: 0x1000E54A0, symSize: 0x8 }
|
||||
- { offset: 0x1E7C04, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLOwup', symObjAddr: 0x8CC4, symBinAddr: 0x1000E54A8, symSize: 0x4 }
|
||||
- { offset: 0x1E7C18, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLOwui', symObjAddr: 0x8CC8, symBinAddr: 0x1000E54AC, symSize: 0x8 }
|
||||
- { offset: 0x1E7C2C, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLOMa', symObjAddr: 0x8CD0, symBinAddr: 0x1000E54B4, symSize: 0x14 }
|
||||
- { offset: 0x1E7C40, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVs9OptionSetSCSYWb', symObjAddr: 0x9610, symBinAddr: 0x1000E5C10, symSize: 0x14 }
|
||||
- { offset: 0x1E7C54, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVABSYSCWl', symObjAddr: 0x9624, symBinAddr: 0x1000E5C24, symSize: 0x6C }
|
||||
- { offset: 0x1E7C68, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVs9OptionSetSCs0D7AlgebraPWb', symObjAddr: 0x9690, symBinAddr: 0x1000E5C90, symSize: 0x14 }
|
||||
- { offset: 0x1E7C7C, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLOs0D3KeyAAs28CustomDebugStringConvertiblePWb', symObjAddr: 0x96A4, symBinAddr: 0x1000E5CA4, symSize: 0x14 }
|
||||
- { offset: 0x1E7C90, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLOAFs28CustomDebugStringConvertibleAAWl', symObjAddr: 0x96B8, symBinAddr: 0x1000E5CB8, symSize: 0x68 }
|
||||
- { offset: 0x1E7CA4, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLOs0D3KeyAAs23CustomStringConvertiblePWb', symObjAddr: 0x9720, symBinAddr: 0x1000E5D20, symSize: 0x14 }
|
||||
- { offset: 0x1E7CB8, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLOAFs23CustomStringConvertibleAAWl', symObjAddr: 0x9734, symBinAddr: 0x1000E5D34, symSize: 0x68 }
|
||||
- { offset: 0x1E7CCC, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLOSHAASQWb', symObjAddr: 0x979C, symBinAddr: 0x1000E5D9C, symSize: 0x14 }
|
||||
- { offset: 0x1E7CE0, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLOAFSQAAWl', symObjAddr: 0x97B0, symBinAddr: 0x1000E5DB0, symSize: 0x68 }
|
||||
- { offset: 0x1E7CF4, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVs10SetAlgebraSCSQWb', symObjAddr: 0x9818, symBinAddr: 0x1000E5E18, symSize: 0x14 }
|
||||
- { offset: 0x1E7D08, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVABSQSCWl', symObjAddr: 0x982C, symBinAddr: 0x1000E5E2C, symSize: 0x6C }
|
||||
- { offset: 0x1E7D1C, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVs10SetAlgebraSCs25ExpressibleByArrayLiteralPWb', symObjAddr: 0x9898, symBinAddr: 0x1000E5E98, symSize: 0x14 }
|
||||
- { offset: 0x1E7D30, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVABs25ExpressibleByArrayLiteralSCWl', symObjAddr: 0x98AC, symBinAddr: 0x1000E5EAC, symSize: 0x6C }
|
||||
- { offset: 0x1E7D44, size: 0x8, addend: 0x0, symName: '_$sSo37SFSpeechRecognizerAuthorizationStatusVABSYSCWl', symObjAddr: 0x9918, symBinAddr: 0x1000E5F18, symSize: 0x6C }
|
||||
- { offset: 0x1E7D58, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVABs9OptionSetSCWl', symObjAddr: 0x9984, symBinAddr: 0x1000E5F84, symSize: 0x6C }
|
||||
- { offset: 0x1E7D6C, size: 0x8, addend: 0x0, symName: '_$sSo22SFTranscriptionSegmentCMa', symObjAddr: 0x9A58, symBinAddr: 0x1000E5FF4, symSize: 0x60 }
|
||||
- { offset: 0x1E7D80, size: 0x8, addend: 0x0, symName: '_$sSaySo22SFTranscriptionSegmentCGSayxGSlsWl', symObjAddr: 0x9AB8, symBinAddr: 0x1000E6054, symSize: 0x74 }
|
||||
- { offset: 0x1E7D94, size: 0x8, addend: 0x0, symName: '_$ss16IndexingIteratorVySaySo22SFTranscriptionSegmentCGGWOh', symObjAddr: 0x9B2C, symBinAddr: 0x1000E60C8, symSize: 0x28 }
|
||||
- { offset: 0x1E7DA8, size: 0x8, addend: 0x0, symName: '_$sSaySDySSypGGSayxGSlsWl', symObjAddr: 0x9B54, symBinAddr: 0x1000E60F0, symSize: 0x74 }
|
||||
- { offset: 0x1E7DBC, size: 0x8, addend: 0x0, symName: '_$sSa22_allocateUninitializedySayxG_SpyxGtSiFZSo20NSDataWritingOptionsV_Tt0gq5', symObjAddr: 0x9BD4, symBinAddr: 0x1000E6164, symSize: 0xD4 }
|
||||
- { offset: 0x1E7DE9, size: 0x8, addend: 0x0, symName: '_$sSo20NSDataWritingOptionsVMa', symObjAddr: 0x9CA8, symBinAddr: 0x1000E6238, symSize: 0x94 }
|
||||
- { offset: 0x1E7DFE, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV9inputPathSSvg', symObjAddr: 0x0, symBinAddr: 0x1000DCE28, symSize: 0x9C }
|
||||
- { offset: 0x1E7E2E, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV9inputPathSSvs', symObjAddr: 0x2EC, symBinAddr: 0x1000DD00C, symSize: 0x8C }
|
||||
- { offset: 0x1E7E62, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV9inputPathSSvM', symObjAddr: 0x378, symBinAddr: 0x1000DD098, symSize: 0xB0 }
|
||||
- { offset: 0x1E7E87, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV9inputPathSSvM.resume.0', symObjAddr: 0x428, symBinAddr: 0x1000DD148, symSize: 0xB8 }
|
||||
- { offset: 0x1E7F4B, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10_inputPath33_D25DB757439FC08881580587A9BB3263LL14ArgumentParser0K0VySSGvg', symObjAddr: 0x604, symBinAddr: 0x1000DD2AC, symSize: 0x40 }
|
||||
- { offset: 0x1E7F5F, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10_inputPath33_D25DB757439FC08881580587A9BB3263LL14ArgumentParser0K0VySSGvs', symObjAddr: 0x644, symBinAddr: 0x1000DD2EC, symSize: 0x60 }
|
||||
- { offset: 0x1E7F73, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10outputPathSSvg', symObjAddr: 0x6A4, symBinAddr: 0x1000DD34C, symSize: 0x9C }
|
||||
- { offset: 0x1E7F98, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10outputPathSSvs', symObjAddr: 0x7FC, symBinAddr: 0x1000DD4A4, symSize: 0x94 }
|
||||
- { offset: 0x1E7FCC, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10outputPathSSvM', symObjAddr: 0x890, symBinAddr: 0x1000DD538, symSize: 0xB0 }
|
||||
- { offset: 0x1E7FF1, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10outputPathSSvM.resume.0', symObjAddr: 0x940, symBinAddr: 0x1000DD5E8, symSize: 0xC0 }
|
||||
- { offset: 0x1E8012, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV11_outputPath33_D25DB757439FC08881580587A9BB3263LL14ArgumentParser0K0VySSGvg', symObjAddr: 0xAAC, symBinAddr: 0x1000DD754, symSize: 0x40 }
|
||||
- { offset: 0x1E8026, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV11_outputPath33_D25DB757439FC08881580587A9BB3263LL14ArgumentParser0K0VySSGvs', symObjAddr: 0xAEC, symBinAddr: 0x1000DD794, symSize: 0x60 }
|
||||
- { offset: 0x1E803A, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV4uuidSSvg', symObjAddr: 0xDC4, symBinAddr: 0x1000DDA4C, symSize: 0x9C }
|
||||
- { offset: 0x1E805F, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV4uuidSSvs', symObjAddr: 0xFA8, symBinAddr: 0x1000DDC30, symSize: 0x94 }
|
||||
- { offset: 0x1E8093, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV4uuidSSvM', symObjAddr: 0x103C, symBinAddr: 0x1000DDCC4, symSize: 0xB0 }
|
||||
- { offset: 0x1E80B8, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV4uuidSSvM.resume.0', symObjAddr: 0x10EC, symBinAddr: 0x1000DDD74, symSize: 0xC0 }
|
||||
- { offset: 0x1E80D9, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV5_uuid33_D25DB757439FC08881580587A9BB3263LL14ArgumentParser6OptionVySSGvg', symObjAddr: 0x11D4, symBinAddr: 0x1000DDE5C, symSize: 0x40 }
|
||||
- { offset: 0x1E80ED, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV5_uuid33_D25DB757439FC08881580587A9BB3263LL14ArgumentParser6OptionVySSGvs', symObjAddr: 0x1214, symBinAddr: 0x1000DDE9C, symSize: 0x60 }
|
||||
- { offset: 0x1E8101, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV8languageSSvg', symObjAddr: 0x14CC, symBinAddr: 0x1000DE154, symSize: 0x9C }
|
||||
- { offset: 0x1E8126, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV8languageSSvs', symObjAddr: 0x1624, symBinAddr: 0x1000DE2AC, symSize: 0x94 }
|
||||
- { offset: 0x1E815A, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV8languageSSvM', symObjAddr: 0x16B8, symBinAddr: 0x1000DE340, symSize: 0xB0 }
|
||||
- { offset: 0x1E817F, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV8languageSSvM.resume.0', symObjAddr: 0x1768, symBinAddr: 0x1000DE3F0, symSize: 0xC0 }
|
||||
- { offset: 0x1E81A0, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV9_language33_D25DB757439FC08881580587A9BB3263LL14ArgumentParser6OptionVySSGvg', symObjAddr: 0x1850, symBinAddr: 0x1000DE4D8, symSize: 0x40 }
|
||||
- { offset: 0x1E81B4, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV9_language33_D25DB757439FC08881580587A9BB3263LL14ArgumentParser6OptionVySSGvs', symObjAddr: 0x1890, symBinAddr: 0x1000DE518, symSize: 0x60 }
|
||||
- { offset: 0x1E81C8, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV14detectLanguageSSyF', symObjAddr: 0x18F0, symBinAddr: 0x1000DE578, symSize: 0x640 }
|
||||
- { offset: 0x1E83C8, size: 0x8, addend: 0x0, symName: '_$sSo18SFSpeechRecognizerC6localeABSg10Foundation6LocaleV_tcfC', symObjAddr: 0x20E4, symBinAddr: 0x1000DEC18, symSize: 0x3C }
|
||||
- { offset: 0x1E83DC, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV3runyyKF', symObjAddr: 0x21A0, symBinAddr: 0x1000DEC54, symSize: 0x3118 }
|
||||
- { offset: 0x1E85BB, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV3runyyKFySo37SFSpeechRecognizerAuthorizationStatusVcfU_', symObjAddr: 0x53FC, symBinAddr: 0x1000E1E14, symSize: 0x78 }
|
||||
- { offset: 0x1E8604, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV3runyyKFySo25SFSpeechRecognitionResultCSg_s5Error_pSgtcfU0_', symObjAddr: 0x5A90, symBinAddr: 0x1000E2430, symSize: 0xCA0 }
|
||||
- { offset: 0x1E8722, size: 0x8, addend: 0x0, symName: '_$sSo6NSTaskCABycfC', symObjAddr: 0x537C, symBinAddr: 0x1000E1D94, symSize: 0x2C }
|
||||
- { offset: 0x1E8741, size: 0x8, addend: 0x0, symName: '_$sSo7NSErrorC6domain4code8userInfoABSS_SiSDySSypGSgtcfC', symObjAddr: 0x53A8, symBinAddr: 0x1000E1DC0, symSize: 0x54 }
|
||||
- { offset: 0x1E8755, size: 0x8, addend: 0x0, symName: '_$sSo37SFSpeechRecognizerAuthorizationStatusV8rawValueSivg', symObjAddr: 0x5678, symBinAddr: 0x1000E2090, symSize: 0x1C }
|
||||
- { offset: 0x1E8777, size: 0x8, addend: 0x0, symName: '_$s10Foundation4DataV5write2to7optionsyAA3URLV_So20NSDataWritingOptionsVtKFfA0_', symObjAddr: 0x5914, symBinAddr: 0x1000E232C, symSize: 0x2C }
|
||||
- { offset: 0x1E8796, size: 0x8, addend: 0x0, symName: '_$sSo29SFSpeechURLRecognitionRequestC3urlAB10Foundation3URLV_tcfC', symObjAddr: 0x5A18, symBinAddr: 0x1000E23B8, symSize: 0x3C }
|
||||
- { offset: 0x1E87B6, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV5$mainyyFZ', symObjAddr: 0x6A98, symBinAddr: 0x1000E33D8, symSize: 0x34 }
|
||||
- { offset: 0x1E87E2, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLO11stringValueAFSgSS_tcfC', symObjAddr: 0x6B34, symBinAddr: 0x1000E3474, symSize: 0x2B8 }
|
||||
- { offset: 0x1E8804, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLO8intValueAFSgSi_tcfC', symObjAddr: 0x6DEC, symBinAddr: 0x1000E372C, symSize: 0x18 }
|
||||
- { offset: 0x1E8826, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLO21__derived_enum_equalsySbAF_AFtFZ', symObjAddr: 0x6E04, symBinAddr: 0x1000E3744, symSize: 0x130 }
|
||||
- { offset: 0x1E8863, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLO4hash4intoys6HasherVz_tF', symObjAddr: 0x6F34, symBinAddr: 0x1000E3874, symSize: 0xD4 }
|
||||
- { offset: 0x1E8893, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLO9hashValueSivg', symObjAddr: 0x7008, symBinAddr: 0x1000E3948, symSize: 0x48 }
|
||||
- { offset: 0x1E88B5, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLO8intValueSiSgvg', symObjAddr: 0x70B8, symBinAddr: 0x1000E39F8, symSize: 0x1C }
|
||||
- { offset: 0x1E88D7, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLO11stringValueSSvg', symObjAddr: 0x70D4, symBinAddr: 0x1000E3A14, symSize: 0x104 }
|
||||
- { offset: 0x1E8904, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLOSQAASQ2eeoiySbx_xtFZTW', symObjAddr: 0x71D8, symBinAddr: 0x1000E3B18, symSize: 0x20 }
|
||||
- { offset: 0x1E8918, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLOSHAASH9hashValueSivgTW', symObjAddr: 0x71F8, symBinAddr: 0x1000E3B38, symSize: 0x18 }
|
||||
- { offset: 0x1E892C, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLOSHAASH4hash4intoys6HasherVz_tFTW', symObjAddr: 0x7210, symBinAddr: 0x1000E3B50, symSize: 0x18 }
|
||||
- { offset: 0x1E8940, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLOSHAASH13_rawHashValue4seedS2i_tFTW', symObjAddr: 0x7228, symBinAddr: 0x1000E3B68, symSize: 0x14 }
|
||||
- { offset: 0x1E8954, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLOs0D3KeyAAsAGP11stringValueSSvgTW', symObjAddr: 0x723C, symBinAddr: 0x1000E3B7C, symSize: 0x18 }
|
||||
- { offset: 0x1E8968, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLOs0D3KeyAAsAGP11stringValuexSgSS_tcfCTW', symObjAddr: 0x7254, symBinAddr: 0x1000E3B94, symSize: 0x28 }
|
||||
- { offset: 0x1E897C, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLOs0D3KeyAAsAGP8intValueSiSgvgTW', symObjAddr: 0x727C, symBinAddr: 0x1000E3BBC, symSize: 0x18 }
|
||||
- { offset: 0x1E8990, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLOs0D3KeyAAsAGP8intValuexSgSi_tcfCTW', symObjAddr: 0x7294, symBinAddr: 0x1000E3BD4, symSize: 0x28 }
|
||||
- { offset: 0x1E89A4, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLOs28CustomDebugStringConvertibleAAsAGP16debugDescriptionSSvgTW', symObjAddr: 0x72BC, symBinAddr: 0x1000E3BFC, symSize: 0x2C }
|
||||
- { offset: 0x1E89B8, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLOs23CustomStringConvertibleAAsAGP11descriptionSSvgTW', symObjAddr: 0x7350, symBinAddr: 0x1000E3C90, symSize: 0x2C }
|
||||
- { offset: 0x1E89CC, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftVACycfC', symObjAddr: 0x737C, symBinAddr: 0x1000E3CBC, symSize: 0x214 }
|
||||
- { offset: 0x1E89F1, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV4fromACs7Decoder_p_tKcfC', symObjAddr: 0x7590, symBinAddr: 0x1000E3ED0, symSize: 0x5C0 }
|
||||
- { offset: 0x1E8A15, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV9inputPath06outputE04uuid8languageAC14ArgumentParser0I0VySSG_AKS2StcfC', symObjAddr: 0x7E8C, symBinAddr: 0x1000E46AC, symSize: 0xE0 }
|
||||
- { offset: 0x1E8A34, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV14ArgumentParser15ParsableCommandAadEP13configurationAD0G13ConfigurationVvgZTW', symObjAddr: 0x7F6C, symBinAddr: 0x1000E478C, symSize: 0x3C }
|
||||
- { offset: 0x1E8A48, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV14ArgumentParser15ParsableCommandAadEP12_commandNameSSvgZTW', symObjAddr: 0x7FA8, symBinAddr: 0x1000E47C8, symSize: 0x14 }
|
||||
- { offset: 0x1E8A5C, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV14ArgumentParser15ParsableCommandAadEP3runyyKFTW', symObjAddr: 0x7FBC, symBinAddr: 0x1000E47DC, symSize: 0x44 }
|
||||
- { offset: 0x1E8A70, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV14ArgumentParser17ParsableArgumentsAadEPxycfCTW', symObjAddr: 0x8000, symBinAddr: 0x1000E4820, symSize: 0x3C }
|
||||
- { offset: 0x1E8A84, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV14ArgumentParser17ParsableArgumentsAadEP8validateyyKFTW', symObjAddr: 0x803C, symBinAddr: 0x1000E485C, symSize: 0x44 }
|
||||
- { offset: 0x1E8A98, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV14ArgumentParser17ParsableArgumentsAadEP11_errorLabelSSvgZTW', symObjAddr: 0x8080, symBinAddr: 0x1000E48A0, symSize: 0x14 }
|
||||
- { offset: 0x1E8AAC, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV14ArgumentParser17ParsableArgumentsAadEP12_errorPrefixSSvgZTW', symObjAddr: 0x8094, symBinAddr: 0x1000E48B4, symSize: 0x14 }
|
||||
- { offset: 0x1E8AC0, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftVSeAASe4fromxs7Decoder_p_tKcfCTW', symObjAddr: 0x80A8, symBinAddr: 0x1000E48C8, symSize: 0x6C }
|
||||
- { offset: 0x1E8AD4, size: 0x8, addend: 0x0, symName: _asr_swift_main, symObjAddr: 0x8114, symBinAddr: 0x1000E4934, symSize: 0x18 }
|
||||
- { offset: 0x1E8AE8, size: 0x8, addend: 0x0, symName: '_$sSo18SFSpeechRecognizerC6localeABSg10Foundation6LocaleV_tcfcTO', symObjAddr: 0x8CE4, symBinAddr: 0x1000E54C8, symSize: 0x80 }
|
||||
- { offset: 0x1E8AFC, size: 0x8, addend: 0x0, symName: '_$sSo6NSTaskCABycfcTO', symObjAddr: 0x8D64, symBinAddr: 0x1000E5548, symSize: 0x18 }
|
||||
- { offset: 0x1E8B10, size: 0x8, addend: 0x0, symName: '_$sSo7NSErrorC6domain4code8userInfoABSS_SiSDySSypGSgtcfcTO', symObjAddr: 0x8D7C, symBinAddr: 0x1000E5560, symSize: 0xE8 }
|
||||
- { offset: 0x1E8B2F, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsV8rawValueABSu_tcfC', symObjAddr: 0x8E64, symBinAddr: 0x1000E5648, symSize: 0x4 }
|
||||
- { offset: 0x1E8B43, size: 0x8, addend: 0x0, symName: '_$sSo29SFSpeechURLRecognitionRequestC3urlAB10Foundation3URLV_tcfcTO', symObjAddr: 0x8E68, symBinAddr: 0x1000E564C, symSize: 0x80 }
|
||||
- { offset: 0x1E8B62, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVs10SetAlgebraSCsACPxycfCTW', symObjAddr: 0x8F30, symBinAddr: 0x1000E5714, symSize: 0x40 }
|
||||
- { offset: 0x1E8B76, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVs10SetAlgebraSCsACP8containsySb7ElementQzFTW', symObjAddr: 0x8F70, symBinAddr: 0x1000E5754, symSize: 0x38 }
|
||||
- { offset: 0x1E8B8A, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVs10SetAlgebraSCsACP5unionyxxnFTW', symObjAddr: 0x8FA8, symBinAddr: 0x1000E578C, symSize: 0x3C }
|
||||
- { offset: 0x1E8B9E, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVs10SetAlgebraSCsACP12intersectionyxxFTW', symObjAddr: 0x8FE4, symBinAddr: 0x1000E57C8, symSize: 0x3C }
|
||||
- { offset: 0x1E8BB2, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVs10SetAlgebraSCsACP19symmetricDifferenceyxxnFTW', symObjAddr: 0x9020, symBinAddr: 0x1000E5804, symSize: 0x3C }
|
||||
- { offset: 0x1E8BD1, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVs10SetAlgebraSCsACP6insertySb8inserted_7ElementQz17memberAfterInserttAHnFTW', symObjAddr: 0x905C, symBinAddr: 0x1000E5840, symSize: 0x4C }
|
||||
- { offset: 0x1E8BFB, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVs10SetAlgebraSCsACP6removey7ElementQzSgAGFTW', symObjAddr: 0x928C, symBinAddr: 0x1000E588C, symSize: 0x3C }
|
||||
- { offset: 0x1E8C0F, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVs10SetAlgebraSCsACP6update4with7ElementQzSgAHn_tFTW', symObjAddr: 0x92C8, symBinAddr: 0x1000E58C8, symSize: 0x3C }
|
||||
- { offset: 0x1E8C23, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVs10SetAlgebraSCsACP9formUnionyyxnFTW', symObjAddr: 0x9304, symBinAddr: 0x1000E5904, symSize: 0x40 }
|
||||
- { offset: 0x1E8C37, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVs10SetAlgebraSCsACP16formIntersectionyyxFTW', symObjAddr: 0x9344, symBinAddr: 0x1000E5944, symSize: 0x40 }
|
||||
- { offset: 0x1E8C4B, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVs10SetAlgebraSCsACP23formSymmetricDifferenceyyxnFTW', symObjAddr: 0x9384, symBinAddr: 0x1000E5984, symSize: 0x40 }
|
||||
- { offset: 0x1E8C5F, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVs10SetAlgebraSCsACP11subtractingyxxFTW', symObjAddr: 0x93C4, symBinAddr: 0x1000E59C4, symSize: 0x14 }
|
||||
- { offset: 0x1E8C73, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVs10SetAlgebraSCsACP8isSubset2ofSbx_tFTW', symObjAddr: 0x93D8, symBinAddr: 0x1000E59D8, symSize: 0x18 }
|
||||
- { offset: 0x1E8C87, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVs10SetAlgebraSCsACP10isDisjoint4withSbx_tFTW', symObjAddr: 0x93F0, symBinAddr: 0x1000E59F0, symSize: 0x18 }
|
||||
- { offset: 0x1E8C9B, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVs10SetAlgebraSCsACP10isSuperset2ofSbx_tFTW', symObjAddr: 0x9408, symBinAddr: 0x1000E5A08, symSize: 0x18 }
|
||||
- { offset: 0x1E8CAF, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVs10SetAlgebraSCsACP7isEmptySbvgTW', symObjAddr: 0x9420, symBinAddr: 0x1000E5A20, symSize: 0x18 }
|
||||
- { offset: 0x1E8CC3, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVs10SetAlgebraSCsACPyxqd__ncSTRd__7ElementQyd__AERtzlufCTW', symObjAddr: 0x9438, symBinAddr: 0x1000E5A38, symSize: 0x38 }
|
||||
- { offset: 0x1E8CD7, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVs10SetAlgebraSCsACP8subtractyyxFTW', symObjAddr: 0x9470, symBinAddr: 0x1000E5A70, symSize: 0x14 }
|
||||
- { offset: 0x1E8CF6, size: 0x8, addend: 0x0, symName: '_$sSo37SFSpeechRecognizerAuthorizationStatusVSYSCSY8rawValuexSg03RawF0Qz_tcfCTW', symObjAddr: 0x9484, symBinAddr: 0x1000E5A84, symSize: 0x30 }
|
||||
- { offset: 0x1E8D15, size: 0x8, addend: 0x0, symName: '_$sSo37SFSpeechRecognizerAuthorizationStatusV8rawValueABSgSi_tcfC', symObjAddr: 0x94B4, symBinAddr: 0x1000E5AB4, symSize: 0x24 }
|
||||
- { offset: 0x1E8D46, size: 0x8, addend: 0x0, symName: '_$sSo37SFSpeechRecognizerAuthorizationStatusVSYSCSY8rawValue03RawF0QzvgTW', symObjAddr: 0x94D8, symBinAddr: 0x1000E5AD8, symSize: 0x2C }
|
||||
- { offset: 0x1E8D5A, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVs25ExpressibleByArrayLiteralSCsACP05arrayF0x0eF7ElementQzd_tcfCTW', symObjAddr: 0x954C, symBinAddr: 0x1000E5B4C, symSize: 0x3C }
|
||||
- { offset: 0x1E8D6E, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVs9OptionSetSCsACP8rawValuex03RawF0Qz_tcfCTW', symObjAddr: 0x9588, symBinAddr: 0x1000E5B88, symSize: 0x2C }
|
||||
- { offset: 0x1E8D82, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVSYSCSY8rawValuexSg03RawD0Qz_tcfCTW', symObjAddr: 0x95B4, symBinAddr: 0x1000E5BB4, symSize: 0x30 }
|
||||
- { offset: 0x1E8D96, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVSYSCSY8rawValue03RawD0QzvgTW', symObjAddr: 0x95E4, symBinAddr: 0x1000E5BE4, symSize: 0x2C }
|
||||
- { offset: 0x1E8DAA, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsV8rawValueSuvg', symObjAddr: 0x9A54, symBinAddr: 0x1000E5FF0, symSize: 0x4 }
|
||||
- { offset: 0x1E6CCD, size: 0x8, addend: 0x0, symName: '_$s9asr_swift17mergeWordSegmentsySaySDySSypGGADF', symObjAddr: 0x0, symBinAddr: 0x1000DCE28, symSize: 0x1400 }
|
||||
- { offset: 0x1E6EE7, size: 0x8, addend: 0x0, symName: '_$sSo37SFSpeechRecognizerAuthorizationStatusVSQSCSQ2eeoiySbx_xtFZTW', symObjAddr: 0xA928, symBinAddr: 0x1000E704C, symSize: 0x48 }
|
||||
- { offset: 0x1E711B, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVSQSCSQ2eeoiySbx_xtFZTW', symObjAddr: 0xAF44, symBinAddr: 0x1000E7484, symSize: 0x48 }
|
||||
- { offset: 0x1E7218, size: 0x8, addend: 0x0, symName: '_$s9asr_swift17mergeWordSegmentsySaySDySSypGGADF', symObjAddr: 0x0, symBinAddr: 0x1000DCE28, symSize: 0x1400 }
|
||||
- { offset: 0x1E7415, size: 0x8, addend: 0x0, symName: '_$sSaySDySSypGGSayxGSlsWl', symObjAddr: 0x1480, symBinAddr: 0x1000DE228, symSize: 0x74 }
|
||||
- { offset: 0x1E7429, size: 0x8, addend: 0x0, symName: '_$ss16IndexingIteratorVySaySDySSypGGGWOh', symObjAddr: 0x156C, symBinAddr: 0x1000DE29C, symSize: 0x28 }
|
||||
- { offset: 0x1E743D, size: 0x8, addend: 0x0, symName: '_$sSDySSypGSgWOh', symObjAddr: 0x1594, symBinAddr: 0x1000DE2C4, symSize: 0x28 }
|
||||
- { offset: 0x1E7451, size: 0x8, addend: 0x0, symName: '_$sSaySDySSypGGWOh', symObjAddr: 0x15BC, symBinAddr: 0x1000DE2EC, symSize: 0x28 }
|
||||
- { offset: 0x1E7465, size: 0x8, addend: 0x0, symName: '_$sSDySSypGWOh', symObjAddr: 0x16A4, symBinAddr: 0x1000DE314, symSize: 0x28 }
|
||||
- { offset: 0x1E7920, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser0A0VySSGWOc', symObjAddr: 0x17D0, symBinAddr: 0x1000DE3D8, symSize: 0x58 }
|
||||
- { offset: 0x1E7934, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser0A0VySSGWOh', symObjAddr: 0x186C, symBinAddr: 0x1000DE430, symSize: 0x34 }
|
||||
- { offset: 0x1E7948, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV9inputPathSSvpACTK', symObjAddr: 0x18E4, symBinAddr: 0x1000DE464, symSize: 0x78 }
|
||||
- { offset: 0x1E7960, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV9inputPathSSvpACTk', symObjAddr: 0x195C, symBinAddr: 0x1000DE4DC, symSize: 0x44 }
|
||||
- { offset: 0x1E7978, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10_inputPath33_D25DB757439FC08881580587A9BB3263LL14ArgumentParser0K0VySSGvpfi', symObjAddr: 0x1BE4, symBinAddr: 0x1000DE714, symSize: 0xAC }
|
||||
- { offset: 0x1E7990, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10outputPathSSvpACTK', symObjAddr: 0x1DCC, symBinAddr: 0x1000DE8FC, symSize: 0x78 }
|
||||
- { offset: 0x1E79A8, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10outputPathSSvpACTk', symObjAddr: 0x1E44, symBinAddr: 0x1000DE974, symSize: 0x44 }
|
||||
- { offset: 0x1E79C0, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV11_outputPath33_D25DB757439FC08881580587A9BB3263LL14ArgumentParser0K0VySSGvpfi', symObjAddr: 0x208C, symBinAddr: 0x1000DEBBC, symSize: 0xAC }
|
||||
- { offset: 0x1E79D8, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV4uuidSSvpfP', symObjAddr: 0x21D8, symBinAddr: 0x1000DED08, symSize: 0x13C }
|
||||
- { offset: 0x1E7A05, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV4uuidSSvpfF', symObjAddr: 0x2334, symBinAddr: 0x1000DEE44, symSize: 0x11C }
|
||||
- { offset: 0x1E7A32, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser6OptionVySSGWOc', symObjAddr: 0x24EC, symBinAddr: 0x1000DEFFC, symSize: 0x58 }
|
||||
- { offset: 0x1E7A46, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser6OptionVySSGWOh', symObjAddr: 0x2544, symBinAddr: 0x1000DF054, symSize: 0x34 }
|
||||
- { offset: 0x1E7A5A, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV4uuidSSvpACTK', symObjAddr: 0x2578, symBinAddr: 0x1000DF088, symSize: 0x78 }
|
||||
- { offset: 0x1E7A72, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV4uuidSSvpACTk', symObjAddr: 0x25F0, symBinAddr: 0x1000DF100, symSize: 0x44 }
|
||||
- { offset: 0x1E7A8A, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV5_uuid33_D25DB757439FC08881580587A9BB3263LL14ArgumentParser6OptionVySSGvpfi', symObjAddr: 0x2838, symBinAddr: 0x1000DF348, symSize: 0x28 }
|
||||
- { offset: 0x1E7AA2, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV8languageSSvpfP', symObjAddr: 0x2900, symBinAddr: 0x1000DF410, symSize: 0x13C }
|
||||
- { offset: 0x1E7ACF, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV8languageSSvpfF', symObjAddr: 0x2A3C, symBinAddr: 0x1000DF54C, symSize: 0x11C }
|
||||
- { offset: 0x1E7AFC, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV8languageSSvpACTK', symObjAddr: 0x2BF4, symBinAddr: 0x1000DF704, symSize: 0x78 }
|
||||
- { offset: 0x1E7B14, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV8languageSSvpACTk', symObjAddr: 0x2C6C, symBinAddr: 0x1000DF77C, symSize: 0x44 }
|
||||
- { offset: 0x1E7B2C, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV9_language33_D25DB757439FC08881580587A9BB3263LL14ArgumentParser6OptionVySSGvpfi', symObjAddr: 0x2EB4, symBinAddr: 0x1000DF9C4, symSize: 0x28 }
|
||||
- { offset: 0x1E7B44, size: 0x8, addend: 0x0, symName: '_$sSo18SFSpeechRecognizerCMa', symObjAddr: 0x3658, symBinAddr: 0x1000E00CC, symSize: 0x60 }
|
||||
- { offset: 0x1E7B58, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV3runyyKFySo37SFSpeechRecognizerAuthorizationStatusVcfU_TA', symObjAddr: 0x6B88, symBinAddr: 0x1000E34E0, symSize: 0xC }
|
||||
- { offset: 0x1E7B6C, size: 0x8, addend: 0x0, symName: '_$sSo37SFSpeechRecognizerAuthorizationStatusVIegy_ABIeyBy_TR', symObjAddr: 0x6B94, symBinAddr: 0x1000E34EC, symSize: 0x50 }
|
||||
- { offset: 0x1E7B84, size: 0x8, addend: 0x0, symName: _block_copy_helper, symObjAddr: 0x6BE4, symBinAddr: 0x1000E353C, symSize: 0x44 }
|
||||
- { offset: 0x1E7B98, size: 0x8, addend: 0x0, symName: _block_destroy_helper, symObjAddr: 0x6C28, symBinAddr: 0x1000E3580, symSize: 0x18 }
|
||||
- { offset: 0x1E7BAC, size: 0x8, addend: 0x0, symName: '_$sSo37SFSpeechRecognizerAuthorizationStatusVMa', symObjAddr: 0x6C40, symBinAddr: 0x1000E3598, symSize: 0x94 }
|
||||
- { offset: 0x1E7BC0, size: 0x8, addend: 0x0, symName: '_$sSo37SFSpeechRecognizerAuthorizationStatusVABSQSCWl', symObjAddr: 0x6CD4, symBinAddr: 0x1000E362C, symSize: 0x6C }
|
||||
- { offset: 0x1E7BD4, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftVWOc', symObjAddr: 0x6D5C, symBinAddr: 0x1000E36B4, symSize: 0x110 }
|
||||
- { offset: 0x1E7BE8, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftVWOh', symObjAddr: 0x6E6C, symBinAddr: 0x1000E37C4, symSize: 0x70 }
|
||||
- { offset: 0x1E7BFC, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVMa', symObjAddr: 0x6EDC, symBinAddr: 0x1000E3834, symSize: 0x94 }
|
||||
- { offset: 0x1E7C10, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVABs10SetAlgebraSCWl', symObjAddr: 0x6F70, symBinAddr: 0x1000E38C8, symSize: 0x6C }
|
||||
- { offset: 0x1E7C24, size: 0x8, addend: 0x0, symName: '_$sSo29SFSpeechURLRecognitionRequestCMa', symObjAddr: 0x7080, symBinAddr: 0x1000E3960, symSize: 0x60 }
|
||||
- { offset: 0x1E7C38, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV3runyyKFySo25SFSpeechRecognitionResultCSg_s5Error_pSgtcfU0_TA', symObjAddr: 0x8228, symBinAddr: 0x1000E4B08, symSize: 0x64 }
|
||||
- { offset: 0x1E7C4C, size: 0x8, addend: 0x0, symName: '_$sSo25SFSpeechRecognitionResultCSgs5Error_pSgIeggg_ACSo7NSErrorCSgIeyByy_TR', symObjAddr: 0x828C, symBinAddr: 0x1000E4B6C, symSize: 0xC4 }
|
||||
- { offset: 0x1E7C64, size: 0x8, addend: 0x0, symName: _block_copy_helper.10, symObjAddr: 0x8350, symBinAddr: 0x1000E4C30, symSize: 0x44 }
|
||||
- { offset: 0x1E7C78, size: 0x8, addend: 0x0, symName: _block_destroy_helper.11, symObjAddr: 0x8394, symBinAddr: 0x1000E4C74, symSize: 0x18 }
|
||||
- { offset: 0x1E7C8C, size: 0x8, addend: 0x0, symName: '_$s10Foundation3URLVACSQAAWl', symObjAddr: 0x83AC, symBinAddr: 0x1000E4C8C, symSize: 0x6C }
|
||||
- { offset: 0x1E7CA0, size: 0x8, addend: 0x0, symName: '_$sSo6NSTaskCMa', symObjAddr: 0x8418, symBinAddr: 0x1000E4CF8, symSize: 0x60 }
|
||||
- { offset: 0x1E7CB4, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftVAC14ArgumentParser15ParsableCommandAAWl', symObjAddr: 0x850C, symBinAddr: 0x1000E4D8C, symSize: 0x68 }
|
||||
- { offset: 0x1E7CC8, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLOAFSHAAWl', symObjAddr: 0x8A90, symBinAddr: 0x1000E5310, symSize: 0x68 }
|
||||
- { offset: 0x1E7CDC, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLOAFs0D3KeyAAWl', symObjAddr: 0x8D28, symBinAddr: 0x1000E55A8, symSize: 0x68 }
|
||||
- { offset: 0x1E7CF0, size: 0x8, addend: 0x0, symName: '_$s14ArgumentParser0A0VySSGACyxGSeAAWl', symObjAddr: 0x963C, symBinAddr: 0x1000E5E10, symSize: 0x74 }
|
||||
- { offset: 0x1E7D04, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV9inputPath06outputE04uuid8languageAC14ArgumentParser0I0VySSG_AKS2StcfcfA_', symObjAddr: 0x9724, symBinAddr: 0x1000E5E84, symSize: 0xAC }
|
||||
- { offset: 0x1E7D22, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV9inputPath06outputE04uuid8languageAC14ArgumentParser0I0VySSG_AKS2StcfcfA0_', symObjAddr: 0x97D0, symBinAddr: 0x1000E5F30, symSize: 0xAC }
|
||||
- { offset: 0x1E7D40, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV9inputPath06outputE04uuid8languageAC14ArgumentParser0I0VySSG_AKS2StcfcfA1_', symObjAddr: 0x987C, symBinAddr: 0x1000E5FDC, symSize: 0x28 }
|
||||
- { offset: 0x1E7D5E, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV9inputPath06outputE04uuid8languageAC14ArgumentParser0I0VySSG_AKS2StcfcfA2_', symObjAddr: 0x98A4, symBinAddr: 0x1000E6004, symSize: 0x28 }
|
||||
- { offset: 0x1E7D7C, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV14ArgumentParser15ParsableCommandAAWI', symObjAddr: 0x9B6C, symBinAddr: 0x1000E62CC, symSize: 0x28 }
|
||||
- { offset: 0x1E7D90, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftVAC14ArgumentParser17ParsableArgumentsAAWl', symObjAddr: 0x9B94, symBinAddr: 0x1000E62F4, symSize: 0x68 }
|
||||
- { offset: 0x1E7DA4, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV14ArgumentParser17ParsableArgumentsAAWI', symObjAddr: 0x9BFC, symBinAddr: 0x1000E635C, symSize: 0x28 }
|
||||
- { offset: 0x1E7DB8, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftVACSeAAWl', symObjAddr: 0x9C24, symBinAddr: 0x1000E6384, symSize: 0x68 }
|
||||
- { offset: 0x1E7DCC, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftVwCP', symObjAddr: 0x9C8C, symBinAddr: 0x1000E63EC, symSize: 0x3C }
|
||||
- { offset: 0x1E7DE0, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftVwxx', symObjAddr: 0x9CC8, symBinAddr: 0x1000E6428, symSize: 0x6C }
|
||||
- { offset: 0x1E7DF4, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftVwcp', symObjAddr: 0x9D34, symBinAddr: 0x1000E6494, symSize: 0x110 }
|
||||
- { offset: 0x1E7E08, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftVwca', symObjAddr: 0x9E44, symBinAddr: 0x1000E65A4, symSize: 0x154 }
|
||||
- { offset: 0x1E7E1C, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftVwta', symObjAddr: 0x9FC4, symBinAddr: 0x1000E66F8, symSize: 0xE0 }
|
||||
- { offset: 0x1E7E30, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftVwet', symObjAddr: 0xA0A4, symBinAddr: 0x1000E67D8, symSize: 0xF8 }
|
||||
- { offset: 0x1E7E44, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftVwst', symObjAddr: 0xA19C, symBinAddr: 0x1000E68D0, symSize: 0x1D8 }
|
||||
- { offset: 0x1E7E58, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftVMa', symObjAddr: 0xA374, symBinAddr: 0x1000E6AA8, symSize: 0x14 }
|
||||
- { offset: 0x1E7E6C, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLOwet', symObjAddr: 0xA398, symBinAddr: 0x1000E6ABC, symSize: 0x168 }
|
||||
- { offset: 0x1E7E80, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLOwst', symObjAddr: 0xA500, symBinAddr: 0x1000E6C24, symSize: 0x1FC }
|
||||
- { offset: 0x1E7E94, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLOwug', symObjAddr: 0xA6FC, symBinAddr: 0x1000E6E20, symSize: 0x8 }
|
||||
- { offset: 0x1E7EA8, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLOwup', symObjAddr: 0xA704, symBinAddr: 0x1000E6E28, symSize: 0x4 }
|
||||
- { offset: 0x1E7EBC, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLOwui', symObjAddr: 0xA708, symBinAddr: 0x1000E6E2C, symSize: 0x8 }
|
||||
- { offset: 0x1E7ED0, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLOMa', symObjAddr: 0xA710, symBinAddr: 0x1000E6E34, symSize: 0x14 }
|
||||
- { offset: 0x1E7EE4, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVs9OptionSetSCSYWb', symObjAddr: 0xB050, symBinAddr: 0x1000E7590, symSize: 0x14 }
|
||||
- { offset: 0x1E7EF8, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVABSYSCWl', symObjAddr: 0xB064, symBinAddr: 0x1000E75A4, symSize: 0x6C }
|
||||
- { offset: 0x1E7F0C, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVs9OptionSetSCs0D7AlgebraPWb', symObjAddr: 0xB0D0, symBinAddr: 0x1000E7610, symSize: 0x14 }
|
||||
- { offset: 0x1E7F20, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLOs0D3KeyAAs28CustomDebugStringConvertiblePWb', symObjAddr: 0xB0E4, symBinAddr: 0x1000E7624, symSize: 0x14 }
|
||||
- { offset: 0x1E7F34, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLOAFs28CustomDebugStringConvertibleAAWl', symObjAddr: 0xB0F8, symBinAddr: 0x1000E7638, symSize: 0x68 }
|
||||
- { offset: 0x1E7F48, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLOs0D3KeyAAs23CustomStringConvertiblePWb', symObjAddr: 0xB160, symBinAddr: 0x1000E76A0, symSize: 0x14 }
|
||||
- { offset: 0x1E7F5C, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLOAFs23CustomStringConvertibleAAWl', symObjAddr: 0xB174, symBinAddr: 0x1000E76B4, symSize: 0x68 }
|
||||
- { offset: 0x1E7F70, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLOSHAASQWb', symObjAddr: 0xB1DC, symBinAddr: 0x1000E771C, symSize: 0x14 }
|
||||
- { offset: 0x1E7F84, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLOAFSQAAWl', symObjAddr: 0xB1F0, symBinAddr: 0x1000E7730, symSize: 0x68 }
|
||||
- { offset: 0x1E7F98, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVs10SetAlgebraSCSQWb', symObjAddr: 0xB258, symBinAddr: 0x1000E7798, symSize: 0x14 }
|
||||
- { offset: 0x1E7FAC, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVABSQSCWl', symObjAddr: 0xB26C, symBinAddr: 0x1000E77AC, symSize: 0x6C }
|
||||
- { offset: 0x1E7FC0, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVs10SetAlgebraSCs25ExpressibleByArrayLiteralPWb', symObjAddr: 0xB2D8, symBinAddr: 0x1000E7818, symSize: 0x14 }
|
||||
- { offset: 0x1E7FD4, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVABs25ExpressibleByArrayLiteralSCWl', symObjAddr: 0xB2EC, symBinAddr: 0x1000E782C, symSize: 0x6C }
|
||||
- { offset: 0x1E7FE8, size: 0x8, addend: 0x0, symName: '_$sSo37SFSpeechRecognizerAuthorizationStatusVABSYSCWl', symObjAddr: 0xB358, symBinAddr: 0x1000E7898, symSize: 0x6C }
|
||||
- { offset: 0x1E7FFC, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVABs9OptionSetSCWl', symObjAddr: 0xB3C4, symBinAddr: 0x1000E7904, symSize: 0x6C }
|
||||
- { offset: 0x1E8010, size: 0x8, addend: 0x0, symName: '_$sSo22SFTranscriptionSegmentCMa', symObjAddr: 0xB498, symBinAddr: 0x1000E7974, symSize: 0x60 }
|
||||
- { offset: 0x1E8024, size: 0x8, addend: 0x0, symName: '_$sSaySo22SFTranscriptionSegmentCGSayxGSlsWl', symObjAddr: 0xB4F8, symBinAddr: 0x1000E79D4, symSize: 0x74 }
|
||||
- { offset: 0x1E8038, size: 0x8, addend: 0x0, symName: '_$ss16IndexingIteratorVySaySo22SFTranscriptionSegmentCGGWOh', symObjAddr: 0xB56C, symBinAddr: 0x1000E7A48, symSize: 0x28 }
|
||||
- { offset: 0x1E804C, size: 0x8, addend: 0x0, symName: '_$sSa22_allocateUninitializedySayxG_SpyxGtSiFZSo20NSDataWritingOptionsV_Tt0gq5', symObjAddr: 0xB5A0, symBinAddr: 0x1000E7A70, symSize: 0xD4 }
|
||||
- { offset: 0x1E8079, size: 0x8, addend: 0x0, symName: '_$sSo20NSDataWritingOptionsVMa', symObjAddr: 0xB674, symBinAddr: 0x1000E7B44, symSize: 0x94 }
|
||||
- { offset: 0x1E808E, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV9inputPathSSvg', symObjAddr: 0x1734, symBinAddr: 0x1000DE33C, symSize: 0x9C }
|
||||
- { offset: 0x1E80BE, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV9inputPathSSvs', symObjAddr: 0x19A0, symBinAddr: 0x1000DE520, symSize: 0x8C }
|
||||
- { offset: 0x1E80F2, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV9inputPathSSvM', symObjAddr: 0x1A2C, symBinAddr: 0x1000DE5AC, symSize: 0xB0 }
|
||||
- { offset: 0x1E8117, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV9inputPathSSvM.resume.0', symObjAddr: 0x1ADC, symBinAddr: 0x1000DE65C, symSize: 0xB8 }
|
||||
- { offset: 0x1E81DB, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10_inputPath33_D25DB757439FC08881580587A9BB3263LL14ArgumentParser0K0VySSGvg', symObjAddr: 0x1C90, symBinAddr: 0x1000DE7C0, symSize: 0x40 }
|
||||
- { offset: 0x1E81EF, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10_inputPath33_D25DB757439FC08881580587A9BB3263LL14ArgumentParser0K0VySSGvs', symObjAddr: 0x1CD0, symBinAddr: 0x1000DE800, symSize: 0x60 }
|
||||
- { offset: 0x1E8203, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10outputPathSSvg', symObjAddr: 0x1D30, symBinAddr: 0x1000DE860, symSize: 0x9C }
|
||||
- { offset: 0x1E8228, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10outputPathSSvs', symObjAddr: 0x1E88, symBinAddr: 0x1000DE9B8, symSize: 0x94 }
|
||||
- { offset: 0x1E825C, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10outputPathSSvM', symObjAddr: 0x1F1C, symBinAddr: 0x1000DEA4C, symSize: 0xB0 }
|
||||
- { offset: 0x1E8281, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10outputPathSSvM.resume.0', symObjAddr: 0x1FCC, symBinAddr: 0x1000DEAFC, symSize: 0xC0 }
|
||||
- { offset: 0x1E82A2, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV11_outputPath33_D25DB757439FC08881580587A9BB3263LL14ArgumentParser0K0VySSGvg', symObjAddr: 0x2138, symBinAddr: 0x1000DEC68, symSize: 0x40 }
|
||||
- { offset: 0x1E82B6, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV11_outputPath33_D25DB757439FC08881580587A9BB3263LL14ArgumentParser0K0VySSGvs', symObjAddr: 0x2178, symBinAddr: 0x1000DECA8, symSize: 0x60 }
|
||||
- { offset: 0x1E82CA, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV4uuidSSvg', symObjAddr: 0x2450, symBinAddr: 0x1000DEF60, symSize: 0x9C }
|
||||
- { offset: 0x1E82EF, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV4uuidSSvs', symObjAddr: 0x2634, symBinAddr: 0x1000DF144, symSize: 0x94 }
|
||||
- { offset: 0x1E8323, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV4uuidSSvM', symObjAddr: 0x26C8, symBinAddr: 0x1000DF1D8, symSize: 0xB0 }
|
||||
- { offset: 0x1E8348, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV4uuidSSvM.resume.0', symObjAddr: 0x2778, symBinAddr: 0x1000DF288, symSize: 0xC0 }
|
||||
- { offset: 0x1E8369, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV5_uuid33_D25DB757439FC08881580587A9BB3263LL14ArgumentParser6OptionVySSGvg', symObjAddr: 0x2860, symBinAddr: 0x1000DF370, symSize: 0x40 }
|
||||
- { offset: 0x1E837D, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV5_uuid33_D25DB757439FC08881580587A9BB3263LL14ArgumentParser6OptionVySSGvs', symObjAddr: 0x28A0, symBinAddr: 0x1000DF3B0, symSize: 0x60 }
|
||||
- { offset: 0x1E8391, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV8languageSSvg', symObjAddr: 0x2B58, symBinAddr: 0x1000DF668, symSize: 0x9C }
|
||||
- { offset: 0x1E83B6, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV8languageSSvs', symObjAddr: 0x2CB0, symBinAddr: 0x1000DF7C0, symSize: 0x94 }
|
||||
- { offset: 0x1E83EA, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV8languageSSvM', symObjAddr: 0x2D44, symBinAddr: 0x1000DF854, symSize: 0xB0 }
|
||||
- { offset: 0x1E840F, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV8languageSSvM.resume.0', symObjAddr: 0x2DF4, symBinAddr: 0x1000DF904, symSize: 0xC0 }
|
||||
- { offset: 0x1E8430, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV9_language33_D25DB757439FC08881580587A9BB3263LL14ArgumentParser6OptionVySSGvg', symObjAddr: 0x2EDC, symBinAddr: 0x1000DF9EC, symSize: 0x40 }
|
||||
- { offset: 0x1E8444, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV9_language33_D25DB757439FC08881580587A9BB3263LL14ArgumentParser6OptionVySSGvs', symObjAddr: 0x2F1C, symBinAddr: 0x1000DFA2C, symSize: 0x60 }
|
||||
- { offset: 0x1E8458, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV14detectLanguageSSyF', symObjAddr: 0x2F7C, symBinAddr: 0x1000DFA8C, symSize: 0x640 }
|
||||
- { offset: 0x1E8658, size: 0x8, addend: 0x0, symName: '_$sSo18SFSpeechRecognizerC6localeABSg10Foundation6LocaleV_tcfC', symObjAddr: 0x36B8, symBinAddr: 0x1000E012C, symSize: 0x3C }
|
||||
- { offset: 0x1E866C, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV3runyyKF', symObjAddr: 0x3774, symBinAddr: 0x1000E0168, symSize: 0x320C }
|
||||
- { offset: 0x1E884B, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV3runyyKFySo37SFSpeechRecognizerAuthorizationStatusVcfU_', symObjAddr: 0x6AC4, symBinAddr: 0x1000E341C, symSize: 0x78 }
|
||||
- { offset: 0x1E8894, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV3runyyKFySo25SFSpeechRecognitionResultCSg_s5Error_pSgtcfU0_', symObjAddr: 0x7158, symBinAddr: 0x1000E3A38, symSize: 0x1018 }
|
||||
- { offset: 0x1E89D1, size: 0x8, addend: 0x0, symName: '_$sSo6NSTaskCABycfC', symObjAddr: 0x6A44, symBinAddr: 0x1000E339C, symSize: 0x2C }
|
||||
- { offset: 0x1E89F0, size: 0x8, addend: 0x0, symName: '_$sSo7NSErrorC6domain4code8userInfoABSS_SiSDySSypGSgtcfC', symObjAddr: 0x6A70, symBinAddr: 0x1000E33C8, symSize: 0x54 }
|
||||
- { offset: 0x1E8A04, size: 0x8, addend: 0x0, symName: '_$sSo37SFSpeechRecognizerAuthorizationStatusV8rawValueSivg', symObjAddr: 0x6D40, symBinAddr: 0x1000E3698, symSize: 0x1C }
|
||||
- { offset: 0x1E8A26, size: 0x8, addend: 0x0, symName: '_$s10Foundation4DataV5write2to7optionsyAA3URLV_So20NSDataWritingOptionsVtKFfA0_', symObjAddr: 0x6FDC, symBinAddr: 0x1000E3934, symSize: 0x2C }
|
||||
- { offset: 0x1E8A45, size: 0x8, addend: 0x0, symName: '_$sSo29SFSpeechURLRecognitionRequestC3urlAB10Foundation3URLV_tcfC', symObjAddr: 0x70E0, symBinAddr: 0x1000E39C0, symSize: 0x3C }
|
||||
- { offset: 0x1E8A65, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV5$mainyyFZ', symObjAddr: 0x84D8, symBinAddr: 0x1000E4D58, symSize: 0x34 }
|
||||
- { offset: 0x1E8A91, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLO11stringValueAFSgSS_tcfC', symObjAddr: 0x8574, symBinAddr: 0x1000E4DF4, symSize: 0x2B8 }
|
||||
- { offset: 0x1E8AB3, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLO8intValueAFSgSi_tcfC', symObjAddr: 0x882C, symBinAddr: 0x1000E50AC, symSize: 0x18 }
|
||||
- { offset: 0x1E8AD5, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLO21__derived_enum_equalsySbAF_AFtFZ', symObjAddr: 0x8844, symBinAddr: 0x1000E50C4, symSize: 0x130 }
|
||||
- { offset: 0x1E8B12, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLO4hash4intoys6HasherVz_tF', symObjAddr: 0x8974, symBinAddr: 0x1000E51F4, symSize: 0xD4 }
|
||||
- { offset: 0x1E8B42, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLO9hashValueSivg', symObjAddr: 0x8A48, symBinAddr: 0x1000E52C8, symSize: 0x48 }
|
||||
- { offset: 0x1E8B64, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLO8intValueSiSgvg', symObjAddr: 0x8AF8, symBinAddr: 0x1000E5378, symSize: 0x1C }
|
||||
- { offset: 0x1E8B86, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLO11stringValueSSvg', symObjAddr: 0x8B14, symBinAddr: 0x1000E5394, symSize: 0x104 }
|
||||
- { offset: 0x1E8BB3, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLOSQAASQ2eeoiySbx_xtFZTW', symObjAddr: 0x8C18, symBinAddr: 0x1000E5498, symSize: 0x20 }
|
||||
- { offset: 0x1E8BC7, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLOSHAASH9hashValueSivgTW', symObjAddr: 0x8C38, symBinAddr: 0x1000E54B8, symSize: 0x18 }
|
||||
- { offset: 0x1E8BDB, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLOSHAASH4hash4intoys6HasherVz_tFTW', symObjAddr: 0x8C50, symBinAddr: 0x1000E54D0, symSize: 0x18 }
|
||||
- { offset: 0x1E8BEF, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLOSHAASH13_rawHashValue4seedS2i_tFTW', symObjAddr: 0x8C68, symBinAddr: 0x1000E54E8, symSize: 0x14 }
|
||||
- { offset: 0x1E8C03, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLOs0D3KeyAAsAGP11stringValueSSvgTW', symObjAddr: 0x8C7C, symBinAddr: 0x1000E54FC, symSize: 0x18 }
|
||||
- { offset: 0x1E8C17, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLOs0D3KeyAAsAGP11stringValuexSgSS_tcfCTW', symObjAddr: 0x8C94, symBinAddr: 0x1000E5514, symSize: 0x28 }
|
||||
- { offset: 0x1E8C2B, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLOs0D3KeyAAsAGP8intValueSiSgvgTW', symObjAddr: 0x8CBC, symBinAddr: 0x1000E553C, symSize: 0x18 }
|
||||
- { offset: 0x1E8C3F, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLOs0D3KeyAAsAGP8intValuexSgSi_tcfCTW', symObjAddr: 0x8CD4, symBinAddr: 0x1000E5554, symSize: 0x28 }
|
||||
- { offset: 0x1E8C53, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLOs28CustomDebugStringConvertibleAAsAGP16debugDescriptionSSvgTW', symObjAddr: 0x8CFC, symBinAddr: 0x1000E557C, symSize: 0x2C }
|
||||
- { offset: 0x1E8C67, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV10CodingKeys33_D25DB757439FC08881580587A9BB3263LLOs23CustomStringConvertibleAAsAGP11descriptionSSvgTW', symObjAddr: 0x8D90, symBinAddr: 0x1000E5610, symSize: 0x2C }
|
||||
- { offset: 0x1E8C7B, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftVACycfC', symObjAddr: 0x8DBC, symBinAddr: 0x1000E563C, symSize: 0x214 }
|
||||
- { offset: 0x1E8CA0, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV4fromACs7Decoder_p_tKcfC', symObjAddr: 0x8FD0, symBinAddr: 0x1000E5850, symSize: 0x5C0 }
|
||||
- { offset: 0x1E8CC4, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV9inputPath06outputE04uuid8languageAC14ArgumentParser0I0VySSG_AKS2StcfC', symObjAddr: 0x98CC, symBinAddr: 0x1000E602C, symSize: 0xE0 }
|
||||
- { offset: 0x1E8CE3, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV14ArgumentParser15ParsableCommandAadEP13configurationAD0G13ConfigurationVvgZTW', symObjAddr: 0x99AC, symBinAddr: 0x1000E610C, symSize: 0x3C }
|
||||
- { offset: 0x1E8CF7, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV14ArgumentParser15ParsableCommandAadEP12_commandNameSSvgZTW', symObjAddr: 0x99E8, symBinAddr: 0x1000E6148, symSize: 0x14 }
|
||||
- { offset: 0x1E8D0B, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV14ArgumentParser15ParsableCommandAadEP3runyyKFTW', symObjAddr: 0x99FC, symBinAddr: 0x1000E615C, symSize: 0x44 }
|
||||
- { offset: 0x1E8D1F, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV14ArgumentParser17ParsableArgumentsAadEPxycfCTW', symObjAddr: 0x9A40, symBinAddr: 0x1000E61A0, symSize: 0x3C }
|
||||
- { offset: 0x1E8D33, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV14ArgumentParser17ParsableArgumentsAadEP8validateyyKFTW', symObjAddr: 0x9A7C, symBinAddr: 0x1000E61DC, symSize: 0x44 }
|
||||
- { offset: 0x1E8D47, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV14ArgumentParser17ParsableArgumentsAadEP11_errorLabelSSvgZTW', symObjAddr: 0x9AC0, symBinAddr: 0x1000E6220, symSize: 0x14 }
|
||||
- { offset: 0x1E8D5B, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftV14ArgumentParser17ParsableArgumentsAadEP12_errorPrefixSSvgZTW', symObjAddr: 0x9AD4, symBinAddr: 0x1000E6234, symSize: 0x14 }
|
||||
- { offset: 0x1E8D6F, size: 0x8, addend: 0x0, symName: '_$s9asr_swift8ASRSwiftVSeAASe4fromxs7Decoder_p_tKcfCTW', symObjAddr: 0x9AE8, symBinAddr: 0x1000E6248, symSize: 0x6C }
|
||||
- { offset: 0x1E8D83, size: 0x8, addend: 0x0, symName: _asr_swift_main, symObjAddr: 0x9B54, symBinAddr: 0x1000E62B4, symSize: 0x18 }
|
||||
- { offset: 0x1E8D97, size: 0x8, addend: 0x0, symName: '_$sSo18SFSpeechRecognizerC6localeABSg10Foundation6LocaleV_tcfcTO', symObjAddr: 0xA724, symBinAddr: 0x1000E6E48, symSize: 0x80 }
|
||||
- { offset: 0x1E8DAB, size: 0x8, addend: 0x0, symName: '_$sSo6NSTaskCABycfcTO', symObjAddr: 0xA7A4, symBinAddr: 0x1000E6EC8, symSize: 0x18 }
|
||||
- { offset: 0x1E8DBF, size: 0x8, addend: 0x0, symName: '_$sSo7NSErrorC6domain4code8userInfoABSS_SiSDySSypGSgtcfcTO', symObjAddr: 0xA7BC, symBinAddr: 0x1000E6EE0, symSize: 0xE8 }
|
||||
- { offset: 0x1E8DDE, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsV8rawValueABSu_tcfC', symObjAddr: 0xA8A4, symBinAddr: 0x1000E6FC8, symSize: 0x4 }
|
||||
- { offset: 0x1E8DF2, size: 0x8, addend: 0x0, symName: '_$sSo29SFSpeechURLRecognitionRequestC3urlAB10Foundation3URLV_tcfcTO', symObjAddr: 0xA8A8, symBinAddr: 0x1000E6FCC, symSize: 0x80 }
|
||||
- { offset: 0x1E8E11, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVs10SetAlgebraSCsACPxycfCTW', symObjAddr: 0xA970, symBinAddr: 0x1000E7094, symSize: 0x40 }
|
||||
- { offset: 0x1E8E25, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVs10SetAlgebraSCsACP8containsySb7ElementQzFTW', symObjAddr: 0xA9B0, symBinAddr: 0x1000E70D4, symSize: 0x38 }
|
||||
- { offset: 0x1E8E39, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVs10SetAlgebraSCsACP5unionyxxnFTW', symObjAddr: 0xA9E8, symBinAddr: 0x1000E710C, symSize: 0x3C }
|
||||
- { offset: 0x1E8E4D, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVs10SetAlgebraSCsACP12intersectionyxxFTW', symObjAddr: 0xAA24, symBinAddr: 0x1000E7148, symSize: 0x3C }
|
||||
- { offset: 0x1E8E61, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVs10SetAlgebraSCsACP19symmetricDifferenceyxxnFTW', symObjAddr: 0xAA60, symBinAddr: 0x1000E7184, symSize: 0x3C }
|
||||
- { offset: 0x1E8E80, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVs10SetAlgebraSCsACP6insertySb8inserted_7ElementQz17memberAfterInserttAHnFTW', symObjAddr: 0xAA9C, symBinAddr: 0x1000E71C0, symSize: 0x4C }
|
||||
- { offset: 0x1E8EAA, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVs10SetAlgebraSCsACP6removey7ElementQzSgAGFTW', symObjAddr: 0xACCC, symBinAddr: 0x1000E720C, symSize: 0x3C }
|
||||
- { offset: 0x1E8EBE, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVs10SetAlgebraSCsACP6update4with7ElementQzSgAHn_tFTW', symObjAddr: 0xAD08, symBinAddr: 0x1000E7248, symSize: 0x3C }
|
||||
- { offset: 0x1E8ED2, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVs10SetAlgebraSCsACP9formUnionyyxnFTW', symObjAddr: 0xAD44, symBinAddr: 0x1000E7284, symSize: 0x40 }
|
||||
- { offset: 0x1E8EE6, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVs10SetAlgebraSCsACP16formIntersectionyyxFTW', symObjAddr: 0xAD84, symBinAddr: 0x1000E72C4, symSize: 0x40 }
|
||||
- { offset: 0x1E8EFA, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVs10SetAlgebraSCsACP23formSymmetricDifferenceyyxnFTW', symObjAddr: 0xADC4, symBinAddr: 0x1000E7304, symSize: 0x40 }
|
||||
- { offset: 0x1E8F0E, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVs10SetAlgebraSCsACP11subtractingyxxFTW', symObjAddr: 0xAE04, symBinAddr: 0x1000E7344, symSize: 0x14 }
|
||||
- { offset: 0x1E8F22, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVs10SetAlgebraSCsACP8isSubset2ofSbx_tFTW', symObjAddr: 0xAE18, symBinAddr: 0x1000E7358, symSize: 0x18 }
|
||||
- { offset: 0x1E8F36, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVs10SetAlgebraSCsACP10isDisjoint4withSbx_tFTW', symObjAddr: 0xAE30, symBinAddr: 0x1000E7370, symSize: 0x18 }
|
||||
- { offset: 0x1E8F4A, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVs10SetAlgebraSCsACP10isSuperset2ofSbx_tFTW', symObjAddr: 0xAE48, symBinAddr: 0x1000E7388, symSize: 0x18 }
|
||||
- { offset: 0x1E8F5E, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVs10SetAlgebraSCsACP7isEmptySbvgTW', symObjAddr: 0xAE60, symBinAddr: 0x1000E73A0, symSize: 0x18 }
|
||||
- { offset: 0x1E8F72, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVs10SetAlgebraSCsACPyxqd__ncSTRd__7ElementQyd__AERtzlufCTW', symObjAddr: 0xAE78, symBinAddr: 0x1000E73B8, symSize: 0x38 }
|
||||
- { offset: 0x1E8F86, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVs10SetAlgebraSCsACP8subtractyyxFTW', symObjAddr: 0xAEB0, symBinAddr: 0x1000E73F0, symSize: 0x14 }
|
||||
- { offset: 0x1E8FA5, size: 0x8, addend: 0x0, symName: '_$sSo37SFSpeechRecognizerAuthorizationStatusVSYSCSY8rawValuexSg03RawF0Qz_tcfCTW', symObjAddr: 0xAEC4, symBinAddr: 0x1000E7404, symSize: 0x30 }
|
||||
- { offset: 0x1E8FC4, size: 0x8, addend: 0x0, symName: '_$sSo37SFSpeechRecognizerAuthorizationStatusV8rawValueABSgSi_tcfC', symObjAddr: 0xAEF4, symBinAddr: 0x1000E7434, symSize: 0x24 }
|
||||
- { offset: 0x1E8FF5, size: 0x8, addend: 0x0, symName: '_$sSo37SFSpeechRecognizerAuthorizationStatusVSYSCSY8rawValue03RawF0QzvgTW', symObjAddr: 0xAF18, symBinAddr: 0x1000E7458, symSize: 0x2C }
|
||||
- { offset: 0x1E9009, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVs25ExpressibleByArrayLiteralSCsACP05arrayF0x0eF7ElementQzd_tcfCTW', symObjAddr: 0xAF8C, symBinAddr: 0x1000E74CC, symSize: 0x3C }
|
||||
- { offset: 0x1E901D, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVs9OptionSetSCsACP8rawValuex03RawF0Qz_tcfCTW', symObjAddr: 0xAFC8, symBinAddr: 0x1000E7508, symSize: 0x2C }
|
||||
- { offset: 0x1E9031, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVSYSCSY8rawValuexSg03RawD0Qz_tcfCTW', symObjAddr: 0xAFF4, symBinAddr: 0x1000E7534, symSize: 0x30 }
|
||||
- { offset: 0x1E9045, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsVSYSCSY8rawValue03RawD0QzvgTW', symObjAddr: 0xB024, symBinAddr: 0x1000E7564, symSize: 0x2C }
|
||||
- { offset: 0x1E9059, size: 0x8, addend: 0x0, symName: '_$sSo20NSJSONWritingOptionsV8rawValueSuvg', symObjAddr: 0xB494, symBinAddr: 0x1000E7970, symSize: 0x4 }
|
||||
...
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -26,5 +26,89 @@ let package = Package(
|
||||
path: ".",
|
||||
sources: ["asrx_swift.swift"]
|
||||
),
|
||||
.executableTarget(
|
||||
name: "speaker_test",
|
||||
dependencies: [],
|
||||
path: ".",
|
||||
sources: ["speaker_test.swift"]
|
||||
),
|
||||
.executableTarget(
|
||||
name: "speaker_meta_test",
|
||||
dependencies: [],
|
||||
path: ".",
|
||||
sources: ["speaker_meta_test.swift"]
|
||||
),
|
||||
.executableTarget(
|
||||
name: "face_vision_test",
|
||||
dependencies: [
|
||||
.product(name: "ArgumentParser", package: "swift-argument-parser"),
|
||||
],
|
||||
path: ".",
|
||||
sources: ["face_vision_test.swift"]
|
||||
),
|
||||
.executableTarget(
|
||||
name: "vision_object_test",
|
||||
dependencies: [
|
||||
.product(name: "ArgumentParser", package: "swift-argument-parser"),
|
||||
],
|
||||
path: ".",
|
||||
sources: ["vision_object_test.swift"]
|
||||
),
|
||||
.executableTarget(
|
||||
name: "swift_cut_test",
|
||||
dependencies: [
|
||||
.product(name: "ArgumentParser", package: "swift-argument-parser"),
|
||||
],
|
||||
path: ".",
|
||||
sources: ["swift_cut_test.swift"]
|
||||
),
|
||||
.executableTarget(
|
||||
name: "vision_ocr_test",
|
||||
dependencies: [
|
||||
.product(name: "ArgumentParser", package: "swift-argument-parser"),
|
||||
],
|
||||
path: ".",
|
||||
sources: ["vision_ocr_test.swift"]
|
||||
),
|
||||
.executableTarget(
|
||||
name: "swift_ocr",
|
||||
dependencies: [
|
||||
.product(name: "ArgumentParser", package: "swift-argument-parser"),
|
||||
],
|
||||
path: ".",
|
||||
sources: ["swift_ocr.swift"]
|
||||
),
|
||||
.executableTarget(
|
||||
name: "face_compare_test",
|
||||
dependencies: [
|
||||
.product(name: "ArgumentParser", package: "swift-argument-parser"),
|
||||
],
|
||||
path: ".",
|
||||
sources: ["face_compare_test.swift"]
|
||||
),
|
||||
.executableTarget(
|
||||
name: "pose_benchmark",
|
||||
dependencies: [
|
||||
.product(name: "ArgumentParser", package: "swift-argument-parser"),
|
||||
],
|
||||
path: ".",
|
||||
sources: ["pose_benchmark.swift"]
|
||||
),
|
||||
.executableTarget(
|
||||
name: "swift_pose",
|
||||
dependencies: [
|
||||
.product(name: "ArgumentParser", package: "swift-argument-parser"),
|
||||
],
|
||||
path: ".",
|
||||
sources: ["swift_pose.swift"]
|
||||
),
|
||||
.executableTarget(
|
||||
name: "swift_face",
|
||||
dependencies: [
|
||||
.product(name: "ArgumentParser", package: "swift-argument-parser"),
|
||||
],
|
||||
path: ".",
|
||||
sources: ["swift_face.swift"]
|
||||
),
|
||||
]
|
||||
)
|
||||
|
||||
@@ -11,6 +11,69 @@ import ArgumentParser
|
||||
/// - 支援即時與批次辨識
|
||||
/// - 語言支援依作業系統版本
|
||||
|
||||
/// 合併逐字 segments 成句子
|
||||
/// 當相鄰 segment 間隔 < 0.5s 時合併,間隔 >= 0.5s 時視為句子邊界
|
||||
func mergeWordSegments(_ segments: [[String: Any]]) -> [[String: Any]] {
|
||||
let gapThreshold: TimeInterval = 0.5
|
||||
var merged: [[String: Any]] = []
|
||||
var current: [String: Any]? = nil
|
||||
|
||||
for seg in segments {
|
||||
guard let start = seg["start"] as? TimeInterval,
|
||||
let end = seg["end"] as? TimeInterval,
|
||||
let text = seg["text"] as? String,
|
||||
let conf = seg["confidence"] as? Float else {
|
||||
continue
|
||||
}
|
||||
|
||||
if var cur = current {
|
||||
let curEnd = cur["end"] as? TimeInterval ?? 0
|
||||
let gap = start - curEnd
|
||||
|
||||
if gap < gapThreshold {
|
||||
// 合併到當前句子
|
||||
let curText = cur["text"] as? String ?? ""
|
||||
let curConf = cur["confidence"] as? Float ?? 0
|
||||
let wordCount = cur["_wordCount"] as? Int ?? 0
|
||||
cur["text"] = curText + (curText.hasSuffix(" ") ? "" : " ") + text
|
||||
cur["end"] = end
|
||||
// 用 confidence 加權平均(依字數)
|
||||
let totalWords = wordCount + 1
|
||||
cur["confidence"] = (curConf * Float(wordCount) + conf) / Float(totalWords)
|
||||
cur["_wordCount"] = totalWords
|
||||
current = cur
|
||||
} else {
|
||||
// 句子邊界:儲存當前,開始新的
|
||||
cur.removeValue(forKey: "_wordCount")
|
||||
merged.append(cur)
|
||||
current = [
|
||||
"start": start,
|
||||
"end": end,
|
||||
"text": text,
|
||||
"confidence": conf,
|
||||
"_wordCount": 1
|
||||
]
|
||||
}
|
||||
} else {
|
||||
current = [
|
||||
"start": start,
|
||||
"end": end,
|
||||
"text": text,
|
||||
"confidence": conf,
|
||||
"_wordCount": 1
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
if let cur = current {
|
||||
var finalCur = cur
|
||||
finalCur.removeValue(forKey: "_wordCount")
|
||||
merged.append(finalCur)
|
||||
}
|
||||
|
||||
return merged
|
||||
}
|
||||
|
||||
@main
|
||||
struct ASRSwift: ParsableCommand {
|
||||
@Argument(help: "音訊/影片檔案路徑")
|
||||
@@ -137,6 +200,13 @@ struct ASRSwift: ParsableCommand {
|
||||
allSegments.append(seg)
|
||||
}
|
||||
|
||||
// 合併逐字 segments 成句子
|
||||
if !allSegments.isEmpty {
|
||||
let beforeCount = allSegments.count
|
||||
allSegments = mergeWordSegments(allSegments)
|
||||
print("[ASR_Swift] Merged segments: \(beforeCount) → \(allSegments.count)")
|
||||
}
|
||||
|
||||
// 若無 segment,用整個文字建立一個
|
||||
if allSegments.isEmpty {
|
||||
let fullText = result.bestTranscription.formattedString
|
||||
@@ -155,7 +225,10 @@ struct ASRSwift: ParsableCommand {
|
||||
}
|
||||
|
||||
// RunLoop 是必要的 — Speech Framework 需要 main runloop 觸發 callback
|
||||
RunLoop.current.run(until: Date(timeIntervalSinceNow: 120))
|
||||
// 使用 semaphore 等待完成,避免固定 timeout
|
||||
while semaphore.wait(timeout: .now()) == .timedOut {
|
||||
RunLoop.current.run(mode: .default, before: Date(timeIntervalSinceNow: 0.1))
|
||||
}
|
||||
task.cancel()
|
||||
|
||||
// 3. 輸出 JSON
|
||||
|
||||
@@ -268,8 +268,21 @@ def process_yolo(
|
||||
if publisher:
|
||||
publisher.info("yolo", "YOLO_LOADING_MODEL")
|
||||
|
||||
# Load YOLOv8 model
|
||||
model = YOLO("yolov8n.pt")
|
||||
# Load YOLO model (prefer CoreML for ANE acceleration, fallback to PyTorch)
|
||||
model_path_mlpackage = os.path.join(
|
||||
os.path.dirname(os.path.abspath(__file__)), "..", "yolov5nu.mlpackage"
|
||||
)
|
||||
model_path_pt = os.path.join(
|
||||
os.path.dirname(os.path.abspath(__file__)), "..", "yolov5nu.pt"
|
||||
)
|
||||
if os.path.exists(model_path_mlpackage):
|
||||
model = YOLO(model_path_mlpackage)
|
||||
print("YOLO: CoreML model loaded (4.5x ANE acceleration)")
|
||||
elif os.path.exists(model_path_pt):
|
||||
model = YOLO(model_path_pt)
|
||||
print("YOLO: PyTorch model loaded")
|
||||
else:
|
||||
model = YOLO("yolov5nu.pt") # will auto-download
|
||||
|
||||
# Get video info
|
||||
import cv2
|
||||
|
||||
Reference in New Issue
Block a user