Adversariële audiovoorbeelden
Technieken voor het vervaardigen van adversariële audioverstoringen, waaronder psychoakoestische verberging, frequentiedomein-aanvallen en over-the-air adversariële audio.
Formulering van adversariële audio
Het probleem van adversariële audio: gegeven een bron-audiosignaal x en een doeltranscriptie y_target, vind een verstoring delta zodanig dat:
ASR(x + delta) = y_target
subject to: delta is imperceptible to humans
In tegenstelling tot afbeeldingen, waar onwaarneembaarheid wordt gemeten met Lp-normen, wordt de onwaarneembaarheid van audio bepaald door de maskeringseigenschappen van het menselijke gehoorsysteem.
Psychoakoestische verberging
Auditieve maskering
Twee soorten maskering maken adversariële audio mogelijk:
Simultane maskering: Een luid geluid op één frequentie maakt nabijgelegen zachtere frequenties onhoorbaar. Een luide toon op 1kHz maskeert geluiden tussen ongeveer 800Hz-1,2kHz die onder een bepaalde drempel liggen.
Temporele maskering: Een luid geluid maakt voorafgaande (backward masking, ~5ms) en volgende (forward masking, ~50-200ms) geluiden tijdelijk onhoorbaar.
import numpy as np
from scipy.signal import stft
def compute_masking_threshold(
audio: np.ndarray,
sample_rate: int = 16000,
frame_size: int = 512
) -> np.ndarray:
"""
Bereken een vereenvoudigde psychoakoestische maskeringsdrempel.
Returns: drempel per frequentiebin per frame.
Verstoringen onder deze drempel zijn onhoorbaar.
"""
# Bereken STFT
f, t, Zxx = stft(audio, fs=sample_rate, nperseg=frame_size)
power_spectrum = np.abs(Zxx) ** 2
# Vereenvoudigd maskeringsmodel (Schroeder-spreidingsfunctie)
num_freq_bins = power_spectrum.shape[0]
masking_threshold = np.zeros_like(power_spectrum)
for frame_idx in range(power_spectrum.shape[1]):
frame_power = power_spectrum[:, frame_idx]
for i in range(num_freq_bins):
if frame_power[i] < 1e-10:
continue
# Spreid maskering naar naburige frequenties
for j in range(num_freq_bins):
bark_diff = abs(i - j) * (sample_rate / frame_size) / 100
# Vereenvoudigde spreidingsfunctie (dB)
spread = max(
-100,
15.81 + 7.5 * (bark_diff + 0.474)
- 17.5 * np.sqrt(1 + (bark_diff + 0.474) ** 2)
)
masking_threshold[j, frame_idx] += (
frame_power[i] * 10 ** (spread / 10)
)
return masking_threshold
def psychoacoustic_perturbation(
perturbation: np.ndarray,
masking_threshold: np.ndarray,
sample_rate: int = 16000,
frame_size: int = 512
) -> np.ndarray:
"""
Schaal de verstoring zodat deze onder de maskeringsdrempel blijft.
Dit maakt de verstoring onhoorbaar terwijl de magnitude wordt gemaximaliseerd.
"""
f, t, pert_stft = stft(perturbation, fs=sample_rate, nperseg=frame_size)
pert_power = np.abs(pert_stft) ** 2
# Schaal elke frequentiebin zodat deze onder de maskeringsdrempel blijft
scale = np.ones_like(pert_power)
exceeds = pert_power > masking_threshold
scale[exceeds] = np.sqrt(
masking_threshold[exceeds] / (pert_power[exceeds] + 1e-10)
)
scaled_stft = pert_stft * scale
# Inverse STFT om de tijddomein-verstoring te verkrijgen
from scipy.signal import istft
_, scaled_perturbation = istft(scaled_stft, fs=sample_rate, nperseg=frame_size)
return scaled_perturbation[:len(perturbation)]Frequentiedomein-aanvallen
Werken in het frequentiedomein (spectrogramruimte) in plaats van het tijddomein biedt verschillende voordelen voor adversariële audio-aanvallen.
Spectrogramverstoring
Aangezien ASR-modellen doorgaans op mel-spectrogrammen werken, is verstoring in de spectrogramruimte directer:
import torch
import torchaudio
def spectrogram_attack(
model,
audio: torch.Tensor,
target_ids: torch.Tensor,
num_steps: int = 500,
step_size: float = 0.01
) -> torch.Tensor:
"""
Aanval in de mel-spectrogramruimte voor efficiëntere optimalisatie.
"""
# Converteer naar mel-spectrogram
mel_transform = torchaudio.transforms.MelSpectrogram(
sample_rate=16000, n_fft=400, n_mels=80
)
mel = mel_transform(audio)
mel_delta = torch.zeros_like(mel, requires_grad=True)
optimizer = torch.optim.Adam([mel_delta], lr=step_size)
for step in range(num_steps):
perturbed_mel = mel + mel_delta
# Forward door het model (startend vanaf mel-features)
logits = model.encoder(perturbed_mel)
logits = model.decoder(logits, target_ids[:, :-1])
loss = torch.nn.functional.cross_entropy(
logits.view(-1, logits.size(-1)),
target_ids[:, 1:].reshape(-1)
)
optimizer.zero_grad()
loss.backward()
optimizer.step()
# Beperk de magnitude van de verstoring
with torch.no_grad():
mel_delta.data = torch.clamp(mel_delta.data, -2.0, 2.0)
return (mel + mel_delta).detach()Bandbeperkte verstoring
Het beperken van verstoringen tot specifieke frequentiebanden kan de onwaarneembaarheid verbeteren:
def band_limited_attack(
perturbation: np.ndarray,
sample_rate: int = 16000,
low_freq: float = 4000, # Mensen zijn minder gevoelig boven 4kHz
high_freq: float = 8000
) -> np.ndarray:
"""Beperk de adversariële verstoring tot een specifieke frequentieband."""
from scipy.signal import butter, filtfilt
nyquist = sample_rate / 2
low = low_freq / nyquist
high = high_freq / nyquist
b, a = butter(4, [low, high], btype='band')
filtered = filtfilt(b, a, perturbation)
return filteredOver-the-air-robuustheid
De grootste uitdaging voor praktische audio-aanvallen: het overleven van fysiek afspelen.
Simulatie van de room impulse response
Adversariële audio trainen om robuust te zijn tegen kamerakoestiek:
def simulate_room_impulse(
audio: np.ndarray,
room_size: tuple = (5, 4, 3), # meter
source_pos: tuple = (2, 1, 1.5),
mic_pos: tuple = (3, 3, 1.5),
sample_rate: int = 16000
) -> np.ndarray:
"""
Simuleer kamerakoestiek met de image source method.
Gebruik dit tijdens adversariële optimalisatie om de robuustheid te verbeteren.
"""
# Vereenvoudigd: convolueer met een synthetische room impulse response
# Gebruik in de praktijk pyroomacoustics voor nauwkeurige simulatie
rt60 = 0.4 # nagalmtijd in seconden
num_samples = int(rt60 * sample_rate)
# Exponentieel afnemende ruis benadert de room impulse
rir = np.random.randn(num_samples)
rir *= np.exp(-np.arange(num_samples) / (rt60 * sample_rate / 6.9))
rir[0] = 1.0 # direct pad
rir /= np.max(np.abs(rir))
return np.convolve(audio, rir, mode='same')
def robust_adversarial_optimization(
model,
audio: torch.Tensor,
target_ids: torch.Tensor,
num_rooms: int = 5,
num_steps: int = 1000
) -> torch.Tensor:
"""
Optimaliseer adversariële audio om robuust te zijn over meerdere
gesimuleerde kamercondities (Expectation over Transformation).
"""
delta = torch.zeros_like(audio, requires_grad=True)
for step in range(num_steps):
total_loss = 0
for _ in range(num_rooms):
# Willekeurige kamersimulatie
room_audio = apply_random_room_sim(audio + delta)
logits = model(room_audio)
loss = compute_target_loss(logits, target_ids)
total_loss += loss / num_rooms
total_loss.backward()
with torch.no_grad():
delta.data -= 0.001 * delta.grad.sign()
delta.data = torch.clamp(delta.data, -0.02, 0.02)
delta.grad.zero_()
return (audio + delta).detach()Vergelijking van aanvalsbenaderingen
| Benadering | Onwaarneembaarheid | Digitaal succes | OTA-succes | Berekening |
|---|---|---|---|---|
| Tijddomein-PGD | Laag | Hoog | Laag | Gemiddeld |
| Psychoakoestische PGD | Hoog | Hoog | Laag-gemiddeld | Hoog |
| Spectrogramaanval | Gemiddeld | Hoog | Laag | Gemiddeld |
| Bandbeperkt | Gemiddeld-hoog | Gemiddeld | Gemiddeld | Gemiddeld |
| Kamerrobuust (EoT) | Gemiddeld | Gemiddeld-hoog | Gemiddeld-hoog | Zeer hoog |
Verwante onderwerpen
- Speech Recognition Attacks -- hoger gelegen ASR-aanvalsstrategieën
- Adversarial Image Examples for VLMs -- parallelle concepten in het visuele domein
- Lab: Crafting Audio Adversarial Examples -- praktische oefening
Referenties
- "Audio Adversarial Examples: Targeted Attacks on Speech-to-Text" - Carlini & Wagner (2018) - Foundational targeted adversarial audio attack methodology
- "Imperceptible, Robust, and Targeted Adversarial Examples for Automatic Speech Recognition" - Qin et al. (2019) - Psychoacoustic masking for imperceptible audio attacks
- "Robust Audio Adversarial Example for a Physical Attack" - Yakura & Sakuma (2019) - Room-robust adversarial audio using Expectation over Transformation
- "AdvPulse: Universal, Synchronization-free, and Targeted Audio Adversarial Attacks via Subsecond Perturbations" - Li et al. (2020) - Universal adversarial audio perturbation techniques
Waarom is psychoakoestische maskering belangrijk voor adversariële audio-aanvallen?