iFacialMocap संचार विनिर्देश


iFacialMocap तृतीय-पक्ष टूल डेवलपर्स को PC सॉफ़्टवेयर के बिना UDP या TCP/IP प्रोटोकॉल से चेहरे का डेटा प्राप्त करने देता है।

UDP से डेटा प्राप्त करना

यदि PC से iOS के पोर्ट 49983 पर "iFacialMocap_sahuasouryya9218sauhuiayeta91555dy3719" स्ट्रिंग भेजी जाती है, तो iFacialMocap UDP द्वारा 60 FPS पर पोर्ट 49983 पर उत्तर लौटाता है।

・ Python उदाहरण

from socket import *
DstIP = "192.168.1.7"
DstPort = 49983
DstAddr = (DstIP,DstPort)
udpClntSock = socket(AF_INET, SOCK_DGRAM)
data = "iFacialMocap_sahuasouryya9218sauhuiayeta91555dy3719"
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 इस प्रकार है।

mouthSmile_R-0(eyeLookOut_L-0)mouthUpperUp_L-11(eyeWide_R-0)mouthClose-8|mouthPucker-4|mouthRollLower-9|eyeBlink_R-7|eyeLookDown_L-1|?cheekSquint_R-11|eyeBlink_L-7|tongueOut-0|jawRight-0|eyeLookIn_R-9|cheekSquint_L-11|mouthDimple_L-10|mouthPress_L-4|eyeSquint_L-11|mouthRight-0|mouthShrugLower-0|eyeLookUp_R-0|eyeLookOut_R-0|mouthPress_R-5|cheekPuff-2|jawForward-1|1|mouthLowerDown_L-9|mouthFrown_L-6|mouthShrugUpper-26|browOuterUp_L-4|browInnerUp-20|mouthDimple_R-10|browDown_R-0|mouthUpperUp_R-10|mouthRollUpper-8|mouthFunnel-12|mouthStretch_R-21|mouthFrown_R-13|eyeLookDown_R-17|jawOpen-12|jawLeft-0|browDown_L-0|mouthSmile_L-0|noseSneer_R-18|mouthLowerDown_R-8|noseSneer_L-21|eyeWide_L-0|mouthStretch_L-21|browOuterUp_R-4|eyeLookIn_L-4|eyeSquint_R-11|eyeLookUp_L-0|mouthLeft-0|=head#-21.488958,-6.038993,-6.6019735,-0.030653415,-0.10287084,-0.6584072|rightEye#6.0297494,2.4403017,0.25649446|leftEye#6.034903,-1.6660284,-0.17520553|34903,-1.6660284,-0.17520553|

・ प्रत्येक frame में भेजी जाने वाली strings इस प्रकार हैं।

BlendShape Name-Parameter (0 ~ 100) | … | BlendShape Name-Parameter (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 |

Angle-related data radians नहीं, degrees में भेजा जाता है।

iOS ver.1.1.8 से Facemotion 3d compatibility के लिए external command जोड़ा गया है।
यदि आप string "|sendDataVersion=v2" को नीचे दिखाए अनुसार जोड़ते हैं, तो भेजे गए BlendShape parameter के values "&" से अलग होंगे।
iFacialMocap_sahuasouryya9218sauhuiayeta91555dy3719|sendDataVersion=v2

[उदाहरण]
सामान्य
mouthSmile_R-0
sendDataVersion = v2
mouthSmile_R & 0

इसका कारण यह है कि Facemotion 3d blendShape value में negative value भेज सकता है।
क्योंकि delimiter के रूप में "-" का उपयोग करने पर collision होने की संभावना थी।

TCP/IP से डेटा प्राप्त करना

UDP में frames drop हो सकते हैं, इसलिए TCP/IP से receive करने का तरीका भी उपलब्ध है।
यदि UDP द्वारा iOS के पोर्ट 49983 पर "iFacialMocap_UDPTCP_sahuasouryya9218sauhuiayeta91555dy3719" स्ट्रिंग भेजी जाती है, तो डेटा PC के पोर्ट 49986 पर भेजा जाएगा।

भेजी जाने वाली string केवल यह string है: "___iFacialMocap" जिसे UDP के समय भेजी गई string में जोड़ा गया है।

- उदाहरण
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 | ___iFacialMocap

iOS से PC तक TCP/IP से receive करते समय, frame-split strings भेजी जा सकती हैं; इसलिए अंत में "___iFacialMocap" को delimiter के रूप में उपयोग करें।

TCP/IP sending रोकने के लिए पोर्ट 49983 पर "iFacialMocap_UDPTCPSTOP_sahuasouryya9218sauhuiayeta91555dy3719" भेजें।

・ TCP/IP से प्राप्त करने का Python उपयोग उदाहरण

from socket import socket, AF_INET, SOCK_DGRAM, SOCK_STREAM

#UDP send
HOST = ''
PORT = 49983
ADDRESS = "192.168.1.7" #iOS address

s = socket(AF_INET, SOCK_DGRAM)
msg = "iFacialMocap_UDPTCP_sahuasouryya9218sauhuiayeta91555dy3719"
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 ver.1.1.8 से Facemotion 3d compatibility के लिए external command जोड़ा गया है।
यदि आप string "|sendDataVersion=v2" को नीचे दिखाए अनुसार जोड़ते हैं, तो भेजे गए BlendShape parameter के values "&" से अलग होंगे।
iFacialMocap_UDPTCP_sahuasouryya9218sauhuiayeta91555dy3719|sendDataVersion=v2

[उदाहरण]
सामान्य
mouthSmile_R-0
sendDataVersion = v2
mouthSmile_R & 0

इसका कारण यह है कि Facemotion 3d blend shape value में negative value भेज सकता है, और "-" delimiter से collision हो सकता था।

Bluetooth से डेटा प्राप्त करना

यदि Wi‑Fi network connection जैसे UDP या TCP/IP विफल हों, तो alternative के रूप में Bluetooth communication भी उपयोग कर सकते हैं। नीचे GitHub code देखें।

https://github.com/emoto-yasushi/iFacialMocap_Facemotion3d_Bluetooth

iOS में रिकॉर्ड किया गया डेटा प्राप्त करना

यदि iOS side के port 49983 पर UDP द्वारा "iFacialMocap_bakeRecordedAnimation_start" भेजते हैं, तो recorded data TCP/IP द्वारा PC side के port 49987 पर भेजा जाएगा।

भेजी जाने वाली string [".....", ".....", "....."] ___iFacialMocap के format में होती है。
[".....", ".....", "....."] वाला भाग JSON format में है और UDP तथा TCP/IP में उपयोग होने वाली समान strings को store करता है।

60 FPS पर record किया गया data हमेशा store होता है। (iOS में processing 30 FPS तक गिर जाए तब भी recording 60 FPS पर होती है।)

यह iFacialMocap का मूल उद्देश्य नहीं था, लेकिन तृतीय-पक्ष डेवलपर इसे स्वतंत्र रूप से उपयोग कर सकते हैं। भविष्य में विकास धीरे-धीरे उत्तराधिकारी ऐप की ओर जाएगा, पर iFacialMocap स्वयं बंद नहीं होगा। इस सुविधा का उपयोग कर रहे हों तो भविष्य के उत्तराधिकारी ऐप में इसका व्यवहार बदल सकता है।

lookForward button चलाना

iOS port 49983 पर "iFacialMocap_lookForward" string भेजें।

Unity में सीधी स्ट्रीमिंग

निम्न स्क्रिप्ट को GameObject से जोड़कर उपयोग किया जा सकता है।
यह iFacialMocap और Facemotion3d दोनों के साथ स्ट्रीम कर सकता है।
https://drive.google.com/file/d/10cnZRlglrHmZIv-ECT66eqNZNsiWhMtf/view?usp=sharing

नीचे दी गई image की तरह object name specify करके यह काम करता है।

Unity Inspector for the iFacialMocap streaming script

यह VRM नहीं, FBX फ़ाइलों के लिए बनाई गई स्क्रिप्ट है।
यदि आप इसे VRM में उपयोग करना चाहते हैं, तो कृपया अपना स्वयं का बनाएं या मुझे ईमेल करें।