feat: improve OCR language detection

This commit is contained in:
ZASENJC committed 2026-07-13 18:18:51 +08:00
1 parent 5ee697cadc
commit 6dc1e25f26
1 file changed
+34 -10
+34 -10
View File
@@ -22,17 +22,9 @@ pub fn recognize_bytes(bytes: &[u8]) -> Result<String, String> {
unsafe { unsafe {
let data = NSData::with_bytes(bytes); let data = NSData::with_bytes(bytes);
// 创建文字识别请求,accurate 级别 + 中英多语言 // 创建并配置多语言文字识别请求。
let request: Retained<VNRecognizeTextRequest> = VNRecognizeTextRequest::new(); let request: Retained<VNRecognizeTextRequest> = VNRecognizeTextRequest::new();
request.setRecognitionLevel(VNRequestTextRecognitionLevel::Accurate); configure_request(&request);
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);
// 基于图像数据构建 handler 并同步执行 // 基于图像数据构建 handler 并同步执行
let handler = VNImageRequestHandler::initWithData_options( let handler = VNImageRequestHandler::initWithData_options(
@@ -52,6 +44,23 @@ pub fn recognize_bytes(bytes: &[u8]) -> Result<String, String> {
} }
} }
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 { unsafe fn collect_text(request: &VNRecognizeTextRequest) -> String {
let Some(observations) = request.results() else { let Some(observations) = request.results() else {
@@ -66,3 +75,18 @@ unsafe fn collect_text(request: &VNRecognizeTextRequest) -> String {
} }
lines.join("\n") 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());
}
}
}