5 分钟搞定!腾讯混元 OCR API 部署全攻略

文章标签:#HunyuanOCR #OCR 识别 #多语种识别 #文档解析 #图片翻译 #vLLM 部署 #API 服务

最近腾讯开源的混元 OCR(HunyuanOCR)凭借 1B 轻量化参数却斩获多项业界 SOTA 的表现火出圈了!作为混元原生多模态端到端 OCR 专家模型,它不仅支持文字检测识别、复杂文档解析,还能实现卡证票据信息抽取、视频字幕识别、拍照翻译等全场景功能。今天就手把手教你用 Docker 一键部署混元 OCR API 服务,开箱即用,支持图片 / 文档批量处理,还能按需求返回格式化结果(含 LaTeX 公式、HTML 表格、JSON 字段等)~

在这里插入图片描述

📋 部署前准备

环境要求

  • Docker 环境(20.10+)

  • NVIDIA 显卡(显存≥20G,vLLM 推理必备)

  • NVIDIA Container Toolkit(GPU 支持核心组件)

  • 网络通畅(需拉取模型权重和依赖包)

  • 操作系统:Linux(推荐 Ubuntu 22.04)

  • 磁盘空间:≥6GB(用于存储模型和依赖)

核心文件清单

先新建一个项目目录(比如hunyuan-ocr-api),创建以下 4 个关键文件,后续所有部署操作都围绕这些文件展开:

1. Dockerfile(核心镜像构建)

FROM python:3.12-slim

# 基础配置:禁用交互模式、设置时区、配置环境变量

ENV DEBIAN_FRONTEND=noninteractive \

    TZ=Etc/UTC \

    LD_LIBRARY_PATH=/usr/local/cuda-12.9/compat:\$LD_LIBRARY_PATH \

    PYTHONUNBUFFERED=1 \

    PIP_NO_CACHE_DIR=1 \

    PIP_DEFAULT_TIMEOUT=100 \

    TRANSFORMERS_CACHE=/app/models \

    VLLM_CACHE=/app/models

# 安装系统依赖(含CUDA兼容包)

RUN apt-get update --fix-missing && \

    apt-get install -y --no-install-recommends \

    git gcc g++ pkg-config wget \
    
    && apt-get clean && \

    rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

# 安装PyTorch与核心依赖

RUN pip install torch==2.7.0 torchvision==0.22.0 torchaudio==2.7.0 --index-url https://download.pytorch.org/whl/cu128

RUN pip install pyopengl pyopengl-accelerate pymupdf

# 克隆混元OCR源码(若需本地修改)

RUN git clone https://github.com/Tencent-Hunyuan/HunyuanOCR.git /app/hunyuan-ocr

# 复制依赖清单与启动文件

COPY requirements.txt /app/

COPY api_server.py /app/

COPY start.sh /app/

# 安装项目依赖

RUN pip install -r /app/requirements.txt

# 赋予启动脚本执行权限

RUN chmod +x /app/start.sh

# 暴露API端口(vLLM服务+FastAPI服务)

EXPOSE 8000 8001

# 容器启动命令

CMD ["/app/start.sh"]

2. requirements.txt(依赖清单)

# ===== 仅新增的依赖(官方setup.py未包含)=====
# FastAPI API框架
fastapi>=0.110.0
uvicorn>=0.29.0
python-multipart>=0.0.9
httpx>=0.27.0

# vLLM(官方启动命令所需)
vllm>=0.9.0

3. start.sh(启动脚本)

set -e

# ===================== 核心配置区(可根据硬件调整) =====================
MAX_TOKENS=16384  # 模型最大总长度(提示词+生成)
VLLM_PORT=8001    # vLLM 服务端口
API_PORT=8000     # FastAPI 接口端口
GPU_UTIL=0.5      # GPU 内存利用率(显存<24G设0.2,≥24G设0.5)
APP_DIR="/app"    # API服务代码目录
LOG_DIR="/app/logs" # 日志目录

# ===================== 工具函数 =====================
# 优雅退出函数
cleanup() {
    echo -e "\n🛑 接收到停止信号,正在优雅关闭服务..."
    
    # 停止所有相关进程
    pkill -f "vllm serve" 2>/dev/null || echo "⚠️ vLLM服务进程已退出"
    pkill -f "api_server.py" 2>/dev/null || echo "⚠️ FastAPI服务进程已退出"
    
    # 清理GPU缓存
    python -c "import torch; torch.cuda.empty_cache()" 2>/dev/null || true
    
    echo "✅ 所有服务已停止,GPU缓存已清理"
    exit 0
}

# ===================== 初始化 =====================
# 创建日志目录
mkdir -p ${LOG_DIR}

# 捕获退出信号(Ctrl+C、kill等)
trap cleanup SIGINT SIGTERM EXIT

# ===================== 前置清理 =====================
# 清理GPU缓存
echo "🧹 清理GPU缓存..."
python -c "import torch; torch.cuda.empty_cache()" 2>/dev/null || true

# ===================== 环境验证 =====================
echo -e "\n📝 环境验证结果"
echo "========================================"
echo "Python版本: $(python --version | awk '{print $2}')"
python -c "import torch; print(f'CUDA可用: {torch.cuda.is_available()}, 设备数: {torch.cuda.device_count()}')" || echo "⚠️ CUDA检查警告"
echo "GPU利用率: ${GPU_UTIL}"
echo "最大模型长度: ${MAX_TOKENS}"
echo "vLLM端口: ${VLLM_PORT}"
echo "API端口: ${API_PORT}"
echo "日志目录: ${LOG_DIR}"
echo "========================================"

# ===================== 启动vLLM服务(后台运行) =====================
echo -e "\n🚀 启动vLLM模型服务(加载腾讯混元OCR)..."
nohup vllm serve tencent/HunyuanOCR \
    --trust-remote-code \
    --no-enable-prefix-caching \
    --mm-processor-cache-gb 0 \
    --gpu-memory-utilization ${GPU_UTIL} \
    --max-model-len ${MAX_TOKENS} \
    --tensor-parallel-size 1 \
    --port ${VLLM_PORT} \
    --host 0.0.0.0 \
    --disable-log-requests \
    > ${LOG_DIR}/vllm.log 2>&1 &

echo "📌 vLLM服务已后台启动,日志文件:${LOG_DIR}/vllm.log"

# ===================== 启动FastAPI服务(前台运行) =====================
echo -e "\n🚀 启动腾讯混元OCR API服务..."
cd ${APP_DIR} || { echo "❌ 目录${APP_DIR}不存在!"; exit 1; }

# 启动API服务(前台运行,便于查看实时日志)
python api_server.py --host 0.0.0.0 --port ${API_PORT} --log-level info

4. api_server.py(API 接口服务)

import os
import json
import time
from fastapi import FastAPI, UploadFile, File, HTTPException, Depends
from fastapi.responses import JSONResponse, PlainTextResponse
from contextlib import asynccontextmanager
from PIL import Image
from io import BytesIO
import fitz
import argparse
import base64
from openai import OpenAI

# ------------------- 核心配置(适配官方vLLM 0.12.0部署) -------------------
VLLM_BASE_URL = "http://localhost:8001/v1"
MODEL_NAME = "tencent/HunyuanOCR"
MAX_TOKENS = 8192
MAX_IMAGE_SIZE = (1024, 1024)
DEFAULT_PDF_DPI = 200
MAX_SAFE_DPI = 300

# 全局OpenAI客户端实例
client = None

# ------------------- 生命周期管理器(替代on_event) -------------------
@asynccontextmanager
async def lifespan(app: FastAPI):
    """
    FastAPI生命周期管理器(替代startup/shutdown事件)
    - startup:初始化OpenAI客户端
    - shutdown:清理资源
    """
    # 启动时初始化(替代@app.on_event("startup"))
    print("🚀 启动腾讯混元OCR API服务(官方部署版)...")
    global client
    try:
        client = OpenAI(
            api_key="EMPTY",
            base_url=VLLM_BASE_URL,
            timeout=300
        )
        print(f"✅ OpenAI客户端初始化完成,连接vLLM地址:{VLLM_BASE_URL}")
        print("✅ API服务启动完成!")
    except Exception as e:
        print(f"⚠️ OpenAI客户端初始化失败:{str(e)}")
        print("⚠️ 请检查vLLM服务是否已通过start.sh启动")
    
    # 执行应用逻辑
    yield
    
    # 关闭时清理(替代@app.on_event("shutdown"))
    print("🛑 腾讯混元OCR API服务正在关闭...")
    client = None
    print("✅ API服务已关闭,资源已清理")

# ------------------- FastAPI应用初始化(使用lifespan) -------------------
app = FastAPI(
    title="腾讯混元OCR API(官方部署版)",
    version="6.0",
    description=f"""基于官方命令部署的vLLM 0.12.0 + 腾讯混元OCR
    核心配置(官方指定):
    - --no-enable-prefix-caching
    - --mm-processor-cache-gb 0
    - --gpu-memory-utilization 0.2
    
    优化特性:
    1. PDF转图片默认DPI=200(支持自定义150-300)
    2. 超尺寸图片自动压缩,避免显存溢出
    3. 识别结果自动去重,保证输出整洁
    4. 完整提示词,保证识别精度
    """,
    lifespan=lifespan  # 使用新的生命周期管理器
)

# ------------------- 工具函数 -------------------
def clean_repeated_substrings(text):
    """清理识别结果中的重复子串"""
    n = len(text)
    if n < 4000:
        return text
    for length in range(2, n // 10 + 1):
        candidate = text[-length:]
        count = 0
        i = n - length
        while i >= 0 and text[i:i + length] == candidate:
            count += 1
            i -= length
        if count >= 8:
            return text[:n - length * (count - 1)]
    return text

def encode_image(image: Image.Image) -> str:
    """图片编码(适配官方低显存部署)"""
    image.thumbnail(MAX_IMAGE_SIZE, Image.Resampling.LANCZOS)
    if image.mode != "RGB":
        image = image.convert("RGB")
    buffer = BytesIO()
    image.save(buffer, format="JPEG", quality=85)
    return base64.b64encode(buffer.getvalue()).decode('utf-8')

def create_chat_messages(image: Image.Image, prompt: str) -> list:
    """创建官方标准的OpenAI格式消息"""
    image_base64 = encode_image(image)
    return [
        {"role": "system", "content": ""},
        {
            "role": "user",
            "content": [
                {
                    "type": "image_url",
                    "image_url": {
                        "url": f"data:image/jpeg;base64,{image_base64}"
                    }
                },
                {"type": "text", "text": prompt}
            ]
        }
    ]

def process_ocr(image: Image.Image, prompt: str) -> str:
    """核心OCR处理函数"""
    global client
    if client is None:
        raise RuntimeError("OpenAI客户端未初始化,请检查vLLM服务连接")
    
    try:
        messages = create_chat_messages(image, prompt)
        print(f"🔍 调用HunyuanOCR,图片尺寸:{image.size}")
        
        response = client.chat.completions.create(
            model=MODEL_NAME,
            messages=messages,
            temperature=0.0,
            max_tokens=MAX_TOKENS,
            stream=False
        )
        
        raw_result = response.choices[0].message.content.strip()
        clean_result = clean_repeated_substrings(raw_result)
        print(f"✅ OCR处理完成,结果长度:{len(clean_result)}字符")
        return clean_result
    
    except Exception as e:
        error_msg = f"vLLM接口调用失败: {str(e)}"
        print(f"❌ {error_msg}")
        raise RuntimeError(error_msg)

def pdf_to_images(pdf_file: BytesIO, dpi: int = DEFAULT_PDF_DPI) -> list[Image.Image]:
    """PDF转图片(优化DPI配置)"""
    images = []
    try:
        pdf_doc = fitz.open(stream=pdf_file, filetype="pdf")
        actual_dpi = min(dpi, MAX_SAFE_DPI)
        
        if actual_dpi != dpi:
            print(f"⚠️ 指定DPI {dpi} 超出安全范围,自动降至 {MAX_SAFE_DPI}")
        
        mat = fitz.Matrix(actual_dpi / 72, actual_dpi / 72)
        
        for page_num in range(len(pdf_doc)):
            page = pdf_doc[page_num]
            pix = page.get_pixmap(matrix=mat, alpha=False)
            img = Image.frombytes("RGB", [pix.width, pix.height], pix.samples)
            
            if img.width > MAX_IMAGE_SIZE[0] or img.height > MAX_IMAGE_SIZE[1]:
                original_size = (img.width, img.height)
                img.thumbnail(MAX_IMAGE_SIZE, Image.Resampling.LANCZOS)
                print(f"📄 第{page_num+1}页图片压缩:{original_size} → {img.size}")
            
            images.append(img)
        
        pdf_doc.close()
        print(f"✅ PDF转图片完成,共{len(images)}页,实际DPI:{actual_dpi}")
        return images
    
    except Exception as e:
        raise RuntimeError(f"PDF转图片失败: {str(e)}")

# ------------------- API接口定义 -------------------
@app.post("/api/ocr/text", summary="通用图片文字识别")
async def ocr_text(file: UploadFile = File(...)):
    """通用图片文字识别接口"""
    try:
        file_bytes = await file.read()
        file_ext = file.filename.split(".")[-1].lower()
        
        if file_ext not in ["jpg", "jpeg", "png", "bmp", "tiff"]:
            raise HTTPException(
                status_code=400,
                detail=f"不支持的文件格式:{file_ext},仅支持jpg/jpeg/png/bmp/tiff"
            )
        
        image = Image.open(BytesIO(file_bytes)).convert("RGB")
        prompt = "提取图片中的所有文字,严格按照阅读顺序整理输出,不要遗漏任何内容,不要添加额外说明。"
        result = process_ocr(image, prompt)
        
        return PlainTextResponse(content=result, status_code=200)
    
    except HTTPException:
        raise
    except Exception as e:
        error_detail = f"通用文字识别失败:{str(e)}"
        print(f"❌ {error_detail}")
        raise HTTPException(status_code=500, detail=error_detail)

@app.post("/api/ocr/document", summary="复杂文档解析(支持PDF/图片)")
async def ocr_document(
    file: UploadFile = File(...),
    dpi: int = DEFAULT_PDF_DPI,
    merge_pages: bool = True
):
    """复杂文档解析接口"""
    try:
        file_bytes = await file.read()
        file_ext = file.filename.split(".")[-1].lower()
        
        if file_ext == "pdf":
            if len(file_bytes) == 0:
                raise HTTPException(status_code=400, detail="PDF文件为空")
            
            images = pdf_to_images(BytesIO(file_bytes), dpi=dpi)
            page_results = []
            
            for idx, img in enumerate(images, 1):
                print(f"🔍 正在解析PDF第{idx}/{len(images)}页...")
                prompt = f"""提取文档第{idx}页的所有正文信息,按以下规则输出:
1. 忽略页眉、页脚、页码等无关内容
2. 表格用HTML格式精准表达
3. 数学公式用LaTeX格式保留
4. 流程图/图表用Mermaid格式描述(如有)
5. 严格按照阅读顺序组织内容,不要遗漏任何细节
6. 仅返回当前页的内容,不要添加额外说明"""
                page_result = process_ocr(img, prompt)
                page_results.append(page_result)
            
            if merge_pages:
                final_result = ""
                for page_no, page_content in enumerate(page_results, 1):
                    if page_no > 1:
                        final_result += f"\n--- 第{page_no}页 ---\n"
                    final_result += page_content
            else:
                final_result = json.dumps({"pages": page_results}, ensure_ascii=False, indent=2)
            
            return PlainTextResponse(content=final_result, status_code=200)
        
        elif file_ext in ["jpg", "jpeg", "png", "bmp", "tiff"]:
            image = Image.open(BytesIO(file_bytes)).convert("RGB")
            prompt = """提取图片中文档的所有正文信息,按以下规则输出:
1. 忽略页眉、页脚等无关内容
2. 表格用HTML格式精准表达
3. 数学公式用LaTeX格式保留
4. 流程图/图表用Mermaid格式描述(如有)
5. 严格按照阅读顺序组织内容,不要遗漏任何细节
6. 仅返回识别结果,不要添加额外说明"""
            result = process_ocr(image, prompt)
            return PlainTextResponse(content=result, status_code=200)
        
        else:
            raise HTTPException(
                status_code=400,
                detail=f"不支持的文件格式:{file_ext},仅支持PDF/jpg/jpeg/png/bmp/tiff"
            )
    
    except HTTPException:
        raise
    except Exception as e:
        error_detail = f"文档解析失败:{str(e)}"
        print(f"❌ {error_detail}")
        raise HTTPException(status_code=500, detail=error_detail)

@app.post("/api/ocr/extract", summary="指定字段抽取(返回JSON)")
async def ocr_extract(file: UploadFile = File(...), fields: str = "出发站,终点站"):
    """指定字段抽取接口"""
    try:
        file_bytes = await file.read()
        file_ext = file.filename.split(".")[-1].lower()
        
        if file_ext not in ["jpg", "jpeg", "png", "bmp", "tiff"]:
            raise HTTPException(
                status_code=400,
                detail=f"不支持的文件格式:{file_ext},仅支持图片格式"
            )
        
        image = Image.open(BytesIO(file_bytes)).convert("RGB")
        prompt = f"""提取图片中的以下字段内容:{fields}
要求:
1. 严格按照JSON格式返回,仅包含字段名和对应值,不要添加任何额外文本
2. 字段名严格匹配输入的名称,大小写一致
3. 若某个字段未识别到,对应值为null
4. 示例输出:{{"出发站":"北京","终点站":"上海"}}"""
        result = process_ocr(image, prompt)
        
        try:
            json_result = json.loads(result)
            return JSONResponse(content=json_result, status_code=200)
        except json.JSONDecodeError:
            raise HTTPException(
                status_code=400,
                detail=f"抽取结果格式错误,原始输出:{result}"
            )
    
    except HTTPException:
        raise
    except Exception as e:
        error_detail = f"字段抽取失败:{str(e)}"
        print(f"❌ {error_detail}")
        raise HTTPException(status_code=500, detail=error_detail)

@app.post("/api/ocr/translate", summary="图片文字翻译")
async def ocr_translate(file: UploadFile = File(...), target_lang: str = "中文"):
    """图片文字翻译接口"""
    try:
        file_bytes = await file.read()
        file_ext = file.filename.split(".")[-1].lower()
        
        if file_ext not in ["jpg", "jpeg", "png", "bmp", "tiff"]:
            raise HTTPException(
                status_code=400,
                detail=f"不支持的文件格式:{file_ext},仅支持图片格式"
            )
        
        image = Image.open(BytesIO(file_bytes)).convert("RGB")
        prompt = f"""先提取图片中的所有文字,然后将文字完整翻译为{target_lang}
要求:
1. 翻译需准确,保持原文语义,不增不减
2. 表格内容逐行翻译,公式/代码保持原样
3. 仅返回翻译后的文本,不要添加任何额外说明"""
        result = process_ocr(image, prompt)
        
        return PlainTextResponse(content=result, status_code=200)
    
    except HTTPException:
        raise
    except Exception as e:
        error_detail = f"图片文字翻译失败:{str(e)}"
        print(f"❌ {error_detail}")
        raise HTTPException(status_code=500, detail=error_detail)

@app.get("/health", summary="服务健康检查")
async def health_check():
    """健康检查接口"""
    vllm_healthy = False
    try:
        if client:
            client.models.list()
            vllm_healthy = True
    except:
        vllm_healthy = False
    
    return JSONResponse(
        content={
            "status": "healthy" if vllm_healthy else "unhealthy",
            "service": "hunyuan-ocr-api-vllm-official",
            "version": "6.0",
            "vllm_base_url": VLLM_BASE_URL,
            "vllm_connected": vllm_healthy,
            "pdf_default_dpi": DEFAULT_PDF_DPI,
            "max_safe_dpi": MAX_SAFE_DPI,
            "max_image_size": MAX_IMAGE_SIZE,
            "timestamp": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        },
        status_code=200 if vllm_healthy else 503
    )

# ------------------- 启动入口 -------------------
if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="启动腾讯混元OCR API服务(官方部署版)")
    parser.add_argument("--host", default="0.0.0.0", help="监听地址(默认:0.0.0.0)")
    parser.add_argument("--port", type=int, default=8000, help="监听端口(默认:8000)")
    parser.add_argument("--vllm-url", default=VLLM_BASE_URL, help=f"vLLM接口地址(默认:{VLLM_BASE_URL})")
    parser.add_argument("--log-level", default="info", help="日志级别(默认:info)")
    args = parser.parse_args()
    
    VLLM_BASE_URL = args.vllm_url
    
    import uvicorn
    uvicorn.run(
        "api_server:app",
        host=args.host,
        port=args.port,
        log_level=args.log_level,
        access_log=True
    )

🚀 部署与测试步骤

第一步:构建 Docker 镜像

hunyuan-ocr-api目录下执行以下命令,构建完整的部署镜像(首次构建需下载模型,耗时约 5-10 分钟,取决于网络速度):

docker build -t hunyuan-ocr:v1 .

第二步:启动容器

使用以下命令启动容器,映射端口并挂载模型缓存目录(避免每次启动重复下载模型):

docker run -d \

    --gpus all \

    -p 8000:8000 \

    -p 8001:8001 \

    -v $(pwd)/models:/app/models \

    --name hunyuan-ocr-service \

    hunyuan-ocr:v1
  • --gpus all:启用所有 GPU(若需指定 GPU,可改为--gpus "device=0"

  • -v $(pwd)/models:/app/models:挂载本地目录存储模型,下次启动无需重新下载

  • -p 8000:8000:映射 FastAPI 接口端口(对外提供 API 服务)

  • -p 8001:8001:映射 vLLM 服务端口(内部模型调用,可不对外暴露)

第三步:查看启动日志

启动后通过日志确认服务是否正常运行:

# 查看容器日志(实时输出)

docker logs -f hunyuan-ocr-service

当看到以下日志时,说明服务已就绪:

✅ vLLM服务已就绪!

🚀 启动混元OCR API服务...

INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)

第四步:接口测试(3 种常用方式)

方式 1:使用 Swagger UI 可视化测试

直接访问 http://服务器IP:8000/docs,即可看到所有 API 的可视化界面,支持上传图片并测试不同功能:

  • 测试/api/ocr/text:上传一张包含文字的图片,点击 “Execute”,可获取纯文本识别结果

  • 测试/api/ocr/document:上传文档图片(含公式 / 表格),返回 Markdown 格式解析结果

  • 测试/api/ocr/extract:输入需抽取的字段(如 “姓名,身份证号”),上传卡证图片,返回 JSON 格式字段值

方式 2:使用 curl 命令测试
# 示例:调用文字识别接口

curl -X POST "http://服务器IP:8000/api/ocr/text" \

	-H "Content-Type: multipart/form-data" \

	-F "file=@test.jpg"
方式 3:Python 代码调用
import requests

url = "http://服务器IP:8000/api/ocr/extract"

files = {"file": open("invoice.jpg", "rb")}

data = {"fields": "发票代码,发票号码,总金额,日期"}

response = requests.post(url, files=files, data=data)

print(json.dumps(response.json(), indent=2))

输出结果示例(发票信息抽取):

{

	"发票代码": "161002018100",

	"发票号码": "42609332",

	 "总金额": "¥77.10元",

	"日期": "2020-06-18"

}

⚠️ 常见问题与解决方案

  1. GPU 显存不足报错
  • 解决方案:降低start.sh中的GPU_UTIL参数(如从 0.2 改为 0.15),或关闭其他占用 GPU 的进程

  • 最低配置:20G 显存(建议 32G 显存以获得更流畅的体验)

  1. vLLM 服务启动超时
  • 检查日志:docker exec -it hunyuan-ocr-service cat /app/vllm.log

  • 常见原因:网络问题导致模型下载失败,可手动下载模型后挂载到/app/models目录

  1. 识别结果出现乱码或重复
  • 解决方案 1:确保上传图片为 RGB 格式(避免 Alpha 通道干扰)

  • 解决方案 2:调用接口时添加clean_repeated_substrings函数处理结果(已在 API 中集成)

  1. 多语种识别准确率低
  • 解决方案:在提示词中明确指定语种,例如:“提取图中的日语文字,并翻译为中文,确保语义准确”

📊 功能优势与适用场景

核心优势

  • 轻量化:1B 参数,部署成本远低于 200B + 的通用 VLM 模型

  • 全场景:单一 API 覆盖文字识别、文档解析、信息抽取、翻译、字幕提取 5 大场景

  • 高准确率:在 OmniDocBench 文档解析、卡证抽取等任务中超越多个 3B + 参数模型

  • 易集成:支持 JSON/Markdown/LaTeX 等标准化输出格式,便于对接业务系统

推荐适用场景

  • 企业级文档电子化(合同、报表、票据)

  • 卡证信息自动录入(身份证、护照、营业执照)

  • 多语种内容处理(跨境电商图片翻译、海外视频字幕提取)

  • 教育场景文档解析(含公式的试卷、课件识别)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jacky_wxl(微信同号)

喜欢作者

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值