- Recevoir des données via UDP

Si vous envoyez la chaîne « FACEMOTION3D_OtherStreaming » depuis le PC vers le port 49993 côté iOS, Facemotion3d renvoie les données en UDP à 60FPS vers le port 49993.

- Exemple 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

- La chaîne envoyée à chaque frame est la suivante.

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|

- Les chaînes envoyées à chaque frame sont les suivantes.

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 |

Le paramètre peut contenir des valeurs négatives ou dépasser 100.

Les données d’angle sont envoyées en degrés, pas en radians.

- Recevoir des données via TCP/IP

Avec UDP, des frames peuvent être perdues ; il existe donc aussi une méthode de réception par TCP/IP.

Si vous envoyez par UDP la chaîne « FACEMOTION3D_OtherStreaming|protocol=tcp » au port 49993 côté iOS, les données sont envoyées au port 49986 côté PC.

La chaîne envoyée est simplement la chaîne envoyée en UDP avec « ___FACEMOTION3D » ajouté à la fin.

-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

Lors de la réception d’iOS vers le PC en TCP/IP, une chaîne découpée par frames est envoyée ; utilisez « ___FACEMOTION3D » à la fin comme délimiteur.

Pour arrêter l’envoi TCP/IP, envoyez la chaîne « StopStreaming_FACEMOTION3D » au port 49993.

- Exemple Python de réception via TCP/IP

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'))

- Recevoir les données enregistrées dans iOS

Si vous envoyez par UDP la chaîne « v2_OtherBakeRecordedAnimation_FACEMOTION3D » au port 49993 côté iOS, les données enregistrées seront envoyées au PC en TCP/IP sur le port 49987.

La chaîne transmise a le format suivant :

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

The ["......", "......", "......"] La partie est au format JSON et contient les mêmes chaînes que celles utilisées en UDP et TCP/IP.

[time01, time02, time03] contient les temps d’enregistrement correspondant à chaque index de données enregistrées.

- Recevoir les données enregistrées et l’audio dans iOS

Si vous envoyez par UDP la chaîne « v2_OtherBakeRecordedAnimation_FACEMOTION3D » au port 49993 côté iOS, les données enregistrées seront envoyées au PC en TCP/IP sur le port 49987.

La chaîne transmise a le format suivant :

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

The ["......", "......", "......"] La partie est au format JSON et contient les mêmes chaînes que celles utilisées en UDP et TCP/IP.

[time01, time02, time03] contient les temps d’enregistrement correspondant à chaque index de données enregistrées.

- Indiquer à l’utilisateur que le bake est en cours

Pour afficher « Currently baking » dans l’app iOS, envoyez « BakeOther_FACEMOTION3D » au port UDP 49993. Pour masquer le message de baking, envoyez « BakeFinishOther_FACEMOTION3D » au port UDP 49993.

- Démarrer l’enregistrement dans l’app iOS

Pour démarrer l’enregistrement dans l’app iOS, envoyez « FACEMOTION3D_StartRecording » au port 49993.

- Arrêter l’enregistrement dans l’app iOS

Pour arrêter l’enregistrement dans l’app iOS, envoyez « FACEMOTION3D_StopRecording » au port 49993.

- Arrêter le streaming dans l’app iOS

Pour arrêter le streaming dans l’app iOS, envoyez « StopStreaming_FACEMOTION3D » au port 49993.

- Exécuter le bouton Reset

Envoyez la chaîne « FACEMOTION3D_resetButton » au port iOS 49993.

- Bluetooth

Pour vous connecter par Bluetooth avec la licence Other, utilisez le code suivant :
https://github.com/emoto-yasushi/iFacialMocap_Facemotion3d_Bluetooth

- Informations supplémentaires

- Une fois qu’une commande est acceptée, Facemotion3d n’accepte pas de commandes externes pendant 0,02 seconde.
- Actuellement, le seul serveur qui reçoit les commandes est le serveur UDP. Avec UDP, des données peuvent parfois manquer ; envoyer les données environ trois fois augmente les chances d’une communication correcte.
Les développeurs tiers ne sont pas obligés d’utiliser la licence Other.
Les développeurs tiers peuvent utiliser les licences de leur choix, comme Unity ou Blender, pour choisir le type de données à envoyer.
Veuillez noter que le prix de chaque licence peut changer à l’avenir selon la situation.