Method

How the AI detector works

No neural network, no API call, no hidden weights. What follows is the entire method behind this free AI detector and AI checker — including the parts that make the AI detect score less confident, which is usually the part nobody publishes.

01

Tokenise

Sentences are split with an abbreviation-aware scanner so “Dr. Chen et al. (2019)” stays one sentence. Words are lower-cased and stripped of possessives, keeping internal apostrophes and hyphens. Syllables are counted with a vowel-group algorithm plus a silent-e correction and an exception list.

02

Measure in fixed windows

Almost every stylometric statistic drifts with document length — type–token ratio always falls as text grows, so a long human essay would score like a short generated one. We compute each signal inside fixed-size windows (50 words for MATTR, 200 for Zipf and entropy, 1,200 characters for compression) and average. If there is not enough material for one full window, the signal returns NaN and drops out of the vote entirely rather than contributing a value that really encodes length.

03

Score each signal as a likelihood ratio

For every measured signal we evaluate two Gaussians — one centred on the human calibration mean, one on the generated mean — and take the log of their ratio. Positive means the value is better explained by the generated hypothesis. Each class keeps its own measured spread, and the AI spread is never allowed below 0.75× the human one, because a near-zero measured variance would otherwise become a spike that awards maximum likelihood to every nearby value — and each ratio is clamped to ±3.5 so no single outlier can hijack a verdict.

04

Fuse with fitted coefficients

Naive Bayes would treat the 46 signals as 46 independent votes. They are nothing of the sort — word length, syllable count and polysyllabic ratio are three views of one underlying variable. So the combination is a linear model fitted by L2-regularised logistic regression on the real corpus: each signal gets a coefficient learned *given the others*, refitted inside every cross-validation fold. The coefficients are capped at ±2.5, because a signal whose calibration spread is unusually tight can otherwise let one measurement decide a verdict on its own. The intercept (−1.52) is a mild human prior. Because the link is logistic, the result is a calibrated probability rather than a rescaled score.

05

Add hard evidence separately

Zero-width characters, chat-export markdown, assistant scaffolding phrases, verbatim duplicate sentences, sustained impersonal register with no contractions. These are facts about the document rather than statistics about its style, so they enter the log-odds as bounded, individually-itemised terms you can see and subtract yourself. Each impact is tagged heuristic or measured depending on how its weight was set — a hand-set weight never masquerades as a fitted one.

06

Quantify the uncertainty

A single percentage hides how much the evidence actually supports it. We winsorize the outer 5% of sentence logits — so one pasted quote, URL or boilerplate line cannot drag the interval by itself — then bootstrap 400 resamples of the word-weighted per-sentence logits to build a 90% interval, widened further on short inputs. Short text produces a wide interval and a low reliability grade, which is the honest answer.

Design constraint

Why there is no AI backend

It would have been easier to fine-tune a transformer. We deliberately did not, for four reasons.

  1. A detector should be auditable. If a score can affect somebody's degree or their job, the person on the receiving end deserves to see the reasoning. A classifier's logits are not reasoning. A table of forty-six measured values, each with its calibration centres and its contribution, is.
  2. A detector should not need your data. Running the model in the browser means the text never leaves the machine. That is impossible with a model too large to ship, and it is the single most requested property from teachers, editors and lawyers.
  3. A detector should be reproducible. Closed-form statistics give the same answer today, next year, and offline. A hosted model silently changes underneath you, and yesterday's report becomes unreproducible.
  4. Neural detectors inherit neural blind spots. Perplexity-based detection is known to misfire on non-native English, because simpler, more predictable prose looks machine-written to a language model. Building on distributional statistics instead of raw predictability reduces — though it does not eliminate — that bias.
Catalogue

All 46 text signals

Generated directly from the source the detector runs on, so this page cannot drift out of date. d is Cohen's d measured on our calibration corpus — how many pooled standard deviations separate the human and generated means. w is the weight the fusion step gives it. Signals with low d are still reported, but they barely move the score. Every centre below was fitted on real human and machine text, not set by hand.

Rhythm & structure

How sentence and paragraph lengths vary across the document.
SignalHuman μAI μdw
Mean sentence length
On current data the machine answers run longer (28 vs 20 words) with less variation — the opposite of the old caricature of snappy AI prose. Modest signal (d=0.86).
19.727.80.860.54
Burstiness B = (σ−μ)/(σ+μ)
Goh–Barabási burstiness. Widely cited as the core AI tell; on real output it separates modestly (d=0.85) because generated prose is more regular — but formal human prose overlaps it, so we weight it modestly.
-0.276-0.3970.850.35
Sentence-length skewness
Human sentence lengths skew right — a bulk of medium sentences with a long tail of runaways. Generated forum answers are nearly symmetric (d=0.81). Needs 10+ sentences, otherwise it stays out of the vote.
0.7460.1440.810.40
Sentence-length variation (σ/μ)
Humans mix a three-word line with a forty-word one. Real model output varies less (d=0.77) — a genuine, modest signal.
0.5860.4490.770.40
Sentence-opener diversity
Share of unique two-word sentence openings. Models recycle “This is…”, “In addition…”, “It is…”.
0.9460.8780.650.40
Paragraph-length variation
Uniform 3–4 sentence paragraphs across a whole document is a formatting habit of assistants, not of writers.
0.6400.4350.530.25
Sentence-length kurtosis
Humans produce heavy tails — the occasional runaway sentence. Weakly present in current data (d=0.26).
0.7810.2640.260.34
Sentence-length autocorrelation (lag 1)
Whether a long sentence predicts another long one. Weak on current output (d=0.25) — reported for completeness, weighted accordingly.
-0.0303-0.09350.250.25

Lexical richness

Vocabulary variety, concentration and register elevation.
SignalHuman μAI μdw
Zipf exponent |s|
Slope of log-rank against log-frequency within 200-token windows. One of the strongest signals on real output (d=1.80): human prose leans harder on a small core vocabulary, generated text spreads flatter.
0.5490.6721.800.82
Heaps' law exponent β
Rate at which new word types appear as the text grows. A low β means the vocabulary saturates early.
0.8370.7551.790.57
Hapax legomena ratio
Share of words used exactly once. Humans reach for one-off words far more often than a probability-maximising decoder.
0.7430.6471.480.63
Zipf fit quality R²
How mechanically the text obeys Zipf. Real prose is slightly untidy; generated text can fit almost too well.
0.8640.9091.380.57
MATTR-50 lexical diversity
Moving-average type–token ratio over a 50-word window. Strong on caricatured output, strong on real model prose too (d=1.12) — humans repeat ordinary words more than generators do.
0.7950.7431.120.90
Yule's characteristic K
Length-invariant vocabulary concentration. High K means a small set of words is doing most of the work.
1251730.960.61
Polysyllabic word ratio
Share of words with three or more syllables. Weak on current output (d=0.33) — same story as the two signals above.
0.1330.1540.330.63
Syllables per word
Weak separation on current output (d=0.29): real model prose is only slightly more polysyllabic than human prose. Contributes modestly today; retained for older registers.
1.511.560.290.71
Mean word length
Latinate vocabulary inflates average word length — a weak signal on current ChatGPT-style output (d=0.24), far from the caricature-era tell it once was. Retained for older, flowery registers.
4.624.740.240.79
Function-word ratio
Proportion of grammatical glue. A low ratio signals the noun-dense, information-packed register models default to.
0.4550.4670.210.75

Predictability

Compressibility and self-information — our perplexity stand-in.
SignalHuman μAI μdw
LZ77 compression ratio
Independent redundancy check with different assumptions to the Markov model. The single strongest signal on real output (d=1.87): formulaic text squeezes smaller.
0.8050.6851.870.45
Bigram repetition rate
Share of two-word sequences that recur. Sampling loops on its own phrasing more than authors do.
0.06940.1791.800.49
Adaptive character entropy
Cross-entropy under an order-4 interpolated Markov model built from the text itself — our offline stand-in for perplexity. Strong on real output (d=1.73): generated prose is more self-predictable.
4.794.331.730.40
Coherence fragility under word shuffle
Relative increase in adaptive surprisal after a fixed-seed word shuffle — the offline analogue of perturbation-based detectors. Fitted centre (d=1.72).
0.01330.04471.720.30
Coherence fragility under adjacent swap
Relative surprisal increase after swapping each adjacent word pair — a second, gentler perturbation in the DetectGPT lineage that preserves the local bag of words. Generated forum prose degrades far more (d=1.72); story-register output barely moves, so the dual-mode fit carries both centres.
0.008970.02871.720.30
Word-surprisal dispersion (CV)
Coefficient of variation of per-word adaptive surprisal. Human writing mixes predictable glue with genuinely surprising choices; generated prose holds every word near the same moderate surprise. Fitted centre (d=1.65).
0.1200.1661.650.55
Trigram repetition rate
Same idea at three words, where accidental human repetition is rare and generated repetition is not.
0.01750.08521.460.35
Context gain (unigram ÷ bigram bits)
How much the local bigram context reduces surprise versus the context-free unigram baseline from the same text — our offline analogue of the Binoculars normalisation. Text near a sampler’s modal ridge is disproportionately well predicted by its own neighbours (d=1.37).
1.051.071.370.50
Adjacent-sentence lexical cohesion
Mean Jaccard overlap of content words between consecutive sentences. Generated forum prose re-states the same propositions sentence to sentence (d=1.35 above human); fabricated story continuations push forward with new material instead (d=1.17 below). Dual-mode, scored against the nearer centre.
0.04270.1041.350.70
Predictable-word share (surprisal < 4 bits)
Share of words the text’s own bigram model finds unsurprising — the offline form of GLTR’s “green word” tier. Instruction-tuned forum answers concentrate in the predictable head (d=0.95); story-register output does not, so this fires on the forum mode only.
0.005770.03610.950.60
Normalised word entropy
Shannon entropy of the word distribution over log₂(vocabulary) — how evenly the author spreads across their own lexicon.
0.9380.9240.900.66

Distributional fit

Agreement with large-corpus English on unconscious features.
SignalHuman μAI μdw
Function-word richness
Distinct glue-word types per glue token. Forum-model output reuses a narrow shelf of connectors (d=1.34 below human); story-register output spreads wider than humans do (d=2.39 above) — a textbook dual-mode signal, scored against the nearer centre.
0.3600.2971.340.55
Function-word bigram repetition
Share of grammatical two-word collocations (“of the”, “in the”, “to be”) that recur within a 200-token window. Aligned output reuses the same handful of glue bigrams more than authors do (d=1.12 in the forum register); story-register output reuses them less than humans (d=1.31 the other way), so it is scored against the nearer centre.
0.1270.2351.120.70
Clause density
Subordinators and commas per sentence. Generated sentences carry more balanced subordinate structure.
2.373.350.750.38
Function-word JS divergence
Jensen–Shannon distance between this text’s function-word profile and large-corpus English. Function words are produced unconsciously, so they are hard to fake.
0.2730.2990.620.40
Word-class entropy
Entropy over coarse morphological classes (-ing, -ed, -ly, nominalisations…) as a tagger-free proxy for syntactic variety.
0.6890.6810.160.59
Readability stability (σ FKGL)
Standard deviation of Flesch–Kincaid grade across 110-word windows. Negligible on real output (d=0.07) — reported for completeness, weighted accordingly.
0.9190.8620.070.35

Punctuation & voice

Typographic habits and markers of personal register.
SignalHuman μAI μdw
First-person / personal-voice rate
Personal pronouns and stance markers. Generated explanatory prose hides the speaker.
22.12.200.860.40
Contraction rate
“don’t”, “it’s”, “we’ve”. Real model output contracts more than the old caricature suggested, so this is a modest signal now (d=0.56), not a loud one.
13.46.850.560.50
Semicolon rate
Literary human prose uses semicolons freely; current assistants avoid them. The old story had this backwards — calibration corrected it.
1.860.1280.510.25
Parenthetical aside rate
Bracketed digressions signal a mind wandering mid-sentence — a distinctly human interruption.
6.663.440.450.36
Informal-register rate
Colloquialisms, fillers and vague quantifiers that alignment training tends to smooth away.
1.410.4370.390.35
Em-dash rate
Nearly absent from the 2023-style output we calibrated on, common in newer assistants and present in literary human prose. Weak either way (d=0.33) — watch this space, not the score.
0.5990.02200.330.55
Numeric specificity
Concrete figures, dates and measurements. Generated prose leans on qualitative descriptors instead.
12.46.360.330.25
Exclamation rate
Assistants are trained toward measured tone and under-use exclamation compared with human authors.
1.360.2910.320.25

Lexical fingerprints

Phrases statistically over-represented in aligned model output.
SignalHuman μAI μdw
Weighted AI-marker density
Weighted hits against a lexicon of instruction-tuned vocabulary, with per-phrase weights fitted to real model output — hedges and scaffolding (“it’s worth noting”, “here are some”) carry the weight now, not “delve”.
0.2012.491.180.85
Discourse-connective density
“Overall,”, “additionally”, “in summary” signpost structure more heavily than writers do. Note “furthermore” and “moreover” actually favour humans in current data — the fitted weights know this.
0.06510.6410.570.70
Tricolon rate (“A, B, and C”)
The rhetorical triple appears about 1.6× the human rate in current output — a real but weak tell (d=0.24), not the hallmark it once was.
1.272.050.240.45

The finding that rebuilt the model

Our first calibration fitted the AI side on hand-written imitations of machine prose — and it worked beautifully, right up until we tested it on real ChatGPT output, where it scored below chance. The imitations were a caricature: real model prose looks different in measurable ways, so we threw the caricature out and refitted everything on 1,140 real ChatGPT answers plus 450 multi-model story continuations.

That refit surfaced the fact that now shapes the whole engine: the two machine registers sit on opposite sides of human prose. Lean forum answers are lexically poorer and more repetitive than humans; rich story output is lexically richer. A single AI centre cannot cover both, so every signal carries two — one per register — and scores against the nearer one. Which centre won is shown on each row of your report.

What actually separates the classes now is compressibility and self-predictability: LZ77 ratio (d = 1.87), adaptive character entropy (1.73), the Zipf exponent (1.80), shuffle fragility (1.72), swap fragility (1.72) and bigram repetition (1.80). Classic rhythm tells like burstiness (0.85) and sentence-length variation (0.77) contribute modestly. Word length, syllables per word and polysyllabic ratio — the loudest signals of the caricature era — measure only weakly (d ≈ 0.24–0.33) on current output and contribute modestly. We reweighted the whole model around these measurements rather than around received wisdom, and the weights above are the outcome.

Images

Image forensics, in two tiers

Provenance first, physics second. We never let a statistical guess override a record the file carries about itself.

Tier 1 · provenance

What the file says about itself

We walk JPEG segment markers, PNG chunks and RIFF containers by hand — no decoding library — to recover:

  • C2PA Content Credentials, including the trainedAlgorithmicMedia declaration
  • Full EXIF IFD walk: camera make, model, lens, exposure, aperture, ISO, GPS
  • PNG tEXt/iTXt/zTXt chunks, where Stable Diffusion writes its prompt and ComfyUI writes the entire workflow graph
  • XMP packets, including Adobe's digital source type
  • Generator strings for DALL·E, Midjourney, Firefly, Imagen, Flux, Ideogram, Leonardo, NovelAI, Grok and more
  • JPEG quantisation tables, which recover the encoder's quality setting
Tier 2 · pixels

What the physics says

When metadata has been stripped — as it is by every social platform — we fall back on capture physics:

  • Cross-channel residual agreement d=1.35
    Mean correlation between the red, green and blue high-frequency residuals.
  • Chroma residual energy d=1.20
    The same physics stated as an energy rather than a correlation: how much micro-texture is left once the shared luminance component is subtracted.
  • Per-channel tone-curve comb d=0.87
    Bin-to-bin roughness of each colour histogram.
  • Saturation dispersion d=0.81
    Spread of per-pixel saturation.
  • Gradient kurtosis d=0.72
    Natural images have heavy-tailed gradients: mostly flat, with rare hard edges.
  • Luminance tone-curve comb d=0.72
    The luminance version of the per-channel comb.
  • Genuinely flat tiles d=0.67
    Fraction of 16x16 tiles whose residual is essentially zero.
  • Histogram gap ratio d=0.58
    Empty bins left by in-camera tone mapping and quantisation.
  • Spectral falloff exponent d=0.45
    Natural scenes follow a 1/f^a power spectrum.
  • High-frequency energy share d=0.40
    Proportion of spectral energy above mid-band.
  • Demosaicing periodicity d=0.35
    Bayer sensors interpolate half their green samples, leaving a two-pixel periodic signature.
  • Mid-band spectral energy share d not measuredprior
    Share of spectral power in the 0.10–0.40 Nyquist band.
  • Neighbour-pixel micro-contrast d not measuredprior
    Mean |pixel − mean of 4-neighbours| over mean luminance.
  • Noise–luminance coupling d not measuredprior
    Correlation of per-tile noise against √luminance.
  • Spectral entropy d not measuredprior
    Shannon entropy of the radial Fourier power profile.
  • Noise-level slope d not measuredprior
    OLS slope of per-tile noise on √luminance — the same shot-noise physics as the coupling above, stated as a slope rather than a correlation.
  • Noise non-uniformity d not measuredprior
    Coefficient of variation of per-tile noise.
  • Local-entropy variation d not measuredprior
    Spread of per-tile Shannon entropy.
  • Upsampler grid energy d not measuredprior
    Mean excess energy at exact half/quarter Nyquist grid positions.
  • DCT Benford deviation d not measuredprior
    Chi-square deviation of block-DCT first digits from Benford’s law (scaled ×100/N).
  • Edge density d not measuredprior
    Share of Sobel magnitudes above threshold.
  • Tonal richness d not measuredprior
    Distinct 6-bit colours per sampled pixel.
  • Clipped-pixel share d not measuredprior
    Share of pixels at the sensor rails (near-black or near-white).

A d figure is Cohen's separation, measured on the validation sets on Accuracy. Tests tagged prior showd not measured because they never were — they carry a literature prior with a deliberately wide spread and a low weight, and we will not print a separation number we have not earned.

A camera cannot paint all three colours at once

The measurement that carries this tier is not a stylistic tell that a better model will fix. It is a consequence of how the two kinds of image are physically made.

A camera builds each colour channel from different sensor sites. The photons arriving at a red-filtered well are counted independently of those at its green neighbour, so shot noise is uncorrelated between channels. The demosaicer then interpolates each channel with a different kernel — green has twice as many samples as red or blue on a Bayer grid. And the lens focuses red and blue light at slightly different planes, so their fine detail is not even the same detail. Take the high-frequency residual of each channel and the three disagree: on our 29 camera originals, mean correlation 0.883.

A latent-diffusion decoder makes all three channels from one shared latent tensor. The micro-texture is essentially a single pattern painted three times. The residuals agree almost perfectly: on our 14 generated images, mean correlation 0.980. That is d = 1.35, and unlike every sensor-level test it survives downscaling, because it is a property of the colour relationship rather than of the pixel grid.

It has one fatal enemy, and we would rather name it than hide it: JPEG 4:2:0 chroma subsampling averages colour over 2×2 blocks, which forces the channels to share fine detail and fakes the synthetic signature on real photographs. So we parse the JPEG SOF sampling factors, and on a subsampled file we cut these tests to 12% of their weight and say so on the result card. See the numbers.

Three decisions that stopped it lying

Separate spreads per class, but not the measured one. Generated images cluster far more tightly than camera originals (σ = 0.014 against 0.100), and camera values drift upward whenever a file is resized. Encoding the measured σ would assert that every generator, present and future, lands in exactly the same spot — on the validation set that produced five false accusations on native photographs and eighteen on recompressed ones. We use 0.9 × σcamera: the useful asymmetry without the unearned confidence.

Weights are d2.5, not d. With linear weights a cluster of weak, mutually-agreeing signals could outvote the one strong one. A product shot measuring 0.9965 cross-channel correlation — about as synthetic as a number gets — was averaged down to an inconclusive 57%. Raising the exponent lets decisive evidence actually decide.

A confidence multiplier on the whole tier. Every pixel measurement assumes it is seeing something close to what the sensor or the decoder produced. Resizing, recompression and subsampling each erode that assumption, and past a threshold the numbers stop meaning what the calibration says. So the tier is shrunk toward the prior in proportion to the damage — a mangled file returns "inconclusive" rather than a confident guess.

What we got wrong the first time

We originally wrote these baselines from the forensics literature. Measured against real camera originals and real generator output, two were directionally backwards. Deviation from Benford's law is widely cited as a synthesis indicator; JPEG-quantised camera output actually deviates more. Shot-noise theory predicts brightness and noise correlate positively; in real photographs the correlation is usually negative, because bright regions are skies and dark regions are foliage. A third, saturation dispersion, is real but points the opposite way to the folklore — generators produce more saturation variance than camera JPEGs, not less.

Every centre on this page is now measured rather than cited — with explicit exceptions. Tests tagged prior in the list above carry literature priors with deliberately wide spreads and low weights, marked prior wherever they appear, until the next measurement round. The scripts that produced the measured centres ship in research/.

Video & audio

AI video detector and AI audio detector method

The AI video detector reuses the image engine's calibrated pixel centres (cross-channel agreement d = 1.35) on sampled decoded frames, then adds temporal physics no still can have: frame-to-frame sensor-grain fluctuation (cameras wobble, re-encoded synthetic grain sits still), flicker coherence and optical-flow motion consistency. The AI audio detector decodes the waveform locally and measures spectral shape, bispectral vocoder artefacts (quadratic phase coupling from ElevenLabs, OpenAI TTS, Coqui, Bark-style synthesis) and temporal voice dynamics. Both score with Gaussian LLRs, reliability damping and a prior — and both print every value with the exact logit arithmetic in the report and in every export.

Honest limit, stated plainly: there is no large public corpus of verified camera versus generated video, nor of verified human versus cloned voice, so the temporal and acoustic centres are physics-based engineering priors with wide spreads — not corpus fits. That is why short, noisy or recompressed files damp toward the prior and return low reliability or inconclusive instead of a confident fake percentage.

Provenance follows the same honesty rule as images: only a strong decoded-field record (container metadata, never a file name) may claim origin, and when the frames or waveform clearly disagree the record stays visible but unconfirmed — reduced weight, no generator naming, a named disagreement finding, and reliability capped at low. Every per-signal LLR is clamped (±4), every logit is clamped (±6), and camera counter-evidence (a camera-maker tool string) votes toward camera so the headline reflects both sides.

Catalogue

Video frame & temporal tests

Generated directly from the source the AI video detector runs on. Pixel rows reuse the image engine's measured centres; every row taggedprior is a physics-based engineering prior with a wide spread — never a corpus fit, never an invented separation figure.

TestCamera μAI μw
Cross-channel correlation prior
crossChannelCorr · Cross-channel correlation — demosaicer disagreement vs shared latent. AI spread is 0.9× the human spread (never the tight measured cluster), so a single frame value cannot spike the verdict.
0.8830.9782.50
Spectral falloff exponent prior
spectralSlope · Spectral falloff exponent — inherited from the image engine measurement (natural 1/f vs faster synthetic falloff)
2.5163.0621.20
High-frequency energy share prior
highFreqRatio · High-frequency energy share — same scale as the image engine (lens/sensor texture puts energy up here; synthesis puts less)
0.78340.74361.00
Frame-to-frame noise fluctuation prior
temporalNoise · Frame-to-frame noise fluctuation — sensor grain wobbles; re-encoded grain is static
0.00420.00182.00
Stability of cross-channel correlation across framesprior
temporalStability · Stability of cross-channel correlation across frames
0.0030.0081.80
Frame-to-frame luminance correlation prior
flickerCoherence · Frame-to-frame luminance correlation — synthetic video often flickers
0.150.721.50
Frequency domain anomaly score prior
frequencyAnomaly · Frequency domain anomaly score — spectral distortion detection
0.250.651.80
Texture consistency prior
textureConsistency · Texture consistency — LBP-based skin/face detail coherence
0.850.551.50
Edge consistency prior
edgeConsistency · Edge consistency — unnatural boundary detection
0.80.51.50
Optical flow warping artifacts prior
opticalFlowWarping · Optical flow warping artifacts — temporal motion inconsistency
0.080.251.60
Optical flow coherence prior
opticalFlowCoherence · Optical flow coherence — smooth motion field consistency
0.850.551.40
Catalogue

Audio acoustic tests

Generated directly from the source the AI audio detector runs on. Every centre is an acoustic engineering prior (natural voice is spectrally richer, more variable and phase-irregular; vocoded speech is brighter, flatter and phase-locked) — not a corpus fit. Rows taggedprior carry wide spreads and clamped LLRs so no single measurement can decide a verdict alone.

TestHuman μAI μw
Spectral centroid prior
spectralCentroid · Spectral centroid — brightness measure
220028001.20
Spectral flatness prior
spectralFlatness · Spectral flatness — noise-like vs tonal
0.220.351.40
Spectral entropy prior
spectralEntropy · Spectral entropy — distribution complexity
7.86.51.30
Spectral flux prior
spectralFlux · Spectral flux — frame-to-frame change rate
0.180.121.10
Spectral rolloff prior
spectralRolloff · Spectral rolloff — 85% energy cutoff frequency
380045001.00
Bispectrum anomaly prior
bispectrumScore · Bispectrum anomaly — quadratic phase coupling (vocoder artifact)
0.350.722.20
Phase coherence prior
phaseCoherence · Phase coherence — natural vs synthetic phase relationships
0.520.781.80
Spectral peak regularity prior
spectralPeakRegularity · Spectral peak regularity — vocoder creates uniform peaks
0.550.252.00
Zero-crossing rate prior
zeroCrossingRate · Zero-crossing rate — speech pattern characteristic
0.120.0851.30
ZCR variation prior
zeroCrossingRateStd · ZCR variation — natural speech has more variation
0.0350.0151.50
Energy variation prior
energyStd · Energy variation — natural speech dynamics
0.0180.0081.40
Silence ratio prior
silenceRatio · Silence ratio — pause patterns
0.250.181.10
Temporal anomaly prior
temporalAnomaly · Temporal anomaly — sample distribution analysis
0.220.451.60
Harmonic anomaly prior
harmonicAnomaly · Harmonic anomaly — vocoder vs natural harmonics
0.350.651.70

Measured but unfused diagnostics — MFCC voice-print shape and variation, pause-length structure, clipping flag, channels and bit depth — are computed from every file and shown in the report with their live values and an explicit “no vote” label, so future validation can be checked against them.

Reference

Constants

Every tunable number in the fusion step, so you can reproduce a score by hand.

Intercept
−1.52 — a mild bias toward “human”, so ambiguous text is not accused
Fusion
logistic regression on the 46 per-signal log-likelihood ratios; coefficients refitted per cross-validation fold, capped at ±2.5
AI spread floor
0.75 — each signal keeps its measured AI spread, floored at this multiple of the human spread
Per-signal LLR clamp
±3.5
Length reliability
w / (w + 15), where w is the word count — ≈0.94 at the 240-word calibration length
Applicability guard
below 22% English function-word coverage the engine refuses (returns Inconclusive) rather than scoring non-English prose
Bootstrap
400 resamples of word-weighted sentence logits, α = 0.1
Evidence cap
hard evidence is clamped to [−2, +4.5] log-odds in total