UDPでデータを受信する場合

 

PC側からiOS側のポート49993に「FACEMOTION3D_OtherStreaming」という文字列を送ると、Facemotion3dはポート49993に60FPSのUDPで応答を返してます。

 

 

-Pythonの例

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

 

-1フレーム(1/60秒)ごとに送信される文字列は次の通りです。

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|

 

-1フレームごとに送信される文字列は以下のとおりである。

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 |

 

パラメータに負の値が含まれる場合や、値が100を超える場合があります。

角度に関するデータは、ラジアンではなく、度数で送信されます。

 

TCP / IPでデータを受信する場合

UDPだとフレームがドロップする可能性があるので、TCP / IPで受信する方法もあります。

iOS側のポート49993に「FACEMOTION3D_OtherStreaming|protocol=tcp」という文字列をUDPで送れば、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

 

iOSからPCへTCP / IPで受信する場合、コマ切れの文字列が送信されますので、最後に"___FACEMOTION3D "を付加します。

 

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で録画データを受信する方法

iOS側のポート49993に文字列「OtherBakeRecordedAnimation_FACEMOTION3D」をUDPで送信すると、PC側のポート49987に記録データがTCP / IPで送信されます。

 

送信される文字列は、["......", "......", "......"]___FACEMOTION3D.という形式になっています。

 

"......", "......", "......"]の部分はJSON形式で、UDPやTCP/IPで使われるのと同じ文字列が格納されています。

 

記録されたデータは60FPSで常に保存されます。(iOSで30FPSに処理が落ちても、60FPSで記録されます)

 

-iOSで録音したデータ・音声を受信する方法

iOS側のポート49993に「OtherBakeRecordedAnimationAndAudio_FACEMOTION3D」という文字列をUDPで送ると、PC側のポート49987にTCP / IPで記録データが送られます。

 

送信される文字列は、["......", "......", "......"]===(16進数に変換したバイナリ)__FACEMOTION3D.という形式になっています。

 

"......", "......", "......"]の部分はJSON形式で、UDPやTCP/IPで使われているのと同じ文字列が格納されています。

 

-現在ベイク中であることを表示する

iOSアプリで「現在ベイク中」を表示するには、ポート49993に「データの処理中」を隠すために、「BakeFinishOther_FACEMOTION3D」を送信してください。

 

-iOSアプリで録音を開始する方法

iOSアプリ内で録画を開始するには、ポート49993に "FACEMOTION3D_StartRecording "を送信してください。

 

-iOSアプリで録画を停止する方法

iOSアプリ内で録画を停止するには、ポート49993に "FACEMOTION3D_StopRecording "を送信してください。

 

-iOSアプリ内でストリーミングを停止する方法

iOSアプリ内でストリーミングを停止するには、ポート49993に "StopStreaming_FACEMOTION3D "を送信してください。

 

-リセットボタンの実行

iOSのポート49993に "FACEMOTION3D_resetButton "という文字列を送信します。 

 

-追加情報

-Facemotion3dは、一度コマンドを受け付けると0.02秒は外部からのコマンドを受け付けません。

 

-現在、コマンドを受信するサーバーはUDPサーバーのみです。UDPの場合、データを取りこぼすことがあるため、3回程度データを送信することで、正確な通信ができる確率が高くなります。

 

サードパーティーの開発者は、必ずしもOtherライセンスを使用する必要はありません。

 

UnityライセンスやBlenderライセンスなど、サードパーティーの開発者様がお好きなライセンスで、送信するデータの種類を選択することができます。

 

各ライセンスの価格は、今後状況に応じて変更される可能性がありますので、ご了承ください。