前言
Google DeepMind 在 2023 年 Google I/O 上推出了 SynthID,一個能為 AI 產生的文字、影像、音訊和影片嵌入不可見浮水印的系統。截至目前,已有超過 100 億 筆內容被標記。
然而,浮水印技術從來就不是銀彈。過去一年,社群開發者陸續提出各種 bypass 方法,從簡單的翻譯迴圈到複雜的頻譜分析攻擊,形成了一場精彩的「偵測 vs 逃避」軍備競賽。
這篇文章帶你從原始碼層面理解 SynthID 的核心邏輯,並帶你看懂目前最前線的 bypass 實作。
SynthID 到底怎麼嵌入水印?
文字水印(SynthID-Text)
SynthID-Text 的巧妙之處在於——它不是在產生完文字後再加東西,而是在 LLM 生成過程中的 logits 階段 就動手腳。
核心流程只有三步:
第一步:Keyed Random Partitioning(有鑰匙的隨機分割)
用一個 seed 值,透過 pseudorandom function 把整個詞彙表分成兩個集合:green list(綠名單)和 red list(紅名單)。
# SynthID 原始碼中的核心邏輯
from synthid_text import logits_processing
# 建立 keyed random partition
green_list, red_list = logits_processing.keyed_random_partition(
vocab_size=len(tokenizer),
fraction=0.5, # 一半在綠名單
seed=42,
ngram_len=1 # 基於單字(可調整)
)
第二步:Positive Bias(正偏置注入)
對 green list 中的 token 加上正偏置,讓模型在採樣時更傾向選擇它們。這不會改變語言品質,只是稍微「推一把」統計分佈。
第三步:Tournament Sampling(錦標賽採樣)
在 green 和 red 兩組中各選一個候選 token,透過 tournament 機制偏好 green list。最終生成的文字看起來完全自然,但統計上 green list token 的比例顯著偏高。
# 使用 Hugging Face Transformers 4.46+ 的簡化寫法
from synthid_text import synthid_mixin
model = synthid_mixin.SynthIDGemmaForCausalLM.from_pretrained(
MODEL_NAME,
device_map='auto',
torch_dtype=torch.bfloat16
)
# 標準 generate 就會自動嵌入水印
outputs = model.generate(**inputs, do_sample=True, max_length=512)
影像水印(SynthID-Image)
SynthID-Image 採用的是 post-hoc(後處理) 架構,與特定模型解耦:
訓練目標是優化一組 encoder-decoder 對,讓它在各種影像變換(壓縮、裁剪、濾鏡)後仍能正確還原 payload:
其中 τ 代表各種可能的變換操作。
決策機制 則使用 conformal p-values 做非參數假設檢驗——H₀ 假設「沒有水印」,H₁ 假設「有水印」,同時控制 False Positive Rate 和 True Positive Rate。
文字水印的偵測原理
SynthID 提供兩種偵測器:
Weighted Mean Detector(無需訓練)
最簡單的方式:計算生成文字中有多少 token 落在 green list,統計其顯著性(g-value)。如果 green list token 的比例顯著高於 50%(隨機期望值),就判定為有水印。
# 概念性範例
g_values = []
for token in generated_text:
if token in green_list:
g_values.append(1.0) # 落在綠名單
else:
g_values.append(0.0) # 落在紅名單
# 計算加權平均 g-value
score = weighted_mean(g_values)
is_watermarked = score > threshold # 通常 threshold ≈ 0.55
Bayesian Detector(需訓練)
更精準但需要代表性訓練資料。用訓練好的模型來評估 g-value 的分佈,比單純的 frequentist 方法更能抵抗 attacks。
影像水印的偵測原理
SynthID-Image 的水印是 resolution-dependent spread-spectrum(解析度相關的擴頻)水印:
- 載體頻率綁定在特定的 pixel grid 位置
- Phase template 對同一模型產生的所有影像是固定的
- 透過跨色彩通道的 phase consensus 來定位水印
# Reverse-SynthID 中的關鍵偵測邏輯
def compute_phase_consensus(image, fy, fx, channels):
"""
計算特定頻率的相位一致性
值接近 1.0 = 有 locked watermark
值 < 0.3 = 純內容區域
"""
phase_per_color = []
for ch in channels:
phase = extract_phase(image[:, :, ch], fy, fx)
phase_per_color.append(exp(1j * phase))
consensus = abs(mean(phase_per_color))
return consensus
最新 bypass 方法大賞
方法一:翻譯迴圈(最簡單)
把生成文字用不同語言翻譯再翻回來,會顯著降低 green list token 的比例。不過效果取決於翻譯模型的品質。
方法二:Paraphrasing(改寫)
用另一個 LLM 重新改寫輸出,改變 surface form 但保留語意。這會破壞統計水印模式。
方法三:Reverse-SynthID(最強大)
這是目前社群開發者提出的最完整 bypass pipeline,對 Gemini 的影像水印達成 91% 的 phase coherence drop,且 PSNR 高達 43+ dB(視覺上無損)。
整個流程分為 7 個階段:
| 階段 | 方法 | 目的 |
|---|---|---|
| 0 | VAE Round-trip | 把影像投影到 natural-image manifold 之外 |
| 1 | Elastic Deformation | 低頻隨機變形場,打散 phase consensus |
| 2 | Global Geometric Combo | 小旋轉 + 縮放 + 位移 |
| 3 | Resize-Squeeze | 降採樣(AREA) → 升採樣(LANCZOS) 消除 sub-pixel 資料 |
| 4 | Color-Contrast Nudge | HSV 色彩空間微調 |
| 5 | Residual-Phase FFT Subtraction | 目標性移除 carrier frequency bins |
| 6 | JPEG Chain + Luma Noise | 最終重新編碼打斷 |
# 一鍵執行 Round-06 全自動攻擊
python scripts/dissolve_batch.py \
--input ./to_clean/ \
--output ./runs/bypass/ \
--codebook spectral_codebook_v4.npz \
--model nano-banana-pro-preview \
--strengths final nuke
方法四:Diffusion Reconstruction(結構保留)
透過 diffusion model 重新生成,用 Canny ControlNet 鎖住原始結構。因為 SynthID 水印存在 low-level noise 中,constrained reconstruction 會丟掉它但保留內容。
GitHub 專案:00quebec/Synthid-Bypass
最新加強:SynGuard 雙層水印(2025.08)
純 logit-based 的水印有個致命弱點:它只看到「詞」,看不到「意思」。攻擊者只要改寫語意(paraphrasing、同義詞替換、翻譯),水印就消失了。
SynGuard 的解法是在 SynthID 之上再加一層 semantic-level watermarking:
關鍵參數 δ = 0.7(語意權重 70%)是作者找到的最優設定。
效果驚人:
| 攻擊場景 | SynthID-Text F1 | SynGuard F1 |
|---|---|---|
| 無攻擊 | 1.000 | 0.998 |
| 同義詞替換 | 0.884 | 0.965 |
| 複製貼上 | 0.788 | 0.891 |
| Paraphrasing | 0.842 | 0.923 |
| 中英互翻 | 0.711 | 0.777 |
SynGuard 在各種 attack 下的 F1 score 都比原版 SynthID 高出約 11.1%。
GitHub: githshine/SynGuard
業界現況與未來趨勢
各家的策略
| 公司 | 策略 | 狀態 |
|---|---|---|
| SynthID 全媒體覆蓋(文字/影像/音訊/影片) | 全面部署,已標記 100 億+ 筆內容 | |
| OpenAI | 放棄文字水印,改用 C2PA metadata | 影像水印 |
| Meta | Video Seal(自有技術) | 開發中 |
| Microsoft | 自有水印方案 | 開發中 |
三大趨勢
- 從單層到多層防護:SynthID + C2PA metadata + fingerprinting(相似度搜尋)三層疊加
- 從 pure logit 到 semantic-aware:SynGuard 代表的雙層嵌入是文字水印的下一步
- 從 invisible watermark 到 transparency-first:業界逐漸轉向「明確標示 + 使用者偏好過濾」的模式
法規驅動
EU AI Act 要求在 2026 年 8 月前全面合規,所有 AI 產生的內容必須包含機器可讀的標籤。這才是 SynthID 等技術加速部署的真正推手——即使技術還不夠完美,法規 deadline 不等人。
實作摘要
如果你想在專案中實作 SynthID 水印:
文字水印(推薦用 Hugging Face 整合版):
from transformers import AutoTokenizer, AutoModelForCausalLM
from synthid_text import synthid_mixin
# 1. 載入模型
model = synthid_mixin.SynthIDGemmaForCausalLM.from_pretrained(
"google/gemma-2-2b-it",
device_map="auto",
torch_dtype=torch.bfloat16
)
tokenizer = AutoTokenizer.from_pretrained("google/gemma-2-2b-it")
# 2. 生成水印文字
inputs = tokenizer("台灣的美食文化", return_tensors="pt").to(model.device)
outputs = model.generate(**inputs, do_sample=True, max_length=200)
watermarked_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
# 3. 偵測水印
from synthid_text import BayesianDetector
detector = BayesianDetector()
score = detector.score(watermarked_text)
print(f"水印分數: {score:.4f}") # >0.5 表示有高機率有水印
影像水印 bypass(Reverse-SynthID):
from robust_extractor import RobustSynthIDExtractor
from synthid_bypass_v4 import SpectralCodebookV4
# 載入頻譜 codebook
cb = SpectralCodebookV4()
cb.load('artifacts/spectral_codebook_v4.npz')
# 偵測
ext = RobustSynthIDExtractor()
result = ext.detect_from_v4_codebook(image_rgb, cb, model='nano-banana-pro-preview')
print(f"有水印: {result.is_watermarked}")
print(f"信心值: {result.confidence:.4f}")
print(f"相位匹配: {result.phase_match:.4f}")
結語
SynthID 的攻防戰才剛開始。從 pure logit-based 的簡單偏置,到 semantic-aware 的雙層嵌入;從單一的 FFT subtraction,到 7 階段的 Reverse-SynthID pipeline——這場軍備競賽的背後,是 AI 內容認證技術從「玩具」走向「工業標準」的必經之路。
對於開發者來說,關鍵認知是:沒有完美的浮水印。SynthID 的价值不在於「防住所有攻擊」,而在於提供一個業界標準的透明度層級。未來,watermark 會和其他技術(C2PA、fingerprinting、metadata)協同工作,共同構建 AI 內容的信任基礎設施。
參考資料:
- Dathathri et al. (2024). “Scalable watermarking for identifying large language model outputs.” Nature.
- SynthID-Image: Image watermarking at internet scale. arXiv:2510.09263
- SynGuard: Robustness Assessment and Enhancement of Text Watermarking for Google’s SynthID. arXiv:2508.20228
- Reverse-SynthID: reverse engineering Gemini’s SynthID detection. GitHub: aloshdenny/reverse-SynthID
- Stable signature is unstable: Removing image watermark from diffusion models. arXiv:2405.07145