- Получение данных по UDP

Если отправить строку “FACEMOTION3D_OtherStreaming” с ПК на порт 49993 на стороне iOS, Facemotion3d вернет ответ по UDP на порт 49993 с частотой 60FPS.

- Пример 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

- Строка, отправляемая для каждого кадра, выглядит так.

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|

- Строки, отправляемые для каждого кадра, выглядят так.

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.

Если отправить по UDP строку “FACEMOTION3D_OtherStreaming|protocol=tcp” на порт 49993 на стороне iOS, данные будут отправлены на порт 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 на ПК через TCP/IP отправляется строка, разделенная по кадрам, поэтому используйте “___FACEMOTION3D” в конце как разделитель.

Чтобы остановить отправку TCP/IP, отправьте строку “StopStreaming_FACEMOTION3D” на порт 49993.

- Пример использования Python для приема по 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'))

- Получение записанных данных в iOS

Если отправить по UDP строку “v2_OtherBakeRecordedAnimation_FACEMOTION3D” на порт 49993 на стороне iOS, записанные данные будут отправлены на ПК через TCP/IP на порт 49987.

Передаваемая строка имеет следующий формат:

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

The ["......", "......", "......"] Эта часть имеет формат JSON и содержит те же строки, которые используются через UDP и TCP/IP.

[time01, time02, time03] содержит времена записи, соответствующие каждому индексу записанных данных.

- Получение записанных данных и аудио в iOS

Если отправить по UDP строку “v2_OtherBakeRecordedAnimation_FACEMOTION3D” на порт 49993 на стороне iOS, записанные данные будут отправлены на ПК через TCP/IP на порт 49987.

Передаваемая строка имеет следующий формат:

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

The ["......", "......", "......"] Эта часть имеет формат JSON и содержит те же строки, которые используются через UDP и TCP/IP.

[time01, time02, time03] содержит времена записи, соответствующие каждому индексу записанных данных.

- Показать пользователю, что сейчас выполняется baking

Чтобы показать “Currently baking” в приложении iOS, отправьте “BakeOther_FACEMOTION3D” на UDP-порт 49993. Чтобы скрыть сообщение baking, отправьте “BakeFinishOther_FACEMOTION3D” на UDP-порт 49993.

- Запуск записи внутри приложения iOS

Чтобы начать запись внутри приложения iOS, отправьте “FACEMOTION3D_StartRecording” на порт 49993.

- Остановка записи внутри приложения iOS

Чтобы остановить запись внутри приложения iOS, отправьте “FACEMOTION3D_StopRecording” на порт 49993.

- Остановка streaming внутри приложения iOS

Чтобы остановить streaming внутри приложения iOS, отправьте “StopStreaming_FACEMOTION3D” на порт 49993.

- Выполнить кнопку Reset

Отправьте строку “FACEMOTION3D_resetButton” на порт iOS 49993.

- Bluetooth

Для подключения через Bluetooth с лицензией Other используйте следующий код:
https://github.com/emoto-yasushi/iFacialMocap_Facemotion3d_Bluetooth

- Дополнительная информация

- После принятия команды Facemotion3d не принимает внешние команды в течение 0,02 секунды.
- Сейчас команды принимает только UDP-сервер. При UDP данные иногда могут теряться, поэтому отправка данных примерно три раза повышает вероятность корректной связи.
Сторонним разработчикам не обязательно использовать лицензию Other.
Сторонние разработчики могут использовать предпочитаемые лицензии, например Unity или Blender, чтобы выбрать тип отправляемых данных.
Обратите внимание, что цена каждой лицензии может измениться в будущем в зависимости от ситуации.