- 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 स्वीकार नहीं करता।
- वर्तमान में commands प्राप्त करने वाला एकमात्र server UDP server है। UDP में data कभी-कभी छूट सकता है, इसलिए लगभग तीन बार data भेजने से सही communication की संभावना बढ़ती है।
तीसरे पक्ष के developers के लिए Other लाइसेंस का उपयोग अनिवार्य नहीं है।
तीसरे पक्ष के developers Unity license या Blender license जैसे पसंदीदा license का उपयोग कर भेजे जाने वाले data का प्रकार चुन सकते हैं।
कृपया समझें कि प्रत्येक license की कीमत भविष्य में परिस्थितियों के अनुसार बदल सकती है।