- UDP দিয়ে data গ্রহণ

PC দিক থেকে iOS দিকের 49993 পোর্টে “FACEMOTION3D_OtherStreaming” স্ট্রিং পাঠালে Facemotion3d UDP দিয়ে 60FPS-এ 49993 পোর্টে উত্তর পাঠায়।

- Python example

from socket import *
DstIP = "192.168.1.7"
DstPort = 49993
DstAddr = (DstIP,DstPort)
udpClntSock = socket(AF_INET, SOCK_DGRAM)
data = "FACEMOTION3D_OtherStreaming"
data = data.encode('utf-8')
udpClntSock.sendto(data,DstAddr)
server = socket(AF_INET, SOCK_DGRAM)
server.bind(("", 49983))
server.settimeout(0.05)

while True:
    try:
        messages, address = server.recvfrom(8192)
        print(messages.decode('utf-8'))
    except:
        pass

- প্রতি frame-এ পাঠানো string নিচের মতো।

eyeLookOutLeft&3|mouthPressRight&14|jawForward&8|browInnerUp&19|jawLeft&4|mouthShrugUpper&28|eyeSquintLeft&4|eyeWideLeft&0|mouthPucker&5|mouthLowerDownLeft&6|eyeBlinkLeft&29|mouthShrugLower&20|mouthSmileLeft&0|cheekSquintRight&9|eyeWideRight&0|mouthFunnel&4|mouthStretchRight&13|browDownRight&2|tongueOut&0|cheekSquintLeft&8|mouthStretchLeft&17|mouthUpperUpRight&10|noseSneerLeft&28|browOuterUpLeft&0|eyeLookInRight&15|mouthDimpleRight&7|mouthRollUpper&5|mouthLowerDownRight&6|mouthClose&6|mouthFrownLeft&3|eyeBlinkRight&29|mouthFrownRight&2|mouthUpperUpLeft&11|browDownLeft&1|eyeLookOutRight&0|cheekPuff&4|eyeLookInLeft&0|mouthDimpleLeft&8|eyeLookDownLeft&36|eyeSquintRight&4|mouthRollLower&7|eyeLookUpLeft&0|eyeLookUpRight&0|mouthSmileRight&0|jawRight&0|noseSneerRight&25|mouthPressLeft&13|jawOpen&4|browOuterUpRight&0|eyeLookDownRight&36|mouthLeft&1|mouthRight&0|FM_SAD&0|FM_ANGRY&0|FM_VF&0|FM_TH&0|FM_browUpRight&0|FM_browUpLeft&0|=head#-22.167973,0.45402408,-4.8798294,-0.039975993,-0.048437987,-0.45562273|rightEye#12.759762,5.527712,1.2244859|leftEye#12.862795,1.264116,0.28145725|

- প্রতি frame-এ পাঠানো strings নিচের মতো।

BlendShape Name&Parameters (0 ~ 100) | BlendShape Names-Parameters (0 ~ 100) | .... | = head # Euler angles X (degree), Euler angles Y, Euler angles Z, Position values X, Position values Y, Position values Z | rightEye #Euler angles X, Euler angles Y, Euler angles Z | leftEye #Euler angles X, Euler angles Y, Euler angles Z |

Parameter-এ negative value থাকতে পারে অথবা value 100-এর বেশি হতে পারে।

Angle-related data radians নয়, degrees হিসেবে পাঠানো হয়।

- TCP/IP দিয়ে data গ্রহণ

UDP হলে ফ্রেম বাদ যেতে পারে, তাই TCP/IP দিয়ে গ্রহণ করার পদ্ধতিও আছে।

UDP দিয়ে iOS দিকের 49993 পোর্টে “FACEMOTION3D_OtherStreaming|protocol=tcp” পাঠালে ডেটা PC দিকের 49986 পোর্টে পাঠানো হবে।

পাঠানো স্ট্রিংটি UDP-এর সময় পাঠানো স্ট্রিংয়ের শেষে শুধু “___FACEMOTION3D” যোগ করা রূপ।

-sample

BlendShape Name&Parameter (0 ~ 100) | BlendShape Name-Parameter (0 ~ 100) | .... | = head # Euler angles X, Euler angles Y, Euler angles Z, moving values X, moving values Y, moving values Z | rightEye #Euler angles X, Euler angles Y, Euler angles Z | leftEye #Euler angles X, Euler angles Y, Euler angles Z | ___ Facemotion3d

TCP/IP দিয়ে iOS থেকে PC-তে গ্রহণ করলে ফ্রেমভাগ করা স্ট্রিং পাঠানো হয়, তাই শেষে “___FACEMOTION3D” delimiter হিসেবে ব্যবহার করুন।

TCP/IP পাঠানো বন্ধ করতে 49993 পোর্টে “StopStreaming_FACEMOTION3D” স্ট্রিং পাঠান।

- TCP/IP দিয়ে গ্রহণের Python ব্যবহারের উদাহরণ

from socket import socket, AF_INET, SOCK_DGRAM, SOCK_STREAM
#UDP send

HOST = ''
PORT = 49993
ADDRESS = "192.168.1.7" #iOS address

s = socket(AF_INET, SOCK_DGRAM)
msg = "FACEMOTION3D_OtherStreaming|protocol=tcp"
s.sendto(msg.encode(), (ADDRESS, PORT))
s.close()

#create tcp server
with socket(AF_INET, SOCK_STREAM) as tcp_server:
    tcp_server.bind(('192.168.1.5', 49986)) #192.168.1.5 is pc address
    tcp_server.listen(1)
    while True:
        conn, addr = tcp_server.accept()
        with conn:
            while True:
                data = conn.recv(10000)
                print(data.decode('utf-8'))

- iOS-এ রেকর্ড করা ডেটা গ্রহণ করতে

UDP দিয়ে iOS দিকের 49993 পোর্টে “v2_OtherBakeRecordedAnimation_FACEMOTION3D” পাঠালে রেকর্ড করা ডেটা TCP/IP দিয়ে PC দিকের 49987 পোর্টে পাঠানো হবে।

পাঠানো স্ট্রিংয়ের ফরম্যাট নিম্নরূপ:

["......", "......", "......"]===[time01, time02, time03]___FACEMOTION3D.

The ["......", "......", "......"] এই অংশটি JSON ফরম্যাটে এবং UDP ও TCP/IP-এ ব্যবহৃত একই স্ট্রিংগুলো ধারণ করে।

[time01, time02, time03] প্রতিটি রেকর্ডিং ডেটা ইনডেক্সের সঙ্গে সম্পর্কিত রেকর্ডিং সময় ধারণ করে।

- iOS-এ রেকর্ড করা ডেটা ও অডিও গ্রহণ করতে

UDP দিয়ে iOS দিকের 49993 পোর্টে “v2_OtherBakeRecordedAnimation_FACEMOTION3D” পাঠালে রেকর্ড করা ডেটা TCP/IP দিয়ে PC দিকের 49987 পোর্টে পাঠানো হবে।

পাঠানো স্ট্রিংয়ের ফরম্যাট নিম্নরূপ:

["......", "......", "......"]===[time01, time02, time03]___FACEMOTION3D.

The ["......", "......", "......"] এই অংশটি JSON ফরম্যাটে এবং UDP ও TCP/IP-এ ব্যবহৃত একই স্ট্রিংগুলো ধারণ করে।

[time01, time02, time03] প্রতিটি রেকর্ডিং ডেটা ইনডেক্সের সঙ্গে সম্পর্কিত রেকর্ডিং সময় ধারণ করে।

- ব্যবহারকারীকে দেখান যে বর্তমানে baking চলছে

iOS অ্যাপে “Currently baking” দেখাতে UDP পোর্ট 49993-এ “BakeOther_FACEMOTION3D” পাঠান। baking বার্তা লুকাতে UDP পোর্ট 49993-এ “BakeFinishOther_FACEMOTION3D” পাঠান।

- iOS অ্যাপের মধ্যে রেকর্ডিং শুরু করতে

iOS অ্যাপের মধ্যে রেকর্ডিং শুরু করতে 49993 পোর্টে “FACEMOTION3D_StartRecording” পাঠান।

- iOS অ্যাপের মধ্যে রেকর্ডিং বন্ধ করতে

iOS অ্যাপের মধ্যে রেকর্ডিং বন্ধ করতে 49993 পোর্টে “FACEMOTION3D_StopRecording” পাঠান।

- iOS অ্যাপের মধ্যে streaming বন্ধ করতে

iOS অ্যাপের মধ্যে streaming বন্ধ করতে 49993 পোর্টে “StopStreaming_FACEMOTION3D” পাঠান।

- Reset বোতাম চালান

iOS পোর্ট 49993-এ “FACEMOTION3D_resetButton” স্ট্রিং পাঠান।

- Bluetooth

Other লাইসেন্স ব্যবহার করে Bluetooth দিয়ে সংযোগ করতে নিচের কোড ব্যবহার করুন:
https://github.com/emoto-yasushi/iFacialMocap_Facemotion3d_Bluetooth

- অতিরিক্ত তথ্য

- Facemotion3d কোনো command গ্রহণ করলে পরবর্তী 0.02 সেকেন্ড বাহ্যিক commands গ্রহণ করে না।
- বর্তমানে command গ্রহণকারী একমাত্র server হলো UDP server। UDP-তে কখনও data বাদ যেতে পারে, তাই প্রায় তিনবার data পাঠালে সঠিক communication-এর সম্ভাবনা বাড়ে।
তৃতীয় পক্ষের developers-দের Other লাইসেন্স ব্যবহার করতেই হবে এমন নয়।
তৃতীয় পক্ষের developers Unity license বা Blender license-এর মতো পছন্দের license ব্যবহার করে কোন ধরনের data পাঠানো হবে তা নির্বাচন করতে পারেন।
দয়া করে বুঝবেন যে পরিস্থিতির উপর নির্ভর করে ভবিষ্যতে প্রতিটি license-এর দাম পরিবর্তিত হতে পারে।