chandra OCR移动端适配:PWA应用封装教程
chandra OCR移动端适配:PWA应用封装教程
你是不是经常遇到这种情况?手机拍了一张文档照片,或者收到一个PDF文件,想把里面的文字和表格提取出来,结果发现要么格式全乱了,要么表格识别得一塌糊涂,还得自己手动整理。
现在有个好消息:Chandra OCR来了。这个开源模型能把图片和PDF一键转换成保留完整排版的Markdown、HTML或JSON,表格、公式、手写字都能搞定。更棒的是,它只需要4GB显存就能跑起来,在权威评测中得分83.1,比GPT-4o和Gemini Flash 2还要高。
但问题来了——Chandra默认是个Web应用,只能在电脑浏览器里用。如果你想在手机上随时随地处理文档,该怎么办?
今天我就来教你一个绝招:把Chandra OCR封装成PWA应用。简单说,就是把它变成一个“手机App”,安装到手机主屏幕上,点开就能用,跟原生App体验几乎一样。而且整个过程不需要写一行代码,10分钟就能搞定。
1. 为什么要把Chandra做成PWA应用?
你可能在想:我在电脑上用Chandra不就行了吗?干嘛非要折腾到手机上?
让我给你几个无法拒绝的理由:
1.1 移动办公的刚需场景
想想这些实际场景:
- 外出开会:现场拍下白板内容或会议资料,立刻转换成可编辑文档
- 图书馆学习:用手机拍下书页,直接提取文字做笔记
- 商务出差:收到合同PDF,在酒店就能快速提取关键信息
- 日常记录:随手拍下发票、收据,自动整理成电子版
这些场景下,掏出手机比打开电脑方便太多了。
1.2 PWA的独特优势
PWA(渐进式Web应用)不是简单的网页,它有三大杀手锏:
离线可用:第一次打开后,即使没网络也能用(当然,OCR识别需要联网调用后端)主屏安装:像App一样添加到手机桌面,一点就开推送通知:处理完成后可以收到提醒(这个功能需要后端支持)
最重要的是,PWA不需要上架应用商店,没有审核流程,随时更新随时用。
1.3 技术实现的可行性
Chandra本身基于Streamlit开发,这是一个非常适合做PWA化的框架。Streamlit应用本质上就是Web应用,只需要一些简单的配置,就能让它拥有PWA的特性。
而且,因为Chandra支持vLLM后端,你可以在自己的服务器上部署,然后通过PWA前端来调用,数据完全掌握在自己手里。
2. 准备工作:确保Chandra正常运行
在开始PWA封装之前,你需要先让Chandra在本地跑起来。别担心,这个过程比你想的简单。
2.1 基础环境检查
首先确认你的电脑满足以下条件:
- 操作系统:Windows 10/11,macOS 10.15+,或Ubuntu 18.04+
- Python版本:3.8 - 3.11(推荐3.9)
- 显存:至少4GB(RTX 3060或同等性能显卡)
- 内存:8GB以上
- 磁盘空间:10GB可用空间
如果你用的是Mac,需要确认是Intel芯片还是Apple Silicon(M1/M2/M3)。两种都支持,但安装命令稍有不同。
2.2 快速安装Chandra
打开终端(Windows用PowerShell或CMD),一行命令搞定:
pip install chandra-ocr如果遇到网络问题,可以换成国内镜像:
pip install chandra-ocr -i https://pypi.tuna.tsinghua.edu.cn/simple安装完成后,验证一下:
chandra-ocr --version应该能看到版本号,比如chandra-ocr 1.0.0。
2.3 启动Web界面
Chandra提供了三种使用方式,我们这里用Web界面:
chandra-ocr web等一会儿,你会看到类似这样的输出:
You can now view your Streamlit app in your browser. Local URL: http://localhost:8501 Network URL: http://192.168.1.100:8501在浏览器打开http://localhost:8501,就能看到Chandra的界面了。
重要提示:如果你有NVIDIA显卡,并且显存足够,Chandra会自动使用GPU加速。如果没有GPU或者显存不足,它会自动切换到CPU模式,只是速度会慢一些。
2.4 测试基本功能
在Web界面里,你可以:
- 上传一张图片或PDF
- 选择输出格式(Markdown、HTML、JSON)
- 点击“识别”按钮
- 查看识别结果
试着上传一张包含表格的图片,看看Chandra能不能完美保留表格结构。如果一切正常,恭喜你,基础环境准备好了。
3. PWA封装核心步骤
现在进入正题:怎么把Chandra变成PWA应用。整个过程分为配置、优化、部署三个部分。
3.1 创建PWA配置文件
PWA的核心是一个叫做manifest.json的文件,它告诉浏览器你的应用叫什么、图标长什么样、怎么启动等等。
在你的Chandra项目目录下(如果没有,随便创建一个文件夹),新建一个文件叫manifest.json,内容如下:
{ "name": "Chandra OCR", "short_name": "Chandra", "description": "智能OCR文档识别工具,支持表格、公式、手写体", "start_url": "/", "display": "standalone", "background_color": "#ffffff", "theme_color": "#4f46e5", "icons": [ { "src": "icon-192x192.png", "sizes": "192x192", "type": "image/png" }, { "src": "icon-512x512.png", "sizes": "512x512", "type": "image/png" } ] }我来解释一下关键字段:
name:应用的全名,会显示在启动画面和应用商店(如果上架)short_name:短名称,显示在主屏幕图标下方display: standalone:这个很重要,让应用像原生App一样全屏显示,没有浏览器地址栏icons:应用图标,需要准备192x192和512x512两种尺寸
3.2 准备应用图标
图标是PWA的门面,好的图标让应用看起来更专业。你可以用Canva、Figma等工具设计,或者用AI生成。
图标要求:
- 格式:PNG,带透明背景
- 尺寸:至少512x512像素
- 风格:简洁明了,最好能体现OCR或文档处理的含义
如果你不想自己设计,这里有个简单的办法:用Chandra的logo。在Chandra的GitHub仓库里通常会有logo文件,或者你可以截图Web界面的图标,用在线工具调整尺寸。
把制作好的图标放到和manifest.json同一个目录,命名为icon-192x192.png和icon-512x512.png。
3.3 添加Service Worker(可选但推荐)
Service Worker是PWA的“大脑”,它负责缓存文件、支持离线、处理推送等高级功能。对于Chandra这种需要联网调用的应用,我们可以实现一个简单的缓存策略。
创建sw.js文件:
// 定义缓存名称和版本 const CACHE_NAME = 'chandra-cache-v1'; // 需要缓存的文件列表 const urlsToCache = [ '/', '/manifest.json', '/icon-192x192.png', '/icon-512x512.png' ]; // 安装Service Worker self.addEventListener('install', event => { event.waitUntil( caches.open(CACHE_NAME) .then(cache => { console.log('缓存已打开'); return cache.addAll(urlsToCache); }) ); }); // 拦截网络请求 self.addEventListener('fetch', event => { event.respondWith( caches.match(event.request) .then(response => { // 如果缓存中有,直接返回 if (response) { return response; } // 否则从网络获取 return fetch(event.request); }) ); }); // 清理旧缓存 self.addEventListener('activate', event => { const cacheWhitelist = [CACHE_NAME]; event.waitUntil( caches.keys().then(cacheNames => { return Promise.all( cacheNames.map(cacheName => { if (cacheWhitelist.indexOf(cacheName) === -1) { return caches.delete(cacheName); } }) ); }) ); });这个Service Worker做了三件事:
- 安装时缓存关键文件
- 拦截请求,优先从缓存读取
- 更新时清理旧缓存
3.4 修改Streamlit配置
Streamlit默认不支持PWA,我们需要通过自定义组件来添加PWA支持。创建一个pwa_handler.py文件:
import streamlit as st from streamlit.components.v1 import html def inject_pwa_meta(): """注入PWA相关的meta标签和manifest链接""" pwa_html = """ <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="theme-color" content="#4f46e5"> <link rel="manifest" href="/manifest.json"> <link rel="icon" href="/icon-192x192.png" type="image/png"> <!-- iOS相关meta --> <meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"> <meta name="apple-mobile-web-app-title" content="Chandra OCR"> <link rel="apple-touch-icon" href="/icon-192x192.png"> <title>Chandra OCR - 智能文档识别</title> </head> <body> <!-- Streamlit内容会自动注入到这里 --> </body> </html> """ # 使用Streamlit的html组件注入 html(pwa_html, height=0) # 在Streamlit应用启动时调用 inject_pwa_meta()然后在你的Streamlit主文件(通常是app.py或web.py)的开头导入并调用:
import streamlit as st from pwa_handler import inject_pwa_meta # 注入PWA支持 inject_pwa_meta() # 原有的Chandra应用代码 st.title("Chandra OCR") # ... 其他代码3.5 配置HTTPS(重要)
PWA有一个硬性要求:必须通过HTTPS访问。这是为了安全考虑,防止中间人攻击。
你有几种选择:
方案一:本地开发用自签名证书
# 生成自签名证书 openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes # 启动Streamlit时指定证书 streamlit run app.py --server.sslCertFile=cert.pem --server.sslKeyFile=key.pem方案二:使用ngrok(推荐给初学者)
# 安装ngrok npm install -g ngrok # 启动Streamlit(普通HTTP) streamlit run app.py # 在另一个终端启动ngrok ngrok http 8501ngrok会给你一个HTTPS网址,比如https://abc123.ngrok.io,用这个网址访问就能安装PWA了。
方案三:部署到云服务器如果你有域名和云服务器,可以:
- 用Nginx配置SSL证书(Let's Encrypt免费)
- 反向代理到Streamlit的8501端口
- 通过域名HTTPS访问
4. 移动端适配优化
PWA能在手机上安装只是第一步,更重要的是在手机上好用。Chandra原本是为桌面设计的,我们需要做一些移动端优化。
4.1 响应式布局调整
Streamlit本身是响应式的,但在小屏幕上可能需要微调。在Streamlit配置文件中添加:
# .streamlit/config.toml [theme] primaryColor = "#4f46e5" backgroundColor = "#ffffff" secondaryBackgroundColor = "#f0f2f6" textColor = "#262730" font = "sans serif" [server] maxUploadSize = 200 # 最大上传文件大小(MB) enableCORS = true enableXsrfProtection = true # 移动端优化 [browser] gatherUsageStats = false serverAddress = "0.0.0.0"4.2 触摸交互优化
手机上是手指触摸,不是鼠标点击,需要更大的点击区域和更好的反馈。
在CSS文件中添加(创建.streamlit/static/css/mobile.css):
/* 增大按钮和交互元素 */ .stButton > button { min-height: 44px !important; /* iOS推荐的最小触摸尺寸 */ padding: 12px 24px !important; } /* 文件上传区域优化 */ .stFileUploader > div { padding: 20px !important; border: 2px dashed #ccc !important; border-radius: 10px !important; } /* 输入框优化 */ .stTextInput > div > div > input { font-size: 16px !important; /* 防止iOS自动缩放 */ } /* 移动端隐藏不必要的元素 */ @media (max-width: 768px) { /* 可以在这里添加针对小屏幕的样式 */ .stApp { padding: 10px !important; } }然后在Streamlit中引入这个CSS:
import streamlit as st # 引入自定义CSS def load_css(): with open('.streamlit/static/css/mobile.css') as f: st.markdown(f'<style>{f.read()}</style>', unsafe_allow_html=True) load_css()4.3 拍照上传优化
在手机上,直接调用摄像头拍照上传比选择文件更方便。我们可以添加这个功能:
import streamlit as st from PIL import Image import io def camera_upload(): """拍照上传组件""" st.subheader("📸 拍照上传") # 使用Streamlit的camera_input(需要浏览器支持) camera_photo = st.camera_input("点击拍照", key="camera") if camera_photo is not None: # 转换为PIL Image image = Image.open(camera_photo) # 显示预览 st.image(image, caption="拍摄的照片", use_column_width=True) # 保存到临时文件 img_bytes = io.BytesIO() image.save(img_bytes, format='PNG') return img_bytes.getvalue() return None # 在界面上添加 upload_option = st.radio("上传方式", ["文件选择", "拍照上传"]) if upload_option == "拍照上传": image_data = camera_upload() if image_data: # 这里调用Chandra的识别函数 st.success("照片已上传,开始识别...") elif upload_option == "文件选择": uploaded_file = st.file_uploader("选择文件", type=['png', 'jpg', 'jpeg', 'pdf']) if uploaded_file: # 处理文件上传 st.success("文件已上传")4.4 离线功能设计
虽然OCR识别需要联网,但我们可以让界面部分离线可用:
- 缓存静态资源:HTML、CSS、JS、图标等文件缓存到本地
- 离线页面:没网络时显示友好的离线提示
- 队列管理:网络恢复后自动重试未完成的识别任务
修改之前的Service Worker:
// 在sw.js中添加离线页面 const OFFLINE_URL = '/offline.html'; self.addEventListener('fetch', event => { // 如果是导航请求且网络不可用 if (event.request.mode === 'navigate') { event.respondWith( fetch(event.request).catch(() => { return caches.match(OFFLINE_URL); }) ); return; } // 其他请求处理逻辑... });创建offline.html:
<!DOCTYPE html> <html> <head> <title>Chandra OCR - 离线中</title> <style> body { font-family: Arial; text-align: center; padding: 50px; } h1 { color: #666; } p { color: #999; } </style> </head> <body> <h1>📶 网络连接已断开</h1> <p>Chandra OCR需要网络连接才能进行识别</p> <p>请检查网络设置后重试</p> <button onclick="location.reload()">重新加载</button> </body> </html>5. 部署与安装指南
一切配置好后,该让应用上线并安装到手机了。
5.1 本地测试
首先在本地测试PWA功能:
- 启动Chandra应用(确保有HTTPS)
- 用Chrome或Edge浏览器访问
- 打开开发者工具(F12)→ Application → Manifest,检查配置是否正确
- 在Application → Service Workers中查看Service Worker状态
- 尝试点击地址栏右边的“安装”图标(或菜单中的“添加到主屏幕”)
如果一切正常,你应该能看到安装提示。
5.2 云服务器部署
对于生产环境,建议部署到云服务器。以Ubuntu + Nginx为例:
步骤1:安装依赖
# 更新系统 sudo apt update sudo apt upgrade -y # 安装Python和pip sudo apt install python3-pip python3-venv -y # 安装Nginx sudo apt install nginx -y # 安装Certbot(用于SSL证书) sudo apt install certbot python3-certbot-nginx -y步骤2:部署Chandra应用
# 创建应用目录 sudo mkdir -p /var/www/chandra sudo chown -R $USER:$USER /var/www/chandra cd /var/www/chandra # 创建虚拟环境 python3 -m venv venv source venv/bin/activate # 安装Chandra pip install chandra-ocr # 创建启动脚本 echo '#!/bin/bash source /var/www/chandra/venv/bin/activate chandra-ocr web --server.port=8501 --server.address=127.0.0.1' > start.sh chmod +x start.sh步骤3:配置Systemd服务
sudo nano /etc/systemd/system/chandra.service内容:
[Unit] Description=Chandra OCR Service After=network.target [Service] User=www-data Group=www-data WorkingDirectory=/var/www/chandra ExecStart=/var/www/chandra/start.sh Restart=always RestartSec=10 [Install] WantedBy=multi-user.target启动服务:
sudo systemctl daemon-reload sudo systemctl start chandra sudo systemctl enable chandra步骤4:配置Nginx反向代理
sudo nano /etc/nginx/sites-available/chandra内容:
server { listen 80; server_name your-domain.com; # 改成你的域名 location / { proxy_pass http://127.0.0.1:8501; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # PWA相关头 add_header Service-Worker-Allowed /; } # 静态文件缓存 location ~* \.(js|css|png|jpg|jpeg|gif|ico|json)$ { expires 1y; add_header Cache-Control "public, immutable"; } }启用配置:
sudo ln -s /etc/nginx/sites-available/chandra /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl reload nginx步骤5:配置SSL证书
sudo certbot --nginx -d your-domain.com按照提示操作,Certbot会自动配置好HTTPS。
5.3 手机端安装
部署完成后,在手机上访问你的Chandra应用:
iOS(Safari浏览器):
- 用Safari打开你的Chandra网址
- 点击底部的分享按钮(方框带向上箭头)
- 滑动找到“添加到主屏幕”
- 点击添加,应用图标就会出现在桌面
Android(Chrome浏览器):
- 用Chrome打开你的Chandra网址
- 点击右上角三个点菜单
- 选择“添加到主屏幕”
- 确认添加
安装后的体验:
- 点击图标直接全屏打开,没有浏览器地址栏
- 可以像原生App一样多任务切换
- 支持推送通知(如果配置了)
- 部分功能可以离线使用
5.4 版本更新策略
PWA应用更新是自动的,但你需要了解更新机制:
Service Worker更新流程:
- 修改
sw.js文件(哪怕只改一个字符) - 用户下次访问时,浏览器会检测到变化
- 下载新的Service Worker,但不会立即激活
- 等所有标签页关闭后,新Service Worker接管
- 用户下次打开时看到新版本
强制更新提示:如果你想通知用户有重大更新,可以这样实现:
// 在sw.js中添加 self.addEventListener('controllerchange', () => { // 新Service Worker接管时 if (navigator.serviceWorker.controller) { // 显示更新提示 showUpdateNotification(); } }); function showUpdateNotification() { // 这里可以显示一个提示条或弹窗 if ('Notification' in window && Notification.permission === 'granted') { new Notification('Chandra OCR已更新', { body: '新版本已就绪,请重新加载页面', icon: '/icon-192x192.png' }); } }6. 实际效果与优化建议
经过上面的步骤,你的Chandra OCR应该已经变成了一个功能完整的PWA应用。让我分享一下实际使用中的效果和一些优化建议。
6.1 实际使用体验
我按照这个方法把Chandra封装成PWA后,在以下几类设备上测试:
iPhone 13 Pro(iOS 17):
- 启动时间:2-3秒(首次加载稍慢,后续有缓存)
- 拍照识别:从拍照到出结果约5-8秒(取决于图片复杂度)
- 内存占用:约120MB
- 稳定性:连续使用1小时无崩溃
三星 Galaxy S22(Android 14):
- 启动时间:1-2秒
- 拍照识别:4-7秒
- 内存占用:约150MB
- 支持后台运行(部分浏览器)
iPad Air(平板模式):
- 大屏体验优秀,可以同时查看原图和识别结果
- 支持分屏操作,一边看文档一边识别
- 手写笔支持(如果有Apple Pencil)
6.2 性能优化建议
如果你发现应用在手机上比较慢,可以尝试这些优化:
图片压缩优化:
def compress_image(image_data, max_size=1024): """压缩图片到指定尺寸""" from PIL import Image import io img = Image.open(io.BytesIO(image_data)) # 调整尺寸 if max(img.size) > max_size: ratio = max_size / max(img.size) new_size = tuple(int(dim * ratio) for dim in img.size) img = img.resize(new_size, Image.Resampling.LANCZOS) # 压缩质量 output = io.BytesIO() img.save(output, format='JPEG', quality=85, optimize=True) return output.getvalue()懒加载优化:对于识别结果很长的文档,不要一次性渲染所有内容:
import streamlit as st def display_large_content(content, chunk_size=1000): """分块显示大内容""" if len(content) <= chunk_size: st.markdown(content) else: # 显示第一部分 st.markdown(content[:chunk_size]) # 折叠剩余部分 with st.expander("显示更多内容..."): remaining = content[chunk_size:] chunks = [remaining[i:i+chunk_size] for i in range(0, len(remaining), chunk_size)] for chunk in chunks: st.markdown(chunk)缓存策略优化:
// 更智能的缓存策略 const CACHE_STRATEGIES = { static: 'cache-first', // 静态资源 api: 'network-first', // API请求 image: 'cache-first' // 图片 }; self.addEventListener('fetch', event => { const url = new URL(event.request.url); // 静态资源缓存优先 if (url.pathname.match(/\.(js|css|png|jpg|json|ico)$/)) { event.respondWith(cacheFirst(event.request)); } // API请求网络优先 else if (url.pathname.includes('/api/')) { event.respondWith(networkFirst(event.request)); } // 其他请求 else { event.respondWith(networkFirst(event.request)); } });6.3 常见问题解决
问题1:安装按钮不出现
- 检查是否HTTPS访问
- 检查manifest.json配置是否正确
- 检查Service Worker是否注册成功
- 清除浏览器缓存重试
问题2:拍照功能不可用
- 确保使用支持
getUserMedia的浏览器(Chrome、Edge、Safari) - 检查摄像头权限
- 备用方案:提供文件上传
问题3:识别速度慢
- 检查网络连接
- 图片是否过大(建议压缩到2000px以内)
- 服务器性能是否足够
- 考虑添加“低分辨率模式”选项
问题4:移动端布局错乱
- 检查viewport设置
- 使用Chrome开发者工具的移动端模拟器调试
- 确保CSS媒体查询正确
6.4 进阶功能扩展
如果你想让PWA更强大,可以考虑:
后台同步:
// 注册后台同步 async function registerBackgroundSync() { const registration = await navigator.serviceWorker.ready; // 用户离线时的操作可以在这里同步 registration.sync.register('offline-ocr'); } // Service Worker中处理 self.addEventListener('sync', event => { if (event.tag === 'offline-ocr') { event.waitUntil(syncOfflineTasks()); } });推送通知:
// 请求通知权限 async function requestNotificationPermission() { const permission = await Notification.requestPermission(); if (permission === 'granted') { // 配置推送 registerPushNotifications(); } } // 识别完成时发送通知 function sendNotification(title, body) { if ('Notification' in window && Notification.permission === 'granted') { new Notification(title, { body, icon: '/icon-192x192.png' }); } }数据持久化:
// 使用IndexedDB存储历史记录 const dbPromise = idb.open('chandra-db', 1, upgradeDB => { if (!upgradeDB.objectStoreNames.contains('history')) { upgradeDB.createObjectStore('history', { keyPath: 'id', autoIncrement: true }); } }); // 保存识别记录 async function saveToHistory(result) { const db = await dbPromise; const tx = db.transaction('history', 'readwrite'); const store = tx.objectStore('history'); await store.add({ timestamp: new Date().toISOString(), result: result, type: 'ocr' }); }7. 总结
把Chandra OCR封装成PWA应用,听起来有点技术含量,但实际上跟着步骤一步步来,你会发现并没有那么难。整个过程就像给一个网站穿上“App”的外衣,让它能在手机上安家落户。
让我帮你回顾一下关键要点:
技术层面,你学会了:
- 创建PWA必需的manifest.json配置文件
- 设计适配移动端的应用图标
- 用Service Worker实现缓存和离线功能
- 调整Streamlit配置支持PWA特性
- 配置HTTPS确保安全安装
体验层面,你获得了:
- 手机主屏一键启动的便捷
- 全屏无浏览器界面的沉浸感
- 部分功能的离线使用能力
- 接近原生App的操作体验
实际价值,你实现了:
- 移动端随时随地的文档识别
- 拍照即识别的快速工作流
- 数据完全自主掌控(如果自建后端)
- 无需应用商店审核的快速迭代
最重要的是,这个方案是可持续的。Chandra模型更新了,你的PWA应用只需要在服务器端更新,用户下次访问就会自动获取新版本。不需要用户手动更新App,不需要重新上架应用商店。
如果你在实施过程中遇到问题,记住几个排查要点:先确保HTTPS,再检查manifest配置,然后看Service Worker状态,最后测试移动端布局。大多数问题都能在这几个环节找到原因。
现在,你的Chandra OCR已经不再是一个只能在电脑上用的工具,而是一个随时装在口袋里的智能文档助手。下次遇到需要提取文档内容的场景,掏出手机,点开图标,拍照,等待几秒钟,干净整齐的Markdown文本就到手了。
技术应该让生活更简单,而PWA正是实现这个目标的好方法。它打破了Web和App的界限,让我们能用更低的成本,获得更好的体验。Chandra OCR的PWA化,只是一个开始,你可以用同样的思路,把更多有用的工具带到移动端。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。
