Files
SnapOtter/apps/docs/zh-TW/api/ai.md
T

439 lines
21 KiB
Markdown
Raw Normal View History

---
description: "AI 引擎參考,涵蓋所有本機 ML 工具。去背、放大、OCR、人臉偵測、相片修復等。"
i18n_source_hash: 14728c1dcd05
i18n_provenance: machine
i18n_output_hash: 36207813ccb8
---
# AI 引擎參考 {#ai-engine-reference}
`@snapotter/ai` 套件將 Node.js 橋接到一個**常駐的 Python sidecar**,用於所有 ML 操作。dispatcher 程序在兩次請求之間保持存活,以獲得快速的暖啟動效能。啟動時會自動偵測 NVIDIA CUDA,可用時即加以使用;否則 AI 工具會在 CPU 上執行。
目前不支援透過 VA-API、Quick Sync 或 OpenCL 進行 Intel/AMD iGPU 的 AI 推論加速。除非有支援 CUDA 的 NVIDIA GPU 可用,否則將 `/dev/dri` 對映進容器並不會加速這些 Python sidecar 工具。
19 個 Python sidecar AI 工具,橫跨四種模態(image、audio、video、document),另有 2 個具備選用 AI 功能的工具。所有模型都在本機執行,初次下載模型後即不需要網際網路。
## 架構 {#architecture}
```
Node.js Tool Route
|
v
@snapotter/ai bridge.ts
| (stdin/stdout JSON + stderr progress events)
v
Python dispatcher (persistent process, "ai" profile)
|
|-- remove_bg.py (rembg / BiRefNet)
|-- upscale.py (RealESRGAN)
|-- inpaint.py (LaMa ONNX)
|-- outpaint.py (LaMa canvas expansion)
|-- ocr.py (PaddleOCR / Tesseract)
|-- ocr_pdf.py (page-by-page document OCR)
|-- ocr_preprocess.py (image enhancement for OCR)
|-- detect_faces.py (MediaPipe)
|-- face_landmarks.py (MediaPipe landmarks)
|-- enhance_faces.py (GFPGAN / CodeFormer)
|-- colorize.py (DDColor)
|-- noise_removal.py (SCUNet / tiered denoising)
|-- red_eye_removal.py (landmark + color analysis)
|-- restore.py (scratch repair + enhancement + denoising)
|-- transcribe.py (faster-whisper speech-to-text)
+-- install_feature.py (on-demand bundle installer)
```
另有一個獨立的「docs」dispatcher 設定檔,以文件處理指令碼(`doc_pagecount``doc_health``doc_flatten``doc_redact``doc_text``doc_to_word``doc_metadata``doc_html_pdf`)取代 AI 允許清單,並略過大型 ML 匯入。
**逾時:** 預設 300 秒;OCR 與 BiRefNet 去背則為 600 秒。
## 功能套件包 {#feature-bundles}
AI 模型是依共用相依堆疊來封裝,而非每個工具一個封存檔。當多個工具使用相同的模型家族、Python wheel 或原生函式庫時,一個功能套件包可同時啟用這些工具。這讓發行的 Docker 映像更小,並避免重複儲存相同的背景去背、人臉偵測、OCR、修復與語音模型。
Docker 映像隨附應用程式加上共用執行環境。大型模型封存檔會在需要時下載到常駐的 `/data/ai` 磁碟區,之後由所有需要它的工具重複使用。如果某個套件包已因另一個工具的需要而安裝,啟用一個新的相依工具並不會再次下載該套件包。
每個 AI 工具在能執行前都需要一個或多個功能套件包。管理員 UI 是依工具透過 `POST /api/v1/admin/tools/:toolId/features/install` 進行安裝,它會解析完整的套件包清單、略過已安裝的套件包,並只將缺少的下載排入佇列。舉例來說,在全新的執行個體上啟用 Passport Photo 會將 `background-removal``face-detection` 排入佇列;若在 Background Removal 已安裝後才啟用它,則只會將 `face-detection` 排入佇列。
| 套件包 | 大小 | 共用相依群組 | 使用它的工具 |
|--------|------|-------------------------|-------------------|
| `background-removal` | 4-5 GB | rembg / BiRefNet 背景去背 | remove-background、passport-photo、transparency-fixer、background-replace、blur-background |
| `face-detection` | 200-300 MB | MediaPipe 人臉偵測與特徵點 | blur-faces、red-eye-removal、smart-crop |
| `object-eraser-colorize` | 1-2 GB | LaMa 影像修補/外延與 DDColor | erase-object、colorize、ai-canvas-expand |
| `upscale-enhance` | 5-6 GB | RealESRGAN、GFPGAN / CodeFormer、去雜訊 | upscale、enhance-faces、noise-removal |
| `photo-restoration` | 4-5 GB | 刮痕修復與修復流程 | restore-photo |
| `ocr` | 5-6 GB | PaddleOCR / Tesseract OCR 堆疊 | ocr、ocr-pdf |
| `transcription` | ~600 MB | faster-whisper 語音轉文字模型 | transcribe-audio、auto-subtitles |
具有跨套件包相依性的工具:
| 工具 | 必要套件包 | 原因 |
|------|------------------|-----|
| `passport-photo` | `background-removal``face-detection` | 先移除背景,再用人臉特徵點依護照與身分證照片規則框住裁切範圍。 |
| `enhance-faces` | `upscale-enhance``face-detection` | 在對選定的人臉區域執行 GFPGAN 或 CodeFormer 增強之前,先偵測人臉。 |
只有在工具所有必要套件包都已安裝時,該工具才可用。部分安裝是有效的,並以漸進方式處理:已安裝的套件包會重複使用、缺少的套件包顯示為待下載,而排入佇列的安裝會一次執行一個,以免共用的 Python 環境被同時修改。
---
## 去背 {#background-removal}
**工具路由:** `remove-background`
**模型:** rembg 搭配 BiRefNet(預設)或 U2-Net 變體
| 參數 | 型別 | 預設值 | 說明 |
|-----------|------|---------|-------------|
| `model` | string | - | 模型變體(選用覆寫) |
| `backgroundType` | string | `"transparent"` | 其一:`transparent``color``gradient``blur``image` |
| `backgroundColor` | string | - | 純色背景的十六進位色碼 |
| `gradientColor1` | string | - | 第一個漸層顏色 |
| `gradientColor2` | string | - | 第二個漸層顏色 |
| `gradientAngle` | number | - | 漸層角度(以度為單位) |
| `blurEnabled` | boolean | - | 啟用背景模糊效果 |
| `blurIntensity` | number (0-100) | - | 模糊強度 |
| `shadowEnabled` | boolean | - | 為主體啟用陰影 |
| `shadowOpacity` | number (0-100) | - | 陰影不透明度 |
| `outputFormat` | string | - | 輸出格式:`png``webp``avif` |
| `edgeRefine` | integer (0-3) | - | 邊緣細化等級 |
| `decontaminate` | boolean | - | 移除邊緣的顏色滲色 |
## 背景替換 {#background-replace}
**工具路由:** `background-replace`
**模型:** rembg / BiRefNet(與 remove-background 共用)
移除背景並以純色或漸層取代。
| 參數 | 型別 | 預設值 | 說明 |
|-----------|------|---------|-------------|
| `backgroundType` | `"color"` \| `"gradient"` | `"color"` | 背景模式 |
| `color` | string | `"#ffffff"` | 背景十六進位色碼(當 `backgroundType``color` 時) |
| `gradientColor1` | string | - | 第一個漸層十六進位色碼 |
| `gradientColor2` | string | - | 第二個漸層十六進位色碼 |
| `gradientAngle` | integer (0-360) | `180` | 漸層角度(以度為單位) |
| `feather` | integer (0-20) | `0` | 邊緣羽化半徑 |
| `format` | `"png"` \| `"webp"` | `"png"` | 輸出格式 |
## 模糊背景 {#blur-background}
**工具路由:** `blur-background`
**模型:** rembg / BiRefNet(與 remove-background 共用)
在保持主體清晰的同時模糊背景。
| 參數 | 型別 | 預設值 | 說明 |
|-----------|------|---------|-------------|
| `intensity` | integer (1-100) | `50` | 模糊強度 |
| `feather` | integer (0-20) | `0` | 邊緣羽化半徑 |
| `format` | `"png"` \| `"webp"` | `"png"` | 輸出格式 |
## 影像放大 {#image-upscaling}
**工具路由:** `upscale`
**模型:** RealESRGAN(不可用時以 Lanczos 備援)
| 參數 | 型別 | 預設值 | 說明 |
|-----------|------|---------|-------------|
| `scale` | number | `2` | 放大倍率 |
| `model` | string | `"auto"` | 模型變體 |
| `faceEnhance` | boolean | `false` | 套用 GFPGAN 人臉增強處理 |
| `denoise` | number | `0` | 去雜訊強度 |
| `format` | string | `"auto"` | 輸出格式覆寫 |
| `quality` | number | `95` | 輸出品質(1-100 |
## OCR / 文字擷取 {#ocr-text-extraction}
**工具路由:** `ocr`
**模型:** Tesseract(快速)、PaddleOCR PP-OCRv5(均衡)、PaddleOCR-VL 1.5(最佳)
| 參數 | 型別 | 預設值 | 說明 |
|-----------|------|---------|-------------|
| `quality` | `"fast"` \| `"balanced"` \| `"best"` | `"balanced"` | 處理層級 |
| `language` | string | `"auto"` | 語言:`auto``en``de``fr``es``zh``ja``ko` |
| `enhance` | boolean | `true` | 對影像進行前處理以提升 OCR 準確度 |
| `engine` | string | - | 已淘汰。將 `tesseract` 對映為 `fast``paddleocr` 對映為 `balanced` |
傳回結構化結果,包含邊界框、信賴分數與擷取的文字區塊。
## PDF OCR {#pdf-ocr}
**工具路由:** `ocr-pdf`
**模型:** 與影像 OCR 相同的層級系統
使用 AI 驅動的 OCR,逐頁從掃描的 PDF 文件擷取文字。
| 參數 | 型別 | 預設值 | 說明 |
|-----------|------|---------|-------------|
| `quality` | `"fast"` \| `"balanced"` \| `"best"` | `"balanced"` | 處理層級 |
| `language` | string | `"auto"` | 語言:`auto``en``de``fr``es``zh``ja``ko` |
| `pages` | string | `"all"` | 頁面選取:`"all"``"1-3"``"1,3,5"` |
## 人臉 / PII 模糊 {#face-pii-blur}
**工具路由:** `blur-faces`
**模型:** MediaPipe 人臉偵測
| 參數 | 型別 | 預設值 | 說明 |
|-----------|------|---------|-------------|
| `blurRadius` | number (1-100) | `30` | 高斯模糊半徑 |
| `sensitivity` | number (0-1) | `0.5` | 偵測信賴度門檻 |
## 人臉增強 {#face-enhancement}
**工具路由:** `enhance-faces`
**模型:** GFPGAN、CodeFormer
| 參數 | 型別 | 預設值 | 說明 |
|-----------|------|---------|-------------|
| `model` | `"auto"` \| `"gfpgan"` \| `"codeformer"` | `"auto"` | 增強模型 |
| `strength` | number (0-1) | `0.8` | 增強強度 |
| `sensitivity` | number (0-1) | `0.5` | 人臉偵測門檻 |
| `onlyCenterFace` | boolean | `false` | 只增強最靠近中央的人臉 |
## AI 上色 {#ai-colorization}
**工具路由:** `colorize`
**模型:** DDColor(以 OpenCV DNN 備援)
將黑白或灰階相片轉換為全彩。
| 參數 | 型別 | 預設值 | 說明 |
|-----------|------|---------|-------------|
| `intensity` | number (0-1) | `1.0` | 色彩飽和度強度 |
| `model` | `"auto"` \| `"ddcolor"` \| `"opencv"` | `"auto"` | 模型變體 |
## 去雜訊 {#noise-removal}
**工具路由:** `noise-removal`
**模型:** SCUNet(分層去雜訊流程)
| 參數 | 型別 | 預設值 | 說明 |
|-----------|------|---------|-------------|
| `tier` | `"quick"` \| `"balanced"` \| `"quality"` \| `"maximum"` | `"balanced"` | 處理層級 |
| `strength` | number (0-100) | `50` | 去雜訊強度 |
| `detailPreservation` | number (0-100) | `50` | 要保留多少細節;數值越高保留越多紋理 |
| `colorNoise` | number (0-100) | `30` | 色彩雜訊降低強度 |
| `format` | string | `"original"` | 輸出格式:`original``png``jpeg``webp``avif``jxl` |
| `quality` | number (1-100) | `90` | 輸出編碼品質 |
## 紅眼移除 {#red-eye-removal}
**工具路由:** `red-eye-removal`
偵測人臉特徵點、定位眼睛區域,並修正紅色通道的過飽和。
| 參數 | 型別 | 預設值 | 說明 |
|-----------|------|---------|-------------|
| `sensitivity` | number (0-100) | `50` | 紅色像素偵測門檻 |
| `strength` | number (0-100) | `70` | 修正強度 |
| `format` | string | - | 輸出格式覆寫(選用) |
| `quality` | number (1-100) | `90` | 輸出品質 |
## 相片修復 {#photo-restoration}
**工具路由:** `restore-photo`
針對老舊或受損相片的多步驟流程:刮痕/撕裂偵測與修復、人臉增強、去雜訊,以及選用的上色。
| 參數 | 型別 | 預設值 | 說明 |
|-----------|------|---------|-------------|
| `scratchRemoval` | boolean | `true` | 偵測並修復刮痕、撕裂 |
| `faceEnhancement` | boolean | `true` | 套用人臉增強處理 |
| `fidelity` | number (0-1) | `0.7` | 人臉增強強度(越高越保守) |
| `denoise` | boolean | `true` | 套用去雜訊處理 |
| `denoiseStrength` | number (0-100) | `25` | 去雜訊強度 |
| `colorize` | boolean | `false` | 修復後進行上色 |
| `colorizeStrength` | number (0-100) | `85` | 上色強度 |
## 證件照 {#passport-photo}
**工具路由:** `passport-photo`
**模型:** MediaPipe 人臉特徵點 + BiRefNet 去背
兩階段工作流程:分析(偵測人臉 + 移除背景),接著產生(裁切、調整大小、平舖)。支援橫跨 6 個地區的 37+ 個國家。
### 階段 1:分析 {#phase-1-analyze}
`POST /api/v1/tools/image/passport-photo/analyze`
接受一個影像檔(multipart)。傳回人臉特徵點資料、一張 base64 預覽,以及影像尺寸。
### 階段 2:產生 {#phase-2-generate}
`POST /api/v1/tools/image/passport-photo/generate`
接受一個 JSON 主體,內含階段 1 的結果加上產生設定:
| 參數 | 型別 | 預設值 | 說明 |
|-----------|------|---------|-------------|
| `jobId` | string | (必填) | 來自階段 1 的 Job ID |
| `filename` | string | (必填) | 來自階段 1 的原始檔名 |
| `countryCode` | string | (必填) | ISO 國家代碼(例如 `US``GB``IN` |
| `documentType` | string | `"passport"` | 文件類型 |
| `bgColor` | string | `"#FFFFFF"` | 背景顏色十六進位色碼 |
| `printLayout` | string | `"none"` | 列印版面配置:`none``4x6``a4``letter` |
| `maxFileSizeKb` | number | `0` | 檔案大小上限(KB)(0 = 無限制) |
| `dpi` | number (72-1200) | `300` | 輸出 DPI |
| `customWidthMm` | number | - | 自訂寬度(mm)(覆寫國家規格) |
| `customHeightMm` | number | - | 自訂高度(mm)(覆寫國家規格) |
| `zoom` | number (0.5-3) | `1` | 縮放倍率 |
| `adjustX` | number | `0` | 水平位置調整 |
| `adjustY` | number | `0` | 垂直位置調整 |
| `landmarks` | object | (必填) | 來自階段 1 的特徵點 |
| `imageWidth` | number | (必填) | 來自階段 1 的影像寬度 |
| `imageHeight` | number | (必填) | 來自階段 1 的影像高度 |
## 物件擦除(影像修補) {#object-erasing-inpainting}
**工具路由:** `erase-object`
**模型:** 透過 ONNX Runtime 的 LaMa
遮罩會以**第二個檔案部分**(欄位名稱 `mask`)傳送,而非以 base64。遮罩中的白色像素表示要擦除的區域。`format``quality` 設定會以頂層表單欄位傳送。
| 參數 | 型別 | 預設值 | 說明 |
|-----------|------|---------|-------------|
| `file` | file | (必填) | 來源影像(multipart |
| `mask` | file | (必填) | 遮罩影像(multipart,欄位名稱 `mask`,白色 = 擦除) |
| `format` | string | `"auto"` | 輸出格式:`auto``png``jpg``jpeg``webp``tiff``gif``avif``heic``heif``jxl` |
| `quality` | integer (1-100) | `95` | 輸出品質 |
當有 NVIDIA GPU 可用時以 CUDA 加速。
## AI 畫布擴展 {#ai-canvas-expand}
**工具路由:** `ai-canvas-expand`
**模型:** 以 LaMa 為基礎的外延
朝任何方向擴展影像的畫布,並以與現有影像相符的 AI 生成內容填滿新增區域。
| 參數 | 型別 | 預設值 | 說明 |
|-----------|------|---------|-------------|
| `extendTop` | integer | `0` | 上方要延伸的像素數 |
| `extendRight` | integer | `0` | 右方要延伸的像素數 |
| `extendBottom` | integer | `0` | 下方要延伸的像素數 |
| `extendLeft` | integer | `0` | 左方要延伸的像素數 |
| `tier` | `"fast"` \| `"balanced"` \| `"high"` | `"balanced"` | 品質層級 |
| `format` | string | `"auto"` | 輸出格式:`auto``png``jpg``jpeg``webp``tiff``gif``avif``heic``heif``jxl` |
| `quality` | integer (1-100) | `95` | 輸出品質 |
至少要有一個延伸方向大於 0。
## 智慧裁切 {#smart-crop}
**工具路由:** `smart-crop`
**模型:** MediaPipe 人臉偵測(僅 face 模式)
| 參數 | 型別 | 預設值 | 說明 |
|-----------|------|---------|-------------|
| `mode` | string | `"subject"` | 裁切策略:`subject``face``trim` |
| `strategy` | `"attention"` \| `"entropy"` | `"attention"` | subject 模式的策略 |
| `width` | integer | - | 輸出寬度 |
| `height` | integer | - | 輸出高度 |
| `padding` | integer (0-50) | `0` | 主體周圍的留白百分比 |
| `facePreset` | string | `"head-shoulders"` | 當 `mode=face` 時的預設框取 |
| `sensitivity` | number (0-1) | `0.5` | 人臉偵測門檻 |
| `threshold` | integer (0-255) | `30` | 背景偵測門檻(trim 模式) |
| `padToSquare` | boolean | `false` | 將修剪後的結果補齊為正方形 |
| `padColor` | string | `"#ffffff"` | 正方形補齊的背景顏色 |
| `targetSize` | integer | - | 補齊輸出的目標尺寸(像素) |
| `quality` | integer (1-100) | - | 輸出品質 |
舊版 `mode``attention``content` 仍被接受,並分別對映為 `subject``trim`
**人臉預設:**
| 預設 | 最適用於 |
|--------|---------|
| `closeup` | 大頭照 |
| `head-shoulders` | 個人檔案相片 |
| `upper-body` | LinkedIn / 正式 |
| `half-body` | 完整上半身 |
## 音訊轉錄 {#transcribe-audio}
**工具路由:** `transcribe-audio`
**模型:** faster-whisper
將語音轉換為文字。支援純文字、SRT 與 VTT 輸出格式。
| 參數 | 型別 | 預設值 | 說明 |
|-----------|------|---------|-------------|
| `language` | string | `"auto"` | 語言:`auto``en``de``fr``es``zh``ja``ko``id``th``vi` |
| `outputFormat` | `"txt"` \| `"srt"` \| `"vtt"` | `"txt"` | 輸出格式 |
## 自動字幕 {#auto-subtitles}
**工具路由:** `auto-subtitles`
**模型:** faster-whisper(先從影片擷取音訊,再進行轉錄)
從影片的音軌產生字幕檔。
| 參數 | 型別 | 預設值 | 說明 |
|-----------|------|---------|-------------|
| `language` | string | `"auto"` | 語言:`auto``en``de``fr``es``zh``ja``ko``id``th``vi` |
| `format` | `"srt"` \| `"vtt"` | `"srt"` | 輸出字幕格式 |
## PNG 透明度修復 {#png-transparency-fixer}
**工具路由:** `transparency-fixer`
**模型:** BiRefNet HR-matting2048x2048 解析度)
修復「假透明」的 PNG,也就是背景已被移除但留下毛邊、光暈或半透明瑕疵的情況。使用 BiRefNet 的高解析度去背模型產生乾淨的 alpha 通道,接著套用可設定的去毛邊處理,以移除邊緣沿線的顏色汙染。
**OOM 備援鏈:** 若 BiRefNet HR-matting 超出可用記憶體,工具會自動退回 `birefnet-general`,然後退回 `u2net`
| 參數 | 型別 | 預設值 | 說明 |
|-----------|------|---------|-------------|
| `defringe` | number (0-100) | `30` | 用於移除顏色汙染的邊緣去毛邊強度 |
| `outputFormat` | `"png"` \| `"webp"` | `"png"` | 輸出影像格式 |
| `removeWatermark` | boolean | `false` | 套用浮水印移除前處理(中值濾波) |
```bash
curl -X POST http://localhost:1349/api/v1/tools/image/transparency-fixer \
-H "Authorization: Bearer <token>" \
-F "file=@fake-transparent.png" \
-F 'settings={"defringe":30,"outputFormat":"png"}'
```
---
## 具備選用 AI 功能的工具 {#tools-with-optional-ai-capabilities}
以下工具並非 Python sidecar 工具,但在啟用特定選項時會使用 AI 功能。
### 影像增強 {#image-enhancement}
**工具路由:** `image-enhancement`
**引擎:** 以分析為基礎(Sharp 直方圖與統計)
分析影像並自動修正曝光、對比、白平衡、飽和度、銳利度與雜訊。支援特定場景模式。
| 參數 | 型別 | 預設值 | 說明 |
|-----------|------|---------|-------------|
| `mode` | `"auto"` \| `"portrait"` \| `"landscape"` \| `"low-light"` \| `"food"` \| `"document"` | `"auto"` | 用於調校修正的場景模式 |
| `intensity` | number (0-100) | `50` | 整體修正強度 |
| `corrections.exposure` | boolean | `true` | 套用曝光修正 |
| `corrections.contrast` | boolean | `true` | 套用對比修正 |
| `corrections.whiteBalance` | boolean | `true` | 套用白平衡修正 |
| `corrections.saturation` | boolean | `true` | 套用飽和度修正 |
| `corrections.sharpness` | boolean | `true` | 套用銳利度修正 |
| `corrections.denoise` | boolean | `true` | 套用去雜訊 |
| `deepEnhance` | boolean | `false` | 透過 SCUNet 啟用 AI 去雜訊(需要 `upscale-enhance` 套件包) |
另有一個分析端點位於 `POST /api/v1/tools/image/image-enhancement/analyze`,它會傳回偵測到的修正而不加以套用。
### 內容感知調整大小(接縫裁減) {#content-aware-resize-seam-carving}
**工具路由:** `content-aware-resize`
**引擎:** Go `caire` 二進位檔(非 Python,無 GPU 效益)
透過移除低能量接縫來智慧調整影像大小,保留重要內容。
| 參數 | 型別 | 預設值 | 說明 |
|-----------|------|---------|-------------|
| `width` | number | - | 目標寬度 |
| `height` | number | - | 目標高度 |
| `protectFaces` | boolean | `false` | 保護偵測到的人臉區域(需要 `face-detection` 套件包) |
| `blurRadius` | number (0-20) | `4` | 能量計算的預先模糊 |
| `sobelThreshold` | number (1-20) | `2` | 邊緣敏感度門檻 |
| `square` | boolean | `false` | 強制正方形輸出 |