Skip to content

Deepfake & AI Voice Clone Scams

💡
Before you start

Python 3, a terminal, and one library. Nothing is recorded, uploaded or called. macOS and Linux include Python; on Windows install it from python.org with “Add python.exe to PATH” ticked. Step 4 needs the cryptography library: install it once with python3 -m pip install cryptography. Steps 1, 2, 3 and 5 need nothing beyond Python itself, so you can do those first if you would rather not install anything.

No audio or video is generated here, on purpose. This page does not teach you to make a fake voice, and you do not need one: the useful conclusion is that listening stopped being a defence, so the labs build what replaces it. If you have never used a terminal, step 1 is four lines long and is a reasonable place to start.

What Changed

For most of the history of fraud, your ears were a reasonable security control. If the voice on the phone sounded like your daughter, it almost certainly was your daughter -- imitating a specific person's voice convincingly took talent and practice. That assumption is now obsolete. Modern voice-cloning tools can reproduce a person's voice, accent, and speech rhythm from a very short sample of their speech, and the sample does not have to be given willingly. A voicemail greeting, an Instagram story, a wedding video, or a few seconds of a conference talk is enough.

The FBI's Internet Crime Complaint Center's 2025 annual report carries a dedicated section on AI-facilitated fraud, covering more than 22,000 complaints and roughly $893 million in reported losses (FBI IC3 2025 Internet Crime Report, accessed 5 September 2026). That is the measured floor, not the ceiling: it counts only the people who reported, and only those who realised AI was involved at all.

💡
The one idea worth taking from this page.

Voice and face are no longer proof of identity. They are now just another claim -- like a display name or a sender address -- and every claim needs verification through a channel the caller does not control.

How Voice Cloning Works

You do not need to understand the machine learning to defend against it, but you do need an accurate mental model of what an attacker can and cannot do.

  • Collection -- The attacker gathers a sample of the target's voice from public sources: social media video, a podcast appearance, a YouTube clip, a voicemail greeting, or a "wrong number" call designed purely to make you talk
  • Cloning -- A speech model builds a voice profile from that sample. Consumer-grade tools do this in minutes with no technical skill
  • Generation -- The attacker types what they want said, and the cloned voice speaks it. Newer tools do this in real time, so the fake voice can hold a conversation and respond to what you say
  • Delivery -- The call arrives with a spoofed caller ID showing the real person's number, because caller ID has never been an authentication mechanism

What an attacker generally does not have is the shared history between you and the person being impersonated. That gap is where your defense lives.

The Four Scams You Are Most Likely to Meet

Nearly all real-world cases are variations on four scripts. Recognising the shape of the script matters more than recognising any individual detail.

1
The family emergency call

A relative calls in distress -- an accident, an arrest, a hospital, a stranded trip abroad. They need money now and beg you not to tell anyone else in the family. The secrecy request is the tell: its only function is to stop you from making the one phone call that would expose the fraud.

2
The executive video call

A finance employee joins a video meeting with the CFO and several colleagues, and is instructed to process an urgent confidential transfer. In a widely reported case at a multinational engineering firm, every other participant on the call was a real-time deepfake, and the finance employee made a series of transfers before anyone noticed. Group video calls now carry the social proof that a single suspicious email never did.

3
The cloned-colleague follow-up

A voice note from your manager on a messaging app asks you to buy gift cards, approve an invoice, or share a login code. Voice notes are especially effective because they are short, informal, and feel too small to verify.

4
The celebrity or public-figure investment pitch

A deepfaked well-known figure endorses a trading platform or crypto giveaway in a video ad. This feeds directly into investment fraud, which the FBI recorded as the single largest category of losses in 2025 at more than $8.6 billion (FBI IC3 2025 Internet Crime Report, accessed 5 September 2026).

Why Listening Harder Does Not Work

Well-meaning advice tells people to listen for robotic pauses or unnatural breathing. This advice is now actively harmful, for three reasons.

  • The artifacts are disappearing -- Every quality flaw you learn to detect is a bug that the next model release fixes
  • Phone audio hides them anyway -- Cellular compression already strips the subtle detail you would need to hear the difference
  • Stress explains away anything odd -- The scripts are built around panic precisely so that a strange-sounding voice is attributed to crying or injury
⚠️
Detection is the wrong goal.

Do not try to win an audio-forensics contest against a machine in real time while someone you love is apparently in danger. Replace detection with verification: instead of asking "is this really them?", make them prove it through a channel you chose.

The Callback Rule

This is the single defense that works against every variation, including ones that do not exist yet, because it does not depend on the quality of the fake.

1
End the call.

Do not negotiate, do not test them, do not stay on the line. Say you will call back and hang up. A real relative in a real emergency will not be harmed by a two-minute delay.

2
Dial the number you already have.

Use the contact stored in your phone, not a number the caller gave you and not the number shown on the incoming call. This is the whole trick: the attacker controls the inbound channel, but not your address book.

3
If they do not answer, call someone else who would know.

Another relative, their partner, their workplace. The demand for secrecy exists only to prevent this step, which is exactly why you should take it.

In a workplace, the same rule becomes policy: payment instructions are never confirmed on the channel that requested them. A video call asking for a transfer is verified by a phone call to a directory number, and no amount of seniority or urgency on the call is allowed to waive that.

Set a Family Safe Word

A safe word is a short shared secret that an attacker scraping your social media cannot discover. It costs one dinner conversation and defeats the entire family-emergency category.

  • Pick something arbitrary -- a nonsense phrase, an inside joke, an object in a room. Not a pet's name, a birthplace, a school, or anything that has ever been posted online or used as a security question
  • Agree what it is for -- it is requested whenever money, codes, or travel plans come up unexpectedly
  • Never send it in writing -- not by text, email, or chat. A safe word stored in a breached inbox is not a secret
  • Teach the failure mode -- if the caller cannot produce it, that is the end of the conversation. There is no partial credit
  • Include the people most targeted -- FBI figures put reported losses by victims aged 60 and over at more than $7.7 billion in 2025 (FBI IC3 2025 Internet Crime Report, accessed 5 September 2026). Older relatives need this conversation most, and they need it framed as a family protocol, not as a warning that they are gullible

Red Flags on a Live Video Call

Real-time video deepfakes are more fragile than audio, and you can stress them deliberately. Treat these as prompts to escalate to a callback, never as an all-clear.

  • Ask them to turn their head fully in profile -- side angles remain noticeably harder for face-swap models to hold
  • Ask them to pass a hand slowly across their face -- occlusion often produces smearing or a flicker at the edges
  • Watch the boundaries -- hairline, ears, glasses frames and jaw edges are where blending artifacts appear first
  • Listen for lag between lips and words -- audio and video are generated by different systems and do not always stay locked together
  • Ask something only they would know -- not a fact from their social media, but a shared memory. An impersonator will deflect, blame the connection, or get angry
⚠️
Passing these checks proves nothing.

They are a cheap way to catch a weak fake. A good one will pass all of them. The callback is still required before anything of value moves.

Shrink Your Voice and Face Footprint

You cannot remove yourself from the internet, and trying to is usually a poor use of effort. A few targeted changes remove the easiest sources.

  • Replace a personal voicemail greeting with the carrier's default recording -- this is the single most reliably harvestable sample of your voice
  • Set social accounts to followers-only where video is posted regularly, especially accounts belonging to children and teenagers
  • Do not speak to unknown callers who stay silent -- if a call opens with dead air or "can you hear me?", hang up rather than answering out loud
  • Assume public professional content is already collected -- if you present at conferences or publish videos, your voice is available. Rely on the callback rule and a safe word rather than on secrecy you no longer have

If You Have Already Paid

Speed matters more than anything else here, and embarrassment is the attacker's last weapon. These scripts are engineered by professionals to defeat intelligent people under pressure.

  • Call your bank immediately and use the words "authorised push payment fraud" -- recall is sometimes possible within hours, rarely after that
  • Contact the receiving platform -- wire service, crypto exchange, or gift-card issuer. Gift cards occasionally still hold a balance if reported fast
  • Report it -- to your national cybercrime body. In the US that is ic3.gov; elsewhere, your national fraud reporting service. Reports are what let investigators link cases into a single network
  • Preserve the evidence -- call logs, timestamps, numbers, screenshots, transfer references. Do not delete the thread
  • Tell the person who was impersonated -- their contacts are very likely being targeted with the same clone

Build a Rule That Survives a Perfect Voice, in Five Steps

The advice that used to work — listen for the robotic voice, watch for the odd blink — is finished. Detection by ear and by eye was always a contest between your senses and somebody's software, and the software won. What follows abandons that contest entirely. You will watch the standard “agree a safe word” advice fail, replace it with something a recording cannot defeat, sort every signal in a phone call into what an attacker can manufacture and what they cannot, and finish with a rule short enough to follow while somebody is crying down the phone at you. Every line of output below came from running these files.

1
Try the standard advice, and watch it fail

Go: open a terminal in a folder you can write to — cd ~/Desktop on macOS or Linux, cd %USERPROFILE%\Desktop on Windows.

Do: save this as safeword.py and run python3 safeword.py. Nearly every article on this subject recommends a family safe word; this is what one actually does.

"""A shared safe word: the classic advice. Watch it fail."""

FAMILY_SAFE_WORD = "blue-harbour"

def verify(caller_says):
    return caller_says == FAMILY_SAFE_WORD

print("Mum calls. She sounds exactly like Mum, because she is Mum.")
print("  she says the word:", FAMILY_SAFE_WORD, "->", "PASS" if verify(FAMILY_SAFE_WORD) else "FAIL")
print()
print("Six weeks later a scammer calls, having heard that call.")
print("  he says the word :", FAMILY_SAFE_WORD, "->", "PASS" if verify(FAMILY_SAFE_WORD) else "FAIL")
print()
print("The word is a password that is spoken aloud, over the phone,")
print("every time it is used -- and never changes. Overhearing it once")
print("is enough, forever.")

You should see: the same word working for the right person and then for the wrong one:

Mum calls. She sounds exactly like Mum, because she is Mum.
  she says the word: blue-harbour -> PASS

Six weeks later a scammer calls, having heard that call.
  he says the word : blue-harbour -> PASS

The word is a password that is spoken aloud, over the phone,
every time it is used -- and never changes. Overhearing it once
is enough, forever.

A safe word is a password with two properties no password should ever have: it is transmitted in the clear, out loud, on every use, and it never changes. Anyone within earshot of one genuine call — or holding one recording of it, which is exactly what a voice cloner already has — owns it permanently.

If not: if both lines print FAIL, the string in FAMILY_SAFE_WORD does not match the one passed to verify(); they must be identical, hyphen included. On Windows, python3 may not be recognised — use py safeword.py.

2
Replace it with something a recording cannot answer

Go: the same folder.

Do: save this as challenge.py and run python3 challenge.py. Instead of one word used every time, this is a short private list agreed in person, from which you ask a different item on each call.

"""Ask something only the real person can answer, and never the same thing twice."""
import secrets

# A small private list, agreed in person, written down at home. Never spoken in full.
SHARED = {
    "1": "the campsite was called Trelow",
    "2": "the car we drove to Wales was green",
    "3": "grandad's dog was called Pip",
    "4": "we ran out of petrol near Bala",
}

def challenge_call(answers_known_to_caller):
    n = secrets.choice(list(SHARED))
    reply = answers_known_to_caller.get(n)
    ok = reply == SHARED[n]
    print("  we ask item %s -> %s" % (n, "answered correctly" if ok else "no usable answer"))
    return ok

print("CALL 1 - the real family member, who has the whole list")
print("  result:", "PASS" if challenge_call(SHARED) else "FAIL")
print()
print("CALL 2 - a scammer who recorded one earlier call and knows item 3 only")
recorded = {"3": SHARED["3"]}
print("  result:", "PASS" if challenge_call(recorded) else "FAIL")
print()
print("A recording answers the question asked LAST time, not this time.")
print("With %d items, a caller who knows 1 of them passes 1 time in %d."
      % (len(SHARED), len(SHARED)))
print("With 12 items, 1 in 12. Add items; never reuse one aloud.")

You should see: the genuine caller answering and the recording unable to:

CALL 1 - the real family member, who has the whole list
  we ask item 1 -> answered correctly
  result: PASS

CALL 2 - a scammer who recorded one earlier call and knows item 3 only
  we ask item 2 -> no usable answer
  result: FAIL

A recording answers the question asked LAST time, not this time.
With 4 items, a caller who knows 1 of them passes 1 time in 4.
With 12 items, 1 in 12. Add items; never reuse one aloud.

Two things about this output will differ on your machine, deliberately. The item numbers are chosen at random on every run, so yours will not be 1 and 2. More importantly, roughly one run in four the scammer will be asked item 3 — the one he recorded — and will pass. That is not a fault in the lab; it is the measurement the last two lines report. Four items give an attacker who knows one of them a one-in-four chance. This is the entire argument for a longer list, and for never re-using an item aloud once it has been spoken.

If not: KeyError means an item number in SHARED is not a string — the keys are quoted ("1", not 1) because secrets.choice returns whatever is in the list. If both calls always pass, check that recorded holds only item 3 and not the whole dictionary.

3
Sort the call into what can be faked and what cannot

Go: the same folder. This is the step that replaces “be suspicious” with something you can apply.

Do: save this as what_is_evidence.py and run it.

"""Sort every signal in a phone call into: attacker can produce it, or cannot."""

SIGNALS = [
    ("the voice sounds like them",        True,  "cloned from any public clip"),
    ("the number shown is theirs",        True,  "caller ID is a field the caller sets"),
    ("they know your name",               True,  "public"),
    ("they know where you work",          True,  "public"),
    ("they mention a real recent event",  True,  "public posts"),
    ("they are crying / panicking",       True,  "acted, or synthesised"),
    ("they answer a fresh question",      False, "requires the shared list, not a recording"),
    ("they answer on YOUR callback",      False, "requires control of their actual line"),
]

print("%-36s %-14s %s" % ("SIGNAL", "FORGEABLE?", "HOW"))
print("-" * 78)
for sig, forgeable, how in SIGNALS:
    print("%-36s %-14s %s" % (sig, "yes" if forgeable else "NO", how))

forgeable = sum(1 for _, f, _ in SIGNALS if f)
print()
print("signals in the call :", len(SIGNALS))
print("attacker can produce:", forgeable)
print("actual evidence     :", len(SIGNALS) - forgeable)
print()
print("Everything that persuades you is in the forgeable column.")
print("Everything that proves anything is in the other one.")

You should see: six of the eight signals in the attacker's control:

SIGNAL                               FORGEABLE?     HOW
------------------------------------------------------------------------------
the voice sounds like them           yes            cloned from any public clip
the number shown is theirs           yes            caller ID is a field the caller sets
they know your name                  yes            public
they know where you work             yes            public
they mention a real recent event     yes            public posts
they are crying / panicking          yes            acted, or synthesised
they answer a fresh question         NO             requires the shared list, not a recording
they answer on YOUR callback         NO             requires control of their actual line

signals in the call : 8
attacker can produce: 6
actual evidence     : 2

Everything that persuades you is in the forgeable column.
Everything that proves anything is in the other one.

The second row is the one people find hardest to accept. The number shown on an incoming call is supplied by the caller, in the same way the From: line of an email is supplied by the sender; the telephone network carries it without checking it. A call that displays your bank's real switchboard number tells you nothing at all about who is speaking.

Read the two rows in the NO column and notice what they have in common: both require the caller to possess something now, not to know something. That is the only distinction that has survived.

If not: if the table wraps, widen the terminal — the rows are 78 characters. The counts at the bottom are what matter and are printed on their own lines.

4
See how a publisher proves a clip is theirs

Go: the same folder.

Do: save this as sign_media.py and run it. This is the mechanism behind “content credentials” on news footage, reduced to its essentials: a signature over the exact bytes.

"""Provenance: prove who produced a file, and that it has not been altered."""
from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PrivateKey
from cryptography.exceptions import InvalidSignature

# The newsroom's signing key. The private half never leaves their building.
# Fixed seed here so your output matches this page exactly; real keys are random.
private = Ed25519PrivateKey.from_private_bytes(bytes(32))
public = private.public_key()

clip = b"VIDEO: minister says 'we will raise the rate to 40 percent'"
signature = private.sign(clip)
print("clip      :", clip.decode())
print("signature :", signature.hex()[:32], "... (64 bytes)")

def check(data, sig):
    try:
        public.verify(sig, data)
        return "VERIFIED - this is exactly what the newsroom published"
    except InvalidSignature:
        return "REJECTED - not what the newsroom published"

print()
print("original   ->", check(clip, signature))

tampered = clip.replace(b"40 percent", b"14 percent")
print("one word   ->", check(tampered, signature))

deepfake = b"VIDEO: minister says 'transfer the funds immediately'"
print("a new clip ->", check(deepfake, signature))

You should see: the real clip verifying, and both altered versions rejected:

clip      : VIDEO: minister says 'we will raise the rate to 40 percent'
signature : 1f6dbc4c24a69dd5f771b44216ba898d ... (64 bytes)

original   -> VERIFIED - this is exactly what the newsroom published
one word   -> REJECTED - not what the newsroom published
a new clip -> REJECTED - not what the newsroom published

The seed is fixed to zero in this script so your signature matches the one above character for character — a real key is random and secret. Change a single word and verification fails; there is no partial credit and no “probably fine”.

But notice the limit, because it is the important part. This proves a clip came from a key. It cannot prove a clip is true, and it says nothing whatever about the unsigned video someone forwards to you — which is every video you will actually be sent. Provenance helps publishers defend their own material. It does not help you judge the clip in your messages, and any advice that says otherwise has the direction backwards.

If not: ModuleNotFoundError: No module named 'cryptography' means the library is not installed — install it with python3 -m pip install cryptography. If your signature differs from the one shown, the clip text was altered when copying: it must be byte-identical, including the straight apostrophes around the quoted words.

5
Write the rule down, and test it against four calls

Go: the same folder.

Do: save this as protocol.py and run it.

"""The family rule, written as a decision you can apply while being shouted at."""

def decide(call):
    if call["asks_for_money_or_codes"] or call["asks_for_secrecy"]:
        if not call["you_called_them_back"]:
            return "STOP. Hang up and call them on the number you already have."
        if not call["fresh_challenge_answered"]:
            return "STOP. They failed the challenge."
        return "Proceed."
    return "No money, no codes, no secrecy -- ordinary call."

CALLS = [
    ("daughter, crying, needs bail money now, 'don't tell dad'",
     dict(asks_for_money_or_codes=True, asks_for_secrecy=True,
          you_called_them_back=False, fresh_challenge_answered=False)),
    ("same call, you hang up and ring her own number",
     dict(asks_for_money_or_codes=True, asks_for_secrecy=True,
          you_called_them_back=True, fresh_challenge_answered=True)),
    ("'boss' on video, voice and face right, wants an urgent transfer",
     dict(asks_for_money_or_codes=True, asks_for_secrecy=True,
          you_called_them_back=False, fresh_challenge_answered=False)),
    ("mum asking what time you're coming Sunday",
     dict(asks_for_money_or_codes=False, asks_for_secrecy=False,
          you_called_them_back=False, fresh_challenge_answered=False)),
]

for label, call in CALLS:
    print("%-58s" % label)
    print("   ->", decide(call))
print()
print("Note the rule never asks whether the voice sounded real.")
print("That question has no useful answer any more.")

You should see: the same verdict for the crying daughter and the familiar boss:

daughter, crying, needs bail money now, 'don't tell dad'  
   -> STOP. Hang up and call them on the number you already have.
same call, you hang up and ring her own number            
   -> Proceed.
'boss' on video, voice and face right, wants an urgent transfer
   -> STOP. Hang up and call them on the number you already have.
mum asking what time you're coming Sunday                 
   -> No money, no codes, no secrecy -- ordinary call.

Note the rule never asks whether the voice sounded real.
That question has no useful answer any more.

The rule fits on a fridge magnet: money, codes or secrecy means you hang up and dial the number you already had. It has no opinion about whether the voice was convincing, which is what makes it survive an improvement in the technology; a rule built on detection expires the moment the fakes get better, and they will.

The third case is worth sitting with. Video, voice and face all correct, on a call that appears to come from inside the company — and the verdict is unchanged, because none of those three is in the NO column from step 3.

If not: if the fourth call returns STOP, one of its three flags is True; an ordinary call sets all of asks_for_money_or_codes, asks_for_secrecy to False. If every call returns Proceed, the if conditions were flattened — the two inner checks must sit inside the outer one.

🎉
Check yourself before moving on

Without scrolling up: a colleague argues that deepfake calls are a solved problem because detection tools now score a voice for authenticity, and your company could just run one. What is the flaw in that plan, and what would you propose instead? Answer: a detector is a contest between your software and the attacker's, and the attacker gets to test against your detector until they pass it — while you have to be right every time. Worse, a detector that says “93% authentic” pushes a human back into judging the voice, which step 3 showed is the forgeable column. What to propose instead is a rule that never asks about the voice at all: for any request involving money, credentials or secrecy, the person receiving it ends the call and re-establishes contact through a number the organisation already holds, and no individual is authorised to skip that. That defence does not degrade as the fakes improve, because it never depended on them being detectable.

Now do it without the page: extend protocol.py with a fifth case drawn from your own life — a message rather than a call, from someone you would not expect to question. Then do the part that is not code: agree four items with the people who would actually ring you in a crisis, in person, and write them somewhere neither of you would read aloud on the phone. A protocol that exists only in a script has protected nobody.

Summary

AI has not invented a new category of crime. It has removed the skill and cost barriers from impersonation, which means the defense has to move from recognising voices to verifying identities.

  • Voice and face are no longer evidence -- a short public clip is enough to clone someone convincingly
  • Urgency plus secrecy is the signature -- both exist to stop you from verifying, and they appear in every version of the script
  • The callback rule beats every fake -- hang up and dial the number you already had, because it does not depend on detecting anything
  • A family safe word costs one conversation and closes the entire emergency-call category
  • At work, verify payment instructions on a different channel -- and never let seniority or urgency override that rule
  • If you have paid, move within the hour -- bank first, then the platform, then a formal report
🎉
Build the habit, not the paranoia.

You do not need to distrust every call. You need one reflex: the moment a conversation turns to money, codes, or secrecy, you end it and call back on a number you already had. That single habit is what an AI-generated voice cannot get around.