Especificaciones de comunicación de iFacialMocap


iFacialMocap permite a los desarrolladores de herramientas de terceros recibir datos faciales mediante UDP o TCP/IP sin pasar por el software de PC.

Para recibir datos por UDP

Si envía la cadena "iFacialMocap_sahuasouryya9218sauhuiayeta91555dy3719" desde el PC al puerto 49983 del lado iOS, iFacialMocap devolverá una respuesta por UDP al puerto 49983 a 60 FPS.

・ Ejemplo en 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 cadena enviada por cada fotograma es la siguiente.

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|

・ Las cadenas enviadas por cada fotograma son las siguientes.

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 |

Los datos relacionados con ángulos se envían en grados, no en radianes.

Desde iOS ver. 1.1.8 se añadió un comando externo para compatibilidad con Facemotion 3d.
Si añade la cadena "|sendDataVersion=v2" como se muestra abajo, los valores del parámetro BlendShape enviado se separarán con "&".
iFacialMocap_sahuasouryya9218sauhuiayeta91555dy3719|sendDataVersion=v2

[Ejemplo]
Normal
mouthSmile_R-0
sendDataVersion = v2
mouthSmile_R & 0

La razón es que Facemotion 3d puede enviar valores negativos al valor de blendShape.
Esto se debe a que usar "-" como delimitador podía causar colisiones.

Para recibir datos por TCP/IP

Con UDP pueden perderse fotogramas, por eso también existe un método para recibir con TCP/IP.
Si envía por UDP la cadena "iFacialMocap_UDPTCP_sahuasouryya9218sauhuiayeta91555dy3719" al puerto 49983 del lado iOS, los datos se enviarán al puerto 49986 del lado PC.

La cadena que se envía es simplemente la cadena "___iFacialMocap" añadida a la cadena enviada por UDP.

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

Al recibir de iOS al PC mediante TCP/IP, puede enviarse una cadena con frames divididos; use "___iFacialMocap" al final como delimitador.

Para detener el envío por TCP/IP, envíe la cadena "iFacialMocap_UDPTCPSTOP_sahuasouryya9218sauhuiayeta91555dy3719" al puerto 49983.

・ Ejemplo de uso en Python para recibir por 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'))

Desde iOS ver. 1.1.8 se añadió un comando externo para compatibilidad con Facemotion 3d.
Si añade la cadena "|sendDataVersion=v2" como se muestra abajo, los valores del parámetro BlendShape enviado se separarán con "&".
iFacialMocap_UDPTCP_sahuasouryya9218sauhuiayeta91555dy3719|sendDataVersion=v2

[Ejemplo]
Normal
mouthSmile_R-0
sendDataVersion = v2
mouthSmile_R & 0

La razón es que Facemotion 3d puede enviar valores negativos al valor de blend shape, y usar "-" como delimitador podía causar colisiones.

Para recibir datos por Bluetooth

Si falla la conexión de red por Wi‑Fi, como UDP o TCP/IP, también puede usar Bluetooth como alternativa. Consulte el siguiente código de GitHub.

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

Para recibir datos grabados en iOS

Si envía la cadena "iFacialMocap_bakeRecordedAnimation_start" al puerto 49983 del lado iOS por UDP, los datos grabados se enviarán al puerto 49987 del PC por TCP/IP.

La cadena enviada tiene el formato [".....", ".....", "....."] ___iFacialMocap.
La parte [".....", ".....", "....."] está en formato JSON y guarda las mismas cadenas usadas en UDP y TCP/IP.

Los datos grabados a 60 FPS siempre se almacenan. (Aunque el procesamiento baje a 30 FPS en iOS, se graba a 60 FPS.)

Esto no formaba parte del propósito original de iFacialMocap, pero los desarrolladores de terceros pueden usarlo libremente. En el futuro, el desarrollo se desplazará gradualmente hacia una app sucesora; iFacialMocap en sí no quedará obsoleto. Si usa esta función, tenga en cuenta que su tratamiento puede cambiar en la app sucesora.

Ejecutar el botón lookForward

Envíe la cadena "iFacialMocap_lookForward" al puerto 49983 de iOS.

Streaming directo a Unity

Los siguientes scripts se pueden usar adjuntándolos a objetos del juego.
Puede hacer streaming tanto con iFacialMocap como con Facemotion3d.
https://drive.google.com/file/d/10cnZRlglrHmZIv-ECT66eqNZNsiWhMtf/view?usp=sharing

Funciona especificando el nombre del objeto como se muestra en la imagen siguiente.

Unity Inspector for the iFacialMocap streaming script

Este script está pensado para archivos FBX, no para VRM.
Si desea usarlo con VRM, cree el suyo propio o envíeme un correo.