Endpoint
REST วิ่งผ่าน proxy ของ demo server (/api/mobile/request) เพื่อเลี่ยง CORS —
WebSocket ต่อจากเบราว์เซอร์ตรงไป nginx เพื่อทดสอบเส้นทางจริงทั้งเส้น
1 · REST — ihy-front-services
กดปุ่ม preset หรือกรอกเอง — ปุ่มที่มี 🔒 ต้องมี Bearer + App Session (ใช้ Login ด้านล่างก่อน)
— ยังไม่ได้ส่ง request —
2 · WebSocket — ihy-socket-service → gRPC เรา
ส่งเฟรม keypoint ในรูปแบบเดียวกับแอปมือถือ (frame-request-v1)
ผ่าน nginx → socket-service → gRPC slt.inference
—
3 · Text → Sign POST /api/v1/orchestrate
พิมพ์ประโยคไทย → LLM แตกเป็นลำดับคำ + คืน gesture queue พร้อม URL ของคลิป motion.
front-services ส่งต่อไปที่ /api/chat/orchestrate ของ demo server เครื่องนี้ (ผ่าน tailnet)
— ยังไม่ได้แปล —
4 · Sign → Text POST /api/v1/orchestrate/reverse
ลำดับ gloss (คั่นด้วยเว้นวรรค) → ประโยคไทย. ปุ่มด้านล่างดึงคำที่ commit จากแผง WebSocket ข้างบนมาใส่ให้ — ต่อ sign-to-text ครบวงจรตั้งแต่กล้องจนถึงประโยค
—
— ยังไม่ได้แปล —
5 · เฟรมต้องผ่าน 2 ด่าน
ด่านแรกทิ้งเฟรมเงียบ ๆ (ไม่ตอบกลับเลย) ด่านสองตอบ error code กลับมา — ดูได้ใน log ด้านบน
ด่าน 1 — socket-service buildFrameRequest (Go)
ts_ms,frame_width,frame_heightต้อง > 0- face ต้องมีทุกเฟรม —
face.present = trueและblendshape_scoresยาว 52 พอดี ค่า finite ทั้งหมด - มือที่ส่งมาต้องมี landmark ครบ 21 จุด ต่อมือ (all-or-nothing) — ไม่มีมือก็ไม่ต้องใส่
- landmark index ห้ามซ้ำ (face / hand / pose)
- pose เป็น optional
ด่าน 2 — gRPC เรา schema._decode_face (Python)
-
ถ้า
face.present = false→ ข้าม validation (ใช้ face เป็นศูนย์) — แต่ socket-service ตั้งPresent: trueตายตัว ลูกค้า mobile จึงเลี่ยงด่านนี้ไม่ได้ -
face.landmarksต้องมี ครบทั้ง 36 index ของ compact subset (ปาก/ริมฝีปาก 14 · ตา 12 · คิ้ว 10) ขาดแม้จุดเดียว →RESPONSE_CODE_MISSING_FACEทุกเฟรม blendshape_scoresต้อง 52 พอดีอีกครั้ง
index ที่ต้องส่ง (MediaPipe FaceMesh):
61 291 13 14 0 17 40 270 91 321 185 409 146 375 · 33 160 158 133 153 144 362 385 387 263 373 380 · 70 63 105 66 107 336 296 334 293 300