Managed speech and OCR downloads previously used catalog-specific source URLs without a global selection. Platform Features now lets users choose ModelScope by default or Hugging Face, while Main validates and freezes that source for each download. Verified coverage remains explicit: downloads never mix artifacts or silently switch sources, and installed models plus ZIP imports stay source-independent. Release note: 可在“设置 → 平台功能 → 通用设置”中选择 ModelScope 或 Hugging Face 作为后续语音输入与 OCR 模型下载源;缺少完整已验证文件或下载失败时不会静默换源。
201 lines
6.7 KiB
TypeScript
201 lines
6.7 KiB
TypeScript
import {
|
|
documentOcrModelCatalogEntrySchema,
|
|
type DocumentOcrModelCatalogEntry
|
|
} from '../shared/document-parsing-contracts'
|
|
import {
|
|
huggingFaceTarget,
|
|
modelScopeTarget
|
|
} from './model-download-targets'
|
|
|
|
const repositories = {
|
|
tinyDetection: 'PaddlePaddle/PP-OCRv6_tiny_det_onnx',
|
|
tinyRecognition: 'PaddlePaddle/PP-OCRv6_tiny_rec_onnx',
|
|
smallDetection: 'PaddlePaddle/PP-OCRv6_small_det_onnx',
|
|
smallRecognition: 'PaddlePaddle/PP-OCRv6_small_rec_onnx',
|
|
mediumDetection: 'PaddlePaddle/PP-OCRv6_medium_det_onnx',
|
|
mediumRecognition: 'PaddlePaddle/PP-OCRv6_medium_rec_onnx'
|
|
} as const
|
|
|
|
const modelScopeRevisions = {
|
|
tinyDetection: '7d7f5d128d9309ebf6de4f21f404dd583afdbae3',
|
|
tinyRecognition: 'afba04b618200c5f4824531c6e42c957c6439d9a',
|
|
smallDetection: '956a0b620a4017cc04056c692be1703b0025d028',
|
|
smallRecognition: '296d43bc0ebced0fd9c605174aa5962e49810ab6',
|
|
mediumDetection: 'c317b40325be40bfaaff58c8dcece2a075294f8a',
|
|
mediumRecognition: 'db5d610d492a14e3c34dc1fd4e9339bd369f79e6'
|
|
} as const
|
|
|
|
const huggingFaceRevisions = {
|
|
tinyDetection: '2ba1506c0380b8f0b03dd142459aac66d4421f6c',
|
|
tinyRecognition: '2612ab37152ae0a677521bae4e1e3d4fb4cf7c30',
|
|
smallDetection: '28fe5895c24fd108c19eb3e8479f4ab385fbfc62',
|
|
smallRecognition: 'b8f84f0b80c529de40b4fbb3544b84fa7233a513',
|
|
mediumDetection: '61323801669c338b7891481ec7bac61ce31b576a',
|
|
mediumRecognition: '50c7eacafc52fa7bcf4194e8cd08e46f8558504b'
|
|
} as const
|
|
|
|
type RepositoryKey = keyof typeof repositories
|
|
|
|
function targets(
|
|
repositoryKey: RepositoryKey,
|
|
file: string
|
|
) {
|
|
const repository = repositories[repositoryKey]
|
|
return {
|
|
modelscope: modelScopeTarget(
|
|
repository,
|
|
modelScopeRevisions[repositoryKey],
|
|
file
|
|
),
|
|
'hugging-face': huggingFaceTarget(
|
|
repository,
|
|
huggingFaceRevisions[repositoryKey],
|
|
file
|
|
)
|
|
}
|
|
}
|
|
|
|
function repositoryUrls(repositoryKey: RepositoryKey) {
|
|
const repository = repositories[repositoryKey]
|
|
return {
|
|
modelscope: `https://modelscope.cn/models/${repository}`,
|
|
'hugging-face': `https://huggingface.co/${repository}`
|
|
}
|
|
}
|
|
|
|
export const DOCUMENT_OCR_MODEL_CATALOG: readonly DocumentOcrModelCatalogEntry[] =
|
|
documentOcrModelCatalogEntrySchema.array().parse([
|
|
{
|
|
id: 'pp-ocrv6-tiny',
|
|
displayName: 'PP-OCRv6 Tiny',
|
|
description:
|
|
'PaddleOCR 官方轻量中文 OCR 模型,适合扫描 PDF 和图片的本地 CPU 识别。',
|
|
languages: ['中文', '英语'],
|
|
runtime: 'onnxruntime-web-wasm',
|
|
quality: 'basic',
|
|
speed: 'fast',
|
|
recommended: false,
|
|
repositoryUrls: repositoryUrls('tinyRecognition'),
|
|
license: {
|
|
name: 'Apache License 2.0',
|
|
notice:
|
|
'检测与识别模型由 PaddlePaddle 官方发布,使用前请阅读模型仓库及 PaddleOCR 的许可证说明。',
|
|
url: 'https://github.com/PaddlePaddle/PaddleOCR/blob/main/LICENSE'
|
|
},
|
|
files: [
|
|
{
|
|
name: 'detection.onnx',
|
|
role: 'detection',
|
|
size: 1_780_590,
|
|
sha256:
|
|
'193bab7a04fca699a6c82e6abb5b81bdb28177f0abd4062552b04908dafb19f8',
|
|
targets: targets('tinyDetection', 'inference.onnx')
|
|
},
|
|
{
|
|
name: 'recognition.onnx',
|
|
role: 'recognition',
|
|
size: 4_462_639,
|
|
sha256:
|
|
'9ef676d6ed3c88256a2d92c640c44f25b0c40947e111b14b8be8f594091563e6',
|
|
targets: targets('tinyRecognition', 'inference.onnx')
|
|
},
|
|
{
|
|
name: 'dictionary.yml',
|
|
role: 'dictionary',
|
|
size: 55_571,
|
|
sha256:
|
|
'66170210bad538e83fff3c4a3867e547d6bf20b50d64b20347c4b913f3034ea1',
|
|
targets: targets('tinyRecognition', 'inference.yml')
|
|
}
|
|
]
|
|
},
|
|
{
|
|
id: 'pp-ocrv6-small',
|
|
displayName: 'PP-OCRv6 Small',
|
|
description:
|
|
'PaddleOCR 官方 50 语言 OCR 模型,在识别质量、速度和本地资源占用之间取得平衡。',
|
|
languages: ['50 种语言'],
|
|
runtime: 'onnxruntime-web-wasm',
|
|
quality: 'balanced',
|
|
speed: 'balanced',
|
|
recommended: true,
|
|
repositoryUrls: repositoryUrls('smallRecognition'),
|
|
license: {
|
|
name: 'Apache License 2.0',
|
|
notice:
|
|
'检测与识别模型由 PaddlePaddle 官方发布,使用前请阅读模型仓库及 PaddleOCR 的许可证说明。',
|
|
url: 'https://github.com/PaddlePaddle/PaddleOCR/blob/main/LICENSE'
|
|
},
|
|
files: [
|
|
{
|
|
name: 'detection.onnx',
|
|
role: 'detection',
|
|
size: 9_880_512,
|
|
sha256:
|
|
'd73e0058b7a8086bbd57f3d10b8bcd4ff95363f67e06e2762b5e814fe9c9410e',
|
|
targets: targets('smallDetection', 'inference.onnx')
|
|
},
|
|
{
|
|
name: 'recognition.onnx',
|
|
role: 'recognition',
|
|
size: 21_159_378,
|
|
sha256:
|
|
'5435fd747c9e0efe15a96d0b378d5bd157e9492ed8fd80edf08f30d02fa24634',
|
|
targets: targets('smallRecognition', 'inference.onnx')
|
|
},
|
|
{
|
|
name: 'dictionary.yml',
|
|
role: 'dictionary',
|
|
size: 150_579,
|
|
sha256:
|
|
'ab078671bb49f06228eadccd34f1bb501e157f7a047095ffb943ba81512c77d1',
|
|
targets: targets('smallRecognition', 'inference.yml')
|
|
}
|
|
]
|
|
},
|
|
{
|
|
id: 'pp-ocrv6-medium',
|
|
displayName: 'PP-OCRv6 Medium',
|
|
description:
|
|
'PaddleOCR 官方 50 语言高质量 OCR 模型,识别较慢,并需要更多内存且具有更高延迟。',
|
|
languages: ['50 种语言'],
|
|
runtime: 'onnxruntime-web-wasm',
|
|
quality: 'high',
|
|
speed: 'slow',
|
|
recommended: false,
|
|
repositoryUrls: repositoryUrls('mediumRecognition'),
|
|
license: {
|
|
name: 'Apache License 2.0',
|
|
notice:
|
|
'检测与识别模型由 PaddlePaddle 官方发布,使用前请阅读模型仓库及 PaddleOCR 的许可证说明。',
|
|
url: 'https://github.com/PaddlePaddle/PaddleOCR/blob/main/LICENSE'
|
|
},
|
|
files: [
|
|
{
|
|
name: 'detection.onnx',
|
|
role: 'detection',
|
|
size: 62_032_837,
|
|
sha256:
|
|
'eb13b44b25bb36f89528b68720af8a61d9cf381176107f465db1757b65d086e1',
|
|
targets: targets('mediumDetection', 'inference.onnx')
|
|
},
|
|
{
|
|
name: 'recognition.onnx',
|
|
role: 'recognition',
|
|
size: 76_554_979,
|
|
sha256:
|
|
'9c09abf0957f7968c7586464b7397b84ad2387a0497a351af40e9acc71b673ba',
|
|
targets: targets('mediumRecognition', 'inference.onnx')
|
|
},
|
|
{
|
|
name: 'dictionary.yml',
|
|
role: 'dictionary',
|
|
size: 150_580,
|
|
sha256:
|
|
'991b700facf5b50a7de193468207d5f4255b538dde0d312ae3b7c7a9b6873129',
|
|
targets: targets('mediumRecognition', 'inference.yml')
|
|
}
|
|
]
|
|
}
|
|
])
|