語音辨識攻擊
Advanced4 min readUpdated 2026-03-13
攻擊自動語音辨識系統,包括轉錄結果與聽感不同的對抗音訊、隱藏語音指令,以及背景音訊注入。
ASR 系統如何運作(以及如何崩壞)
ASR 系統將音訊波形轉為文字。現代系統採用「管線式」(特徵擷取後接序列模型)或「端到端」神經網路。兩者皆有漏洞。
音訊波形
│
▼
┌──────────────┐
│ Mel 頻譜圖 │ ← 頻域表示
└──────────────┘
│
▼
┌──────────────┐
│ Encoder │ ← 擷取音訊特徵
│ (Transformer) │
└──────────────┘
│
▼
┌──────────────┐
│ Decoder │ ← 逐 token 產生文字
│ (Transformer) │
└──────────────┘
│
▼
文字輸出
隱藏語音指令
隱藏語音指令利用人類所聽到與機器所轉錄之間的差異。
超音波攻擊(DolphinAttack)
人類聽不到約 20kHz 以上的頻率。然而,麥克風硬體可擷取超音波訊號,且類比至數位轉換器中的非線性效應可將其解調到模型可處理的可聽範圍。
import numpy as np
import soundfile as sf
def generate_ultrasonic_carrier(
command_audio: np.ndarray,
sample_rate: int = 44100,
carrier_freq: float = 25000 # 超出人類聽覺
) -> np.ndarray:
"""
將語音指令調變至超音波載波上。
警告:此為簡化示範。真實超音波攻擊需仔細的
硬體校準與訊號處理。
"""
t = np.arange(len(command_audio)) / sample_rate
# 產生載波
carrier = np.cos(2 * np.pi * carrier_freq * t)
# 振幅調變
modulated = carrier * (1 + 0.5 * command_audio)
return modulated混淆式語音指令
對人類聽來像雜訊或音樂、卻可被轉錄成特定文字的指令:
| 技術 | 人類聽感 | 機器轉錄 | 成功率 |
|---|---|---|---|
| 速度操弄 | 難以辨識的快速語音 | 正常速度指令 | 中 |
| 音調偏移 | 不尋常的尖銳/低沉聲音 | 正常語音 | 中高 |
| 雜訊遮蔽 | 背景雜訊 | 清晰指令 | 低—中 |
| 音樂嵌入 | 背景音樂 | 隱藏指令 | 低 |
| 逆播語音片段 | 反向音訊 | 正向指令 | 低 |
目標轉錄攻擊
攻擊者的目標:打造會轉錄為攻擊者選定特定字串的音訊。
白箱做法
在可取得 ASR 模型的情況下,梯度式最佳化可打造轉錄為任意目標的音訊:
import torch
import torchaudio
def targeted_asr_attack(
model,
source_audio: torch.Tensor,
target_text: str,
epsilon: float = 0.02, # 最大擾動振幅
num_steps: int = 1000,
step_size: float = 0.001
) -> torch.Tensor:
"""
打造使 ASR 模型轉錄為 target_text 的對抗音訊。
Args:
model:ASR 模型(例如 Whisper)
source_audio:原始音訊波形 [1, T]
target_text:期望的轉錄輸出
epsilon:L-inf 擾動上界
"""
delta = torch.zeros_like(source_audio, requires_grad=True)
# 將目標文字編為 token ID
target_ids = model.tokenizer.encode(target_text)
target_ids = torch.tensor([target_ids])
optimizer = torch.optim.Adam([delta], lr=step_size)
for step in range(num_steps):
adv_audio = source_audio + delta
# 前向通過 ASR 模型
mel = model.compute_mel(adv_audio)
logits = model.forward(mel, target_ids[:, :-1])
# 以目標計算 CTC 或 cross-entropy 損失
loss = torch.nn.functional.cross_entropy(
logits.view(-1, logits.size(-1)),
target_ids[:, 1:].reshape(-1)
)
optimizer.zero_grad()
loss.backward()
optimizer.step()
# 投影至 epsilon 球
with torch.no_grad():
delta.data = torch.clamp(delta.data, -epsilon, epsilon)
# 確保音訊值於合法範圍
delta.data = torch.clamp(
source_audio + delta.data, -1, 1
) - source_audio
return (source_audio + delta).detach()黑箱做法
無模型存取時,攻擊者採可遷移性或查詢式方法:
替代模型
訓練或使用開源 ASR 模型(Whisper)作為替代。於其上打造對抗音訊。
遷移攻擊
將對抗音訊對目標黑箱系統測試。CLIP 式攻擊在視覺模型的遷移率 30–60%;ASR 遷移率類似。
查詢精煉
若可存取 API,依目標系統的轉錄回應反覆精煉對抗音訊。
背景音訊注入
於正常錄音中經由背景音訊注入指令或內容:
會議注入
def mix_hidden_command(
meeting_audio: np.ndarray,
command_audio: np.ndarray,
injection_time: float, # 秒
sample_rate: int = 16000,
snr_db: float = -20 # 指令較會議音訊低 20dB
) -> np.ndarray:
"""
以低音量將隱藏指令混入會議音訊。
於 -20dB SNR 下,指令對人類幾乎不可聞,
但可能被敏感的 ASR 系統擷取。
"""
# 計算注入樣本位置
inject_start = int(injection_time * sample_rate)
inject_end = inject_start + len(command_audio)
# 將指令音訊縮放至期望 SNR
signal_power = np.mean(meeting_audio[inject_start:inject_end] ** 2)
noise_power = signal_power * (10 ** (-snr_db / 10))
current_power = np.mean(command_audio ** 2)
scaling = np.sqrt(noise_power / (current_power + 1e-10))
result = meeting_audio.copy()
result[inject_start:inject_end] += command_audio * scaling
return np.clip(result, -1, 1)ASR 攻擊於真實世界的穩健性因素
真實世界的效果取決於環境條件:
| 因素 | 影響 | 緩解難度 |
|---|---|---|
| 背景雜訊 | 使對抗訊號退化 | 高——不可預期 |
| 音訊壓縮(MP3、Opus) | 可能摧毀擾動 | 中——可預期 |
| 混響 | 扭曲頻率內容 | 高——依空間 |
| 距離(over-the-air) | 使訊號衰減並扭曲 | 中——可校準 |
| 麥克風類型 | 不同頻率響應 | 中——可做輪廓 |
| 採樣率不匹配 | 產生混疊 | 低——可對齊 |
相關主題
參考資料
- "DolphinAttack: Inaudible Voice Commands" - Zhang et al.(2017)- 超音波隱藏語音指令攻擊的開創性研究
- "CommanderSong: A Systematic Approach for Practical Adversarial Voice Recognition" - Yuan et al.(2018)- 將語音指令嵌入音樂與環境音訊
- "Whisper Adversarial Attacks: Exploiting ASR Models for Targeted Transcription" - Olivier & Raj(2023)- 針對 Whisper ASR 模型的目標對抗攻擊
- "Practical Hidden Voice Attacks against Speech and Speaker Recognition Systems" - Abdullah et al.(2019)- 隱藏語音指令傳送的真實世界評估
Knowledge Check
為何在數位(檔案式)測試中有效的對抗音訊攻擊,於 over-the-air 傳送時常失敗?