Spécifications de communication d’iFacialMocap
iFacialMocap permet aux développeurs d’outils tiers de recevoir des données faciales via UDP ou TCP/IP sans passer par le logiciel PC.
Recevoir des données via UDP
Si vous envoyez la chaîne "iFacialMocap_sahuasouryya9218sauhuiayeta91555dy3719" depuis le PC vers le port 49983 côté iOS, iFacialMocap renvoie une réponse en UDP sur le port 49983 à 60 FPS.
・ Exemple 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
・ La chaîne envoyée à chaque image est la suivante.
・ Les chaînes envoyées à chaque image sont les suivantes.
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 |
Les données d’angle sont envoyées en degrés, et non en radians.
Depuis iOS ver. 1.1.8, une commande externe a été ajoutée pour la compatibilité avec Facemotion 3d.
Si vous ajoutez la chaîne "|sendDataVersion=v2" comme indiqué ci-dessous, les valeurs du paramètre BlendShape envoyé seront séparées par "&".
iFacialMocap_sahuasouryya9218sauhuiayeta91555dy3719|sendDataVersion=v2
[Exemple]
Normal
mouthSmile_R-0
sendDataVersion = v2
mouthSmile_R & 0
La raison est que Facemotion 3d peut envoyer une valeur négative pour la valeur blendShape.
Cela évite une collision possible lorsque "-" est utilisé comme séparateur.
Recevoir des données via TCP/IP
Avec UDP, des images peuvent être perdues ; il existe donc aussi une méthode de réception par TCP/IP.
Si vous envoyez en UDP la chaîne "iFacialMocap_UDPTCP_sahuasouryya9218sauhuiayeta91555dy3719" vers le port 49983 côté iOS, les données seront envoyées vers le port 49986 côté PC.
La chaîne à envoyer est simplement la chaîne "___iFacialMocap" ajoutée à la chaîne envoyée en UDP.
- exemple
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
Lors de la réception d’iOS vers le PC en TCP/IP, une chaîne dont les trames sont divisées peut être envoyée ; utilisez donc "___iFacialMocap" à la fin comme délimiteur.
Pour arrêter l’envoi TCP/IP, envoyez la chaîne "iFacialMocap_UDPTCPSTOP_sahuasouryya9218sauhuiayeta91555dy3719" au port 49983.
・ Exemple d’utilisation Python reçu via TCP/IP
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'))
Depuis iOS ver. 1.1.8, une commande externe a été ajoutée pour la compatibilité avec Facemotion 3d.
Si vous ajoutez la chaîne "|sendDataVersion=v2" comme indiqué ci-dessous, les valeurs du paramètre BlendShape envoyé seront séparées par "&".
iFacialMocap_UDPTCP_sahuasouryya9218sauhuiayeta91555dy3719|sendDataVersion=v2
[Exemple]
Normal
mouthSmile_R-0
sendDataVersion = v2
mouthSmile_R & 0
La raison est que Facemotion 3d peut envoyer une valeur négative pour la valeur blend shape ; utiliser "-" comme séparateur pouvait provoquer une collision.
Recevoir des données via Bluetooth
Si les connexions réseau par Wi‑Fi, comme UDP ou TCP/IP, échouent, vous pouvez aussi utiliser Bluetooth comme alternative. Consultez le code GitHub suivant.
https://github.com/emoto-yasushi/iFacialMocap_Facemotion3d_Bluetooth
Recevoir des données enregistrées dans iOS
Si vous envoyez la chaîne "iFacialMocap_bakeRecordedAnimation_start" au port 49983 côté iOS en UDP, les données enregistrées seront envoyées au port 49987 côté PC en TCP/IP.
La chaîne envoyée est au format [".....", ".....", "....."] ___iFacialMocap.
La partie [".....", ".....", "....."] est au format JSON et stocke les mêmes chaînes que celles utilisées en UDP et TCP/IP.
Les données enregistrées à 60 FPS sont toujours stockées. (Même si le traitement tombe à 30 FPS sur iOS, l’enregistrement se fait à 60 FPS.)
Ce n’était pas l’objectif initial d’iFacialMocap, mais les développeurs tiers peuvent l’utiliser librement. À l’avenir, le développement se déplacera progressivement vers une application successeur ; iFacialMocap lui-même ne sera pas abandonné. Si vous utilisez cette fonction, notez que son traitement pourra changer dans l’application successeur.
Exécuter le bouton lookForward
Envoyez la chaîne "iFacialMocap_lookForward" au port iOS 49983.
Streaming direct vers Unity
Les scripts suivants peuvent être utilisés en les attachant aux objets du jeu.
Il peut streamer avec iFacialMocap et Facemotion3d.
https://drive.google.com/file/d/10cnZRlglrHmZIv-ECT66eqNZNsiWhMtf/view?usp=sharing
Cela fonctionne en spécifiant le nom de l’objet comme dans l’image suivante.

Ce script est destiné aux fichiers FBX, pas aux VRM.
Si vous souhaitez l’utiliser avec VRM, veuillez créer votre propre version ou me contacter par e-mail.