前言

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(後處理) 架構,與特定模型解耦:

IEWDnnaepctcuoeotdrdeCmeIr-armbrafikgpSg(te(ayexdwyn,palt(aItohxcymeaI))lardDogm-+aeacIdrmPkaaegydel_oiPamidapge(elc)i)ne

訓練目標是優化一組 encoder-decoder 對,讓它在各種影像變換(壓縮、裁剪、濾鏡)後仍能正確還原 payload:

msi.nt_.f,gExd[,(cx,,(τgf((τx()f)(x,εc))),c)]ε

其中 τ 代表各種可能的變換操作。

決策機制 則使用 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 個階段

階段方法目的
0VAE Round-trip把影像投影到 natural-image manifold 之外
1Elastic Deformation低頻隨機變形場,打散 phase consensus
2Global Geometric Combo小旋轉 + 縮放 + 位移
3Resize-Squeeze降採樣(AREA) → 升採樣(LANCZOS) 消除 sub-pixel 資料
4Color-Contrast NudgeHSV 色彩空間微調
5Residual-Phase FFT Subtraction目標性移除 carrier frequency bins
6JPEG 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

P_final(x)=+Pδ(_1b·-aδsP)e_(s·xe)mPa_ngtriece(nx_)bias(x)SynthID

關鍵參數 δ = 0.7(語意權重 70%)是作者找到的最優設定。

效果驚人:

攻擊場景SynthID-Text F1SynGuard F1
無攻擊1.0000.998
同義詞替換0.8840.965
複製貼上0.7880.891
Paraphrasing0.8420.923
中英互翻0.7110.777

SynGuard 在各種 attack 下的 F1 score 都比原版 SynthID 高出約 11.1%

GitHub: githshine/SynGuard

業界現況與未來趨勢

各家的策略

公司策略狀態
GoogleSynthID 全媒體覆蓋(文字/影像/音訊/影片)全面部署,已標記 100 億+ 筆內容
OpenAI放棄文字水印,改用 C2PA metadata影像水印
MetaVideo Seal(自有技術)開發中
Microsoft自有水印方案開發中

三大趨勢

  1. 從單層到多層防護:SynthID + C2PA metadata + fingerprinting(相似度搜尋)三層疊加
  2. 從 pure logit 到 semantic-aware:SynGuard 代表的雙層嵌入是文字水印的下一步
  3. 從 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