- Menerima data melalui UDP
Jika Anda mengirim string "FACEMOTION3D_OtherStreaming" dari sisi PC ke port 49993 di sisi iOS, Facemotion3d akan membalas ke port 49993 melalui UDP pada 60FPS.
- Contoh 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
- String yang dikirim tiap frame adalah sebagai berikut.
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|
- Format string yang dikirim tiap frame adalah sebagai berikut.
Nama BlendShape&Parameter (0 ~ 100) | Nama BlendShape-Parameter (0 ~ 100) | .... | = head # sudut Euler X (derajat), sudut Euler Y, sudut Euler Z, nilai posisi X, nilai posisi Y, nilai posisi Z | rightEye #sudut Euler X, sudut Euler Y, sudut Euler Z | leftEye #sudut Euler X, sudut Euler Y, sudut Euler Z |
Parameter dapat berisi nilai negatif atau melebihi 100.
Data terkait sudut dikirim dalam derajat, bukan radian.
- Menerima data melalui TCP / IP
Dengan UDP, frame bisa hilang, jadi tersedia juga metode penerimaan melalui TCP / IP.
Jika Anda mengirim string "FACEMOTION3D_OtherStreaming|protocol=tcp" ke port 49993 di sisi iOS melalui UDP, data akan dikirim ke port 49986 di sisi PC.
String yang dikirim hanya berupa string UDP yang ditambahkan "___FACEMOTION3D" di akhirnya.
- contoh
Nama BlendShape&Parameter (0 ~ 100) | Nama BlendShape-Parameter (0 ~ 100) | .... | = head # sudut Euler X, sudut Euler Y, sudut Euler Z, nilai gerak X, nilai gerak Y, nilai gerak Z | rightEye #sudut Euler X, sudut Euler Y, sudut Euler Z | leftEye #sudut Euler X, sudut Euler Y, sudut Euler Z | ___ Facemotion3d
Saat menerima dari iOS ke PC dengan TCP / IP, string dapat terpecah antar frame, jadi gunakan "___FACEMOTION3D" di akhir sebagai delimiter.
Untuk menghentikan pengiriman TCP / IP, kirim string "StopStreaming_FACEMOTION3D" ke port 49993.
- Contoh penggunaan Python untuk penerimaan melalui 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'))
- Menerima data rekaman di iOS
Jika Anda mengirim string “v2_OtherBakeRecordedAnimation_FACEMOTION3D” melalui UDP ke port 49993 di sisi iOS, data rekaman akan dikirim ke PC melalui TCP/IP pada port 49987.
String yang dikirim memiliki format berikut:
["......", "......", "......"]===[time01, time02, time03]___FACEMOTION3D.
Bagian["......", "......", "......"]berformat JSON dan berisi string yang sama dengan yang digunakan melalui UDP dan TCP/IP.
[time01, time02, time03]berisi waktu rekaman yang sesuai dengan tiap indeks data rekaman.
- Menerima data rekaman dan audio di iOS
Jika Anda mengirim string “v2_OtherBakeRecordedAnimation_FACEMOTION3D” melalui UDP ke port 49993 di sisi iOS, data rekaman akan dikirim ke PC melalui TCP/IP pada port 49987.
String yang dikirim memiliki format berikut:
["......", "......", "......"]===[time01, time02, time03]___FACEMOTION3D.
Bagian["......", "......", "......"]berformat JSON dan berisi string yang sama dengan yang digunakan melalui UDP dan TCP/IP.
[time01, time02, time03]berisi waktu rekaman yang sesuai dengan tiap indeks data rekaman.
- Menampilkan kepada pengguna bahwa proses baking sedang berjalan
Untuk menampilkan “Currently baking” di aplikasi iOS, kirim “BakeOther_FACEMOTION3D” ke port UDP 49993. Untuk menyembunyikan pesan baking, kirim “BakeFinishOther_FACEMOTION3D” ke port UDP 49993.
- Memulai perekaman di dalam aplikasi iOS
Untuk memulai perekaman di dalam aplikasi iOS, kirim "FACEMOTION3D_StartRecording" ke port 49993.
- Menghentikan perekaman di dalam aplikasi iOS
Untuk menghentikan perekaman di dalam aplikasi iOS, kirim "FACEMOTION3D_StopRecording" ke port 49993.
- Menghentikan streaming di dalam aplikasi iOS
Untuk menghentikan streaming di dalam aplikasi iOS, kirim "StopStreaming_FACEMOTION3D" ke port 49993.
- Menjalankan Reset Button
Kirim string "FACEMOTION3D_resetButton" ke port iOS 49993.
- Bluetooth
Untuk terhubung melalui Bluetooth dengan lisensi Other, gunakan kode berikut:
https://github.com/emoto-yasushi/iFacialMocap_Facemotion3d_Bluetooth
- Informasi tambahan
- Setelah menerima perintah, Facemotion3d tidak akan menerima perintah eksternal selama 0,02 detik.
- Saat ini, satu-satunya server yang menerima perintah adalah server UDP. Dengan UDP, data kadang bisa terlewat, jadi mengirim data sekitar tiga kali akan meningkatkan kemungkinan komunikasi yang akurat.
Developer pihak ketiga tidak harus selalu menggunakan lisensi Other.
Developer pihak ketiga dapat memakai lisensi pilihan mereka, seperti lisensi Unity atau Blender, untuk memilih jenis data yang dikirim.
Harap dipahami bahwa harga tiap lisensi dapat berubah di masa mendatang sesuai kondisi.