How AI funscript generation works
AutoScript Sync reads motion out of a video with AI video motion tracking that runs entirely on your PC: it samples frames, measures movement with optical flow, adds optional pose and depth models, fuses those signals into one position trace and places a script point at each change of direction. The result is a standard .funscript saved next to the video. Fitting to a particular device happens later, only on the copy sent to that device.
Checked against the app's code on 21 September 2026. Describes the released app, 2.121.1, unless a line says otherwise.
The pipeline, from video file to device
Each stage in a paragraph
Decoding and sampling
The video is decoded through OpenCV's FFmpeg backend. The app asks for hardware decoding first and falls back to software decoding if the codec, build or driver cannot do it. A worker thread decodes ahead into a buffer of up to 64 frames, so decoding and AI inference overlap instead of taking turns.
The Accuracy setting decides how many frames are analysed: Fast takes every 4th frame, Balanced (the default) every 3rd and High every 2nd. On 30 fps video that is 7.5, 10 or 15 samples a second; on 60 fps video the rates double. Each sampled frame is shrunk to 320 px wide before any analysis, whatever the source resolution. VR footage is first unwarped to a normal perspective view of one eye.
Finding the moving region
Unless you draw a box yourself with Set Motion Region… or Live Track, the engine builds a motion heatmap, takes the hottest connected area and pads it by 15%. Optical flow and depth are measured inside that region.
Measuring motion
Optical flow is the one signal that always runs: DIS dense flow measures how the region moves between sampled frames. YOLOv8 pose estimation adds 17 body keypoints per person, and MiDaS depth estimation adds the toward-and-away-from-camera axis that flat video hides. Both models are optional; without them the engine runs on flow alone and says so. On a background thread, the app also reads the codec's own motion vectors and a 50 Hz audio loudness envelope, within a time budget that scales with film length.
Fusion
Flow gives velocity, which drifts when it is added up over time. So the engine elects an anchor per video from the region centre, pose and depth, and a Kalman/RTS smoother fuses the integrated flow with that anchor into one position trace. By default the anchor is a per-sample blend of every readable channel, kept only when it scores at least as well as the single elected one. Where tracking drops out, the gap is filled with rhythmic motion continued from the strokes around it, and the share that was filled rather than measured is written to the script's metadata.
Motion-type windows
The timeline is cut into 2-second windows. A small classifier labels each by motion type from six motion features, and a smoothing pass stops labels flickering between windows. The label decides how that window's motion is shaped. A label you set yourself that covers at least half a window overrides the classifier for that window.
Points and the saved file
A script point is placed at each motion reversal, never less than 120 ms after the previous one and at least every 4 seconds, and the point list is then simplified. The app writes standard .funscript JSON beside the video with the same name, after copying any existing script to .funscript.bak. See the funscript format for what is inside.
Device fitting
The copy sent to a device, never the saved file, is fitted to that device: points closer than it can resolve are merged, segments faster than its speed limit lose amplitude but keep their timing, and point density is capped. For the Autoblow AI Ultra, reversals are also placed on a 16 fps grid. In the released app this fitting applies to the Autoblow upload; applying it to Intiface devices too comes in the next update. How the device then stays in time with the video is covered on drift correction and sync timing.
Where each part runs
All analysis happens on your PC. The analysis modules contain no network code and the video is never uploaded. The Hardware setting offers Auto (the default), GPU (CUDA) and CPU.
| Stage | Runs on |
|---|---|
| Video decoding | Any vendor's hardware decoder where available, otherwise the CPU |
| Pose and depth models | NVIDIA GPU through CUDA (ONNX Runtime or PyTorch); CPU when no CUDA GPU can be used |
| Optical flow | CPU (OpenCV), on every machine |
There is no AMD or Intel acceleration for the AI models, and TensorRT is not used. If a CUDA GPU is asked for but cannot be used, pose and depth fall back to the CPU and the app reports the provider actually in use; the Check GPU button tells you which one that is. The CPU path works but is much slower: a code comment from the RTX 5080 test PC records the small depth model at about 25.8 ms per call on the GPU against 234 ms on the CPU.
We have not measured whole-film speed on any GPU other than the developer's own, or on a CPU-only PC, so this page gives no speed promise. The benchmarks page sets out what has been measured, on what, and what has not.
What we have not solved
These come from the developer's own scoring against 28 short clips he scripted by hand, taken from five films the defaults were tuned on, using the build that follows 2.121.1 (built, not yet released). It is one scripter and a small sample, so read them as known weaknesses rather than a benchmark.
- Missed direction changes. The engine made 1.80 direction changes a second where the human made 2.29, about 21% fewer. Because some of the engine's turns were also extra or mistimed, only roughly half of the human's turns were matched within 150 ms. Stroke-turn agreement ranged from 0.33 to 0.71 (F1, within 150 ms) by film.
- Fast strokes come out small. On the two films with the fastest strokes, the engine's strokes were a quarter and a half of the human's size. The working explanation is that Balanced's 10 samples a second (on 30 fps video) smooth fast motion away.
- It does not stop when the action stops. In spans the human marked as no action, the engine still produced about 85 direction changes a minute. It does refuse to make a script at all when fewer than 5% of samples show real motion.
- Motion-type labels are not proven. Held out by video on the developer's own labels, the motion classifier on its own scored below a constant guess, and no accuracy figure for the default app is fit to publish. Labels you set yourself override it.
The timeline editor, full-frame-rate Re-analyze on a selected span and funscript troubleshooting are the practical answers today.
Read next
- Optical flow: reading motion between framesThe signal every script is built on, and how it is kept from drifting.
- Pose estimation with YOLOv8Which model each Accuracy tier uses and what keypoints add.
- Depth estimation with MiDaSThe toward-the-camera axis, and one depth scale per video.
- How the device stays in timeThe sync rules for the Autoblow, Intiface devices and DeoVR.
- Benchmarks and measurementsWhat has been measured, on which machine, and what has not.
- The AI funscript generatorWhat each AI part contributes, and how it learns from your edits.
Try it on your own videos
The trial lasts one day and runs on your own PC; your videos are analysed locally and never uploaded.