AI funscript 생성의 원리

AutoScript Sync는 PC에서만 실행되는 AI 영상 모션 트래킹으로 영상에서 움직임을 읽어 냅니다: 프레임을 샘플링하고, 옵티컬 플로우로 움직임을 측정하고, 선택 사항인 자세 및 깊이 모델을 더하고, 이 신호들을 하나의 위치 궤적으로 융합한 뒤 방향이 바뀔 때마다 스크립트 점을 찍습니다. 결과는 영상 옆에 저장되는 표준 .funscript입니다. 특정 기기에 맞추는 작업은 나중에, 그 기기로 보내는 사본에만 적용됩니다.

2026년 9월 21일 앱 코드와 대조해 확인했습니다. 따로 표시하지 않는 한 현재 출시된 앱 2.121.1 기준입니다.

영상 파일에서 기기까지의 파이프라인

AutoScript Sync analysis pipeline Decode, sample every Nth frame at 320 pixels, find the moving region, measure it with DIS optical flow plus optional pose and depth and background motion-vector and audio passes, fuse in a Kalman smoother, label 2-second motion-type windows, place points at reversals, save the funscript, then fit a copy to the device. Decode the video (hardware decoding first, software fallback) Sample every 4th / 3rd / 2nd frame (Fast / Balanced / High), shrink to 320 px Find the moving region (motion heatmap, or the box you draw) DIS optical flow YOLOv8-pose MiDaS depth Motion vectors Fuse into one position trace (Kalman/RTS smoother) Label 2-second windows by motion type Points at direction changes → .funscript saved beside the video Fit a copy to the connected device (speed, spacing, point density) always on optional optional + audio envelope, background passes
저장되는 파일은 마지막 실선 화살표에서 끝납니다. 점선 단계는 앱이 기기로 보내는 사본에만 적용되며, 디스크의 파일은 절대 특정 기기에 맞춰지지 않습니다.

단계별 한 문단 설명

디코딩과 샘플링

영상은 OpenCV의 FFmpeg 백엔드로 디코딩됩니다. 앱은 먼저 하드웨어 디코딩을 요청하고, 코덱·빌드·드라이버가 지원하지 않으면 소프트웨어 디코딩으로 전환합니다. 작업 스레드가 최대 64프레임의 버퍼에 미리 디코딩해 두므로, 디코딩과 AI 추론이 번갈아 실행되지 않고 동시에 진행됩니다.

Accuracy 설정이 분석할 프레임 수를 정합니다: Fast는 4프레임마다, Balanced(기본값)는 3프레임마다, High는 2프레임마다 하나를 분석합니다. 30 fps 영상에서는 초당 7.5, 10, 15회이며, 60 fps 영상에서는 두 배가 됩니다. 샘플링된 각 프레임은 원본 해상도와 관계없이 분석 전에 가로 320 px로 축소됩니다. VR 영상은 먼저 한쪽 눈의 일반 원근 시점으로 왜곡을 풉니다.

움직이는 영역 찾기

Set Motion Region…이나 Live Track으로 직접 상자를 그리지 않으면, 엔진은 모션 히트맵을 만들고 가장 뜨거운 연결 영역을 골라 15% 여유를 둡니다. 옵티컬 플로우와 깊이는 그 영역 안에서 측정됩니다.

움직임 측정

옵티컬 플로우는 항상 실행되는 유일한 신호입니다: DIS 밀집 플로우가 샘플링된 프레임 사이에서 영역이 어떻게 움직이는지 측정합니다. YOLOv8 자세 추정은 사람마다 17개의 신체 키포인트를 더하고, MiDaS 깊이 추정은 평면 영상에서는 보이지 않는 카메라 쪽 앞뒤 축을 더합니다. 두 모델 모두 선택 사항이며, 모델이 없으면 엔진은 플로우만으로 실행되고 그 사실을 알려 줍니다. 앱은 백그라운드 스레드에서 코덱 자체의 모션 벡터와 50 Hz 오디오 음량 곡선도 읽는데, 영상 길이에 비례하는 시간 예산 안에서만 읽습니다.

융합

플로우는 속도를 주는데, 시간에 따라 누적하면 드리프트가 생깁니다. 그래서 엔진은 영역 중심, 자세, 깊이 중에서 영상마다 앵커를 선정하고, Kalman/RTS 스무더가 누적된 플로우와 그 앵커를 하나의 위치 궤적으로 융합합니다. 기본적으로 앵커는 읽을 수 있는 모든 채널을 샘플마다 섞은 것이며, 선정된 단일 앵커 이상의 점수를 받을 때만 사용됩니다. 추적이 끊긴 곳은 주변 스트로크에서 이어지는 리듬 있는 움직임으로 채우며, 측정하지 않고 채워 넣은 비율은 스크립트의 메타데이터에 기록됩니다.

모션 유형 구간

타임라인은 2초 구간으로 나뉩니다. 작은 분류기가 여섯 가지 모션 특징으로 각 구간에 모션 유형 라벨을 붙이고, 스무딩 단계가 구간 사이에서 라벨이 깜박이듯 바뀌지 않게 합니다. 라벨은 그 구간의 움직임을 어떻게 다듬을지를 결정합니다. 사용자가 직접 설정한 라벨이 구간의 절반 이상을 덮으면 그 구간에서는 분류기보다 우선합니다.

점과 저장 파일

스크립트 점은 움직임이 반전될 때마다 찍히며, 이전 점과 120 ms 이상 간격을 두고 적어도 4초마다 하나씩 찍힌 뒤 점 목록이 단순화됩니다. 앱은 기존 스크립트를 .funscript.bak으로 복사한 뒤, 영상 옆에 같은 이름으로 표준 .funscript JSON을 기록합니다. 내부 구조는 funscript 형식을 참고하세요.

기기 맞춤

저장된 파일이 아니라 기기로 보내는 사본만 그 기기에 맞춥니다: 기기가 구분할 수 있는 것보다 가까운 점은 합치고, 속도 제한보다 빠른 구간은 타이밍은 유지한 채 진폭을 줄이며, 점 밀도에 상한을 둡니다. Autoblow AI Ultra의 경우 반전 지점을 16 fps 격자에도 맞춥니다. 현재 출시된 앱에서는 이 맞춤이 Autoblow 업로드에 적용되며, Intiface 기기에도 적용하는 것은 다음 업데이트에서 추가됩니다. 그 후 기기가 영상과 시간을 맞추는 방법은 드리프트 보정과 동기화 타이밍에서 다룹니다.

각 부분이 실행되는 곳

모든 분석은 PC에서 이루어집니다. 분석 모듈에는 네트워크 코드가 없으며 영상은 절대 업로드되지 않습니다. Hardware 설정에는 Auto(기본값), GPU (CUDA), CPU가 있습니다.

각 단계가 사용하는 프로세서
단계실행 위치
영상 디코딩가능하면 제조사와 관계없이 하드웨어 디코더, 그렇지 않으면 CPU
자세 및 깊이 모델CUDA를 통한 NVIDIA GPU(ONNX Runtime 또는 PyTorch). CUDA GPU를 쓸 수 없으면 CPU
옵티컬 플로우모든 PC에서 CPU(OpenCV)

AI 모델에 대한 AMD나 Intel 가속은 없으며, TensorRT도 사용하지 않습니다. CUDA GPU를 요청했지만 쓸 수 없으면 자세와 깊이는 CPU로 전환되고, 앱은 실제로 사용 중인 프로바이더를 보고합니다. Check GPU 버튼으로 어느 것인지 확인할 수 있습니다. CPU 경로는 동작하지만 훨씬 느립니다: RTX 5080 테스트 PC에서 남긴 코드 주석에 따르면 작은 깊이 모델은 호출당 GPU에서 약 25.8 ms, CPU에서 234 ms가 걸렸습니다.

개발자 본인의 GPU 외에 다른 GPU나 CPU 전용 PC에서는 영상 전체 처리 속도를 측정하지 않았으므로, 이 페이지는 속도를 약속하지 않습니다. 무엇을 어떤 환경에서 측정했고 무엇을 측정하지 않았는지는 벤치마크 페이지에 정리되어 있습니다.

아직 해결하지 못한 것

아래 내용은 개발자가 기본값을 조정할 때 쓴 영상 다섯 편에서 뽑아 직접 스크립트를 쓴 짧은 클립 28개를 기준으로, 2.121.1 다음 빌드(빌드 완료, 아직 출시 안 됨)를 직접 채점한 결과입니다. 스크립트 작성자 한 명과 작은 표본이므로 벤치마크가 아니라 알려진 약점으로 읽어 주세요.

  • 놓치는 방향 전환. 사람이 초당 2.29회 방향을 바꾼 곳에서 엔진은 1.80회로, 약 21% 적었습니다. 엔진의 전환 중 일부는 불필요하거나 타이밍이 어긋나기도 해서, 사람의 전환 중 150 ms 이내로 맞은 것은 대략 절반뿐이었습니다. 스트로크 전환 일치도는 영상별로 0.33에서 0.71(F1, 150 ms 이내)이었습니다.
  • 빠른 스트로크가 작게 나옵니다. 스트로크가 가장 빠른 두 영상에서 엔진의 스트로크는 사람의 4분의 1과 2분의 1 크기였습니다. 현재 가설은 (30 fps 영상에서) Balanced의 초당 10회 샘플링이 빠른 움직임을 뭉개 버린다는 것입니다.
  • 동작이 멈춰도 멈추지 않습니다. 사람이 동작 없음으로 표시한 구간에서도 엔진은 분당 약 85회의 방향 전환을 만들어 냈습니다. 다만 실제 움직임을 보이는 샘플이 5% 미만이면 스크립트 생성 자체를 거부합니다.
  • 모션 유형 라벨은 검증되지 않았습니다. 개발자 본인의 라벨로 영상 단위 홀드아웃 평가를 했을 때 모션 분류기 단독으로는 항상 같은 답을 내는 추측보다도 점수가 낮았으며, 기본 앱에 대해 공개할 만한 정확도 수치는 없습니다. 사용자가 직접 설정한 라벨은 분류기보다 우선합니다.

지금 실질적인 대처 방법은 타임라인 편집기, 선택 구간을 전체 프레임 속도로 다시 분석하는 Re-analyze, 그리고 funscript 문제 해결입니다.

다음 읽을거리

여러분의 영상으로 직접 사용해 보세요

체험판은 하루 동안 여러분의 PC에서 실행됩니다. 영상은 로컬에서 분석되며 절대 업로드되지 않습니다.