From 6dc1e25f268f7137be64d5a88868ada492c2c7bf Mon Sep 17 00:00:00 2001 From: ZASENJC <1585463018@qq.com> Date: Mon, 13 Jul 2026 18:18:51 +0800 Subject: [PATCH] feat: improve OCR language detection --- src-tauri/src/ocr/vision.rs | 44 ++++++++++++++++++++++++++++--------- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/src-tauri/src/ocr/vision.rs b/src-tauri/src/ocr/vision.rs index 39083fa..ee9e2b0 100644 --- a/src-tauri/src/ocr/vision.rs +++ b/src-tauri/src/ocr/vision.rs @@ -22,17 +22,9 @@ pub fn recognize_bytes(bytes: &[u8]) -> Result { unsafe { let data = NSData::with_bytes(bytes); - // 创建文字识别请求,accurate 级别 + 中英多语言 + // 创建并配置多语言文字识别请求。 let request: Retained = VNRecognizeTextRequest::new(); - request.setRecognitionLevel(VNRequestTextRecognitionLevel::Accurate); - request.setUsesLanguageCorrection(true); - let langs = NSArray::from_retained_slice(&[ - NSString::from_str("zh-Hans"), - NSString::from_str("zh-Hant"), - NSString::from_str("en-US"), - NSString::from_str("ja-JP"), - ]); - request.setRecognitionLanguages(&langs); + configure_request(&request); // 基于图像数据构建 handler 并同步执行 let handler = VNImageRequestHandler::initWithData_options( @@ -52,6 +44,23 @@ pub fn recognize_bytes(bytes: &[u8]) -> Result { } } +fn configure_request(request: &VNRecognizeTextRequest) { + request.setRecognitionLevel(VNRequestTextRecognitionLevel::Accurate); + request.setUsesLanguageCorrection(true); + + if objc2::available!(macos = 13.0) { + request.setAutomaticallyDetectsLanguage(true); + } + + let langs = NSArray::from_retained_slice(&[ + NSString::from_str("zh-Hans"), + NSString::from_str("zh-Hant"), + NSString::from_str("en-US"), + NSString::from_str("ja-JP"), + ]); + request.setRecognitionLanguages(&langs); +} + /// 从请求结果收集识别文本。 unsafe fn collect_text(request: &VNRecognizeTextRequest) -> String { let Some(observations) = request.results() else { @@ -66,3 +75,18 @@ unsafe fn collect_text(request: &VNRecognizeTextRequest) -> String { } lines.join("\n") } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn enables_automatic_language_detection_by_default_when_available() { + let request = VNRecognizeTextRequest::new(); + configure_request(&request); + + if objc2::available!(macos = 13.0) { + assert!(request.automaticallyDetectsLanguage()); + } + } +}