DEV Community

LeoJulieta
LeoJulieta

Posted on

Cómo detectar deepfakes de voz y protegerte del fraude

📈 Google Trends revela que los deepfakes de voz están en auge: cómo detectarlos y protegerse


Introducción

En los últimos meses, las búsquedas de “deepfake voice” y “voice phishing” han crecido de forma constante en Google Trends, señalando que los ataques con voces sintéticas ya no son una amenaza de nicho. Con herramientas como ElevenLabs, Azure Speech o Google WaveNet al alcance de cualquier usuario, los estafadores pueden imitar la voz de un familiar, un ejecutivo o un agente de soporte con una calidad que engaña incluso a los oyentes más experimentados. En este artículo encontrarás:

  1. Cómo reconocer una llamada falsificada en segundos.
  2. Herramientas gratuitas y ejemplos de código para detectar deepfakes en tiempo real.
  3. Pasos prácticos para actuar y reducir el riesgo en tu organización o en tu día a día.

1. ¿Cómo distinguir una llamada deepfake de una conversación real?

Señal a observar Por qué ocurre Qué hacer
Entonación “plana” o cambios bruscos de pitch Los modelos de TTS todavía luchan con la variación natural de la voz humana. Presta atención a subidas y bajadas de tono que no siguen el patrón habitual del interlocutor.
Pausas artificiales o “latencia” entre palabras La generación en tiempo real introduce pequeños retrasos mientras el modelo procesa el texto. Si escuchas silencios de 200‑400 ms donde no debería haberlos, sospecha.
Artefactos de sonido (zumbidos, “silbidos” en consonantes) Los algoritmos de síntesis pueden producir pequeñas distorsiones en fonemas fricativos. Usa auriculares de buena calidad y busca esos ruidos sutiles.
Falta de “relleno” natural (muletillas, respiraciones) Las voces sintéticas suelen omitir “uh”, “eh” o suspiros. Pregunta algo inesperado que provoque una respuesta espontánea; si la respuesta suena demasiado “ensayada”, alerta.

Los algoritmos de detección automática analizan espectrogramas y métricas de prosodia (pitch, jitter, shimmer) para identificar patrones que el oído humano no percibe.


2. Herramientas gratuitas y ejemplos de código

A continuación, tres opciones open‑source que puedes integrar en minutos. Todas funcionan en Linux/macOS/Windows y requieren solo Python 3.9+.

2.1 Resemblyzer – Comparación de embeddings de voz

# Instalación
pip install git+https://github.com/resemble-ai/Resemblyzer.git
Enter fullscreen mode Exit fullscreen mode
from resemblyzer import VoiceEncoder, preprocess_wav
import numpy as np
import soundfile as sf

# Carga la muestra sospechosa y la referencia (grabación real del usuario)
wav_sospechosa, _ = preprocess_wav("call.wav")
wav_ref, _       = preprocess_wav("voice_reference.wav")

enc = VoiceEncoder()
emb_sospechosa = enc.embed_utterance(wav_sospechosa)
emb_ref       = enc.embed_utterance(wav_ref)

# Cosine similarity: >0.85 → muy similar (posible deepfake)
similarity = np.inner(emb_sospechosa, emb_ref)
print(f"Similitud: {similarity:.3f}")
Enter fullscreen mode Exit fullscreen mode

Tip práctico: guarda una muestra corta (5 s) de la voz de cada empleado en un directorio seguro y ejecuta el script cada vez que recibas una llamada sospechosa.

2.2 DeepSpeech (Mozilla) – Transcripción y detección de anomalías

# Instalación (requiere CUDA opcional para velocidad)
pip install deepspeech
wget https://github.com/mozilla/DeepSpeech/releases/download/v0.9.3/deepspeech-0.9.3-models.pbmm
Enter fullscreen mode Exit fullscreen mode
import deepspeech
import wave
import numpy as np

model = deepspeech.Model('deepspeech-0.9.3-models.pbmm')
def transcribe(path):
    with wave.open(path, 'rb') as wf:
        frames = wf.getnframes()
        buffer = wf.readframes(frames)
        data = np.frombuffer(buffer, dtype=np.int16)
        return model.stt(data)

texto = transcribe('call.wav')
print("Transcripción:", texto)
# Busca palabras fuera de contexto o frases incoherentes → posible deepfake
Enter fullscreen mode Exit fullscreen mode

2.3 Kaldi + VoiceID – Creación de perfiles de hablantes

# Instalación rápida vía Docker (evita complicaciones de compilación)
docker run -it --rm kaldi/kaldi:latest /bin/bash
Enter fullscreen mode Exit fullscreen mode

Dentro del contenedor, sigue la guía oficial de VoiceID para entrenar un modelo con tus grabaciones de referencia y luego ejecutar:


bash
# Supongamos que ya tienes un modelo entrenado llamado speaker_model
online2-wav-nnet3-latgen-faster \
  --online=false \
  --do-endpointing=false \
  --frame-subsampling-factor=3 \
  --acoustic-scale=1.0 \
  speaker_model/graph/HCLG.fst \
  speaker_model/graph/words.txt \
  speaker_model/graph/phones.txt \
  speaker_model/graph/phones/word_boundary.int \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/graph/phones/word_boundary.txt \
  speaker_model/

---
*Herramienta mencionada: [Groq Cloud](https://groq.com)*
Enter fullscreen mode Exit fullscreen mode

Top comments (0)