Nhận dạng văn bản trong hình ảnh bằng ML Kit trên iOS

Bạn có thể sử dụng ML Kit để nhận dạng văn bản trong hình ảnh. ML Kit có cả API đa năng phù hợp để nhận dạng văn bản trong hình ảnh, chẳng hạn như văn bản của biển báo đường phố và API được tối ưu hóa để nhận dạng văn bản của tài liệu. API đa năng có cả mô hình trên thiết bị và dựa trên đám mây. Nhận dạng văn bản tài liệu chỉ khả dụng dưới dạng mô hình dựa trên đám mây. Xem phần tổng quan để so sánh giữa mô hình đám mây và mô hình trên thiết bị.

Trước khi bắt đầu

  1. Nếu bạn chưa thêm Firebase vào ứng dụng của mình, hãy làm như vậy bằng cách làm theo các bước trong hướng dẫn bắt đầu .
  2. Bao gồm các thư viện ML Kit trong Podfile của bạn:
    pod 'Firebase/MLVision', '6.25.0'
    # If using an on-device API:
    pod 'Firebase/MLVisionTextModel', '6.25.0'
    
    Sau khi bạn cài đặt hoặc cập nhật Pod của dự án, hãy nhớ mở dự án Xcode của bạn bằng cách sử dụng .xcworkspace .
  3. Trong ứng dụng của bạn, hãy nhập Firebase:

    Nhanh

    import Firebase

    Mục tiêu-C

    @import Firebase;
  4. Nếu bạn muốn sử dụng mô hình dựa trên Đám mây và bạn chưa bật API dựa trên Đám mây cho dự án của mình, hãy thực hiện ngay bây giờ:

    1. Mở trang API ML Kit của bảng điều khiển Firebase.
    2. Nếu bạn chưa nâng cấp dự án của mình lên gói định giá Blaze, hãy nhấp vào Nâng cấp để thực hiện. (Bạn sẽ chỉ được nhắc nâng cấp nếu dự án của bạn không nằm trong gói Blaze.)

      Chỉ các dự án cấp Blaze mới có thể sử dụng API dựa trên Đám mây.

    3. Nếu API dựa trên đám mây chưa được bật, hãy nhấp vào Bật API dựa trên đám mây .

    Nếu chỉ muốn sử dụng kiểu máy trên thiết bị, bạn có thể bỏ qua bước này.

Bây giờ bạn đã sẵn sàng bắt đầu nhận dạng văn bản trong hình ảnh.

Hướng dẫn nhập hình ảnh

  • Để Bộ ML nhận dạng chính xác văn bản, hình ảnh đầu vào phải chứa văn bản được thể hiện bằng đủ dữ liệu pixel. Lý tưởng nhất là đối với văn bản Latinh, mỗi ký tự phải có kích thước tối thiểu là 16x16 pixel. Đối với văn bản tiếng Trung, tiếng Nhật và tiếng Hàn (chỉ được hỗ trợ bởi API dựa trên đám mây), mỗi ký tự phải có kích thước 24x24 pixel. Đối với tất cả các ngôn ngữ, nhìn chung không có lợi ích về độ chính xác đối với các ký tự lớn hơn 24x24 pixel.

    Vì vậy, ví dụ: hình ảnh 640x480 có thể hoạt động tốt để quét danh thiếp chiếm toàn bộ chiều rộng của hình ảnh. Để quét tài liệu được in trên giấy cỡ letter, có thể cần phải có hình ảnh 720x1280 pixel.

  • Lấy nét hình ảnh kém có thể ảnh hưởng đến độ chính xác của nhận dạng văn bản. Nếu bạn không nhận được kết quả chấp nhận được, hãy thử yêu cầu người dùng chụp lại hình ảnh.

  • Nếu bạn đang nhận dạng văn bản trong ứng dụng thời gian thực, bạn cũng có thể muốn xem xét kích thước tổng thể của hình ảnh đầu vào. Hình ảnh nhỏ hơn có thể được xử lý nhanh hơn, do đó, để giảm độ trễ, hãy chụp ảnh ở độ phân giải thấp hơn (lưu ý các yêu cầu về độ chính xác ở trên) và đảm bảo rằng văn bản chiếm càng nhiều diện tích hình ảnh càng tốt. Đồng thời xem Mẹo để cải thiện hiệu suất thời gian thực .


Nhận dạng văn bản trong hình ảnh

Để nhận dạng văn bản trong hình ảnh bằng mô hình trên thiết bị hoặc dựa trên đám mây, hãy chạy trình nhận dạng văn bản như mô tả bên dưới.

1. Chạy trình nhận dạng văn bản

Truyền hình ảnh dưới dạng `UIImage` hoặc `CMSampleBufferRef` tới phương thức `process(_:completion:)` của `VisionTextRecognizer`:
  1. Nhận một phiên bản của VisionTextRecognizer bằng cách gọi onDeviceTextRecognizer hoặc cloudTextRecognizer :

    Nhanh

    Để sử dụng mẫu trên thiết bị:

    let vision = Vision.vision()
    let textRecognizer = vision.onDeviceTextRecognizer()
    

    Để sử dụng mô hình đám mây:

    let vision = Vision.vision()
    let textRecognizer = vision.cloudTextRecognizer()
    
    // Or, to provide language hints to assist with language detection:
    // See https://cloud.google.com/vision/docs/languages for supported languages
    let options = VisionCloudTextRecognizerOptions()
    options.languageHints = ["en", "hi"]
    let textRecognizer = vision.cloudTextRecognizer(options: options)
    

    Mục tiêu-C

    Để sử dụng mẫu trên thiết bị:

    FIRVision *vision = [FIRVision vision];
    FIRVisionTextRecognizer *textRecognizer = [vision onDeviceTextRecognizer];
    

    Để sử dụng mô hình đám mây:

    FIRVision *vision = [FIRVision vision];
    FIRVisionTextRecognizer *textRecognizer = [vision cloudTextRecognizer];
    
    // Or, to provide language hints to assist with language detection:
    // See https://cloud.google.com/vision/docs/languages for supported languages
    FIRVisionCloudTextRecognizerOptions *options =
            [[FIRVisionCloudTextRecognizerOptions alloc] init];
    options.languageHints = @[@"en", @"hi"];
    FIRVisionTextRecognizer *textRecognizer = [vision cloudTextRecognizerWithOptions:options];
    
  2. Tạo đối tượng VisionImage bằng UIImage hoặc CMSampleBufferRef .

    Để sử dụng UIImage :

    1. Nếu cần, hãy xoay hình ảnh sao cho thuộc tính imageOrientation của nó là .up .
    2. Tạo một đối tượng VisionImage bằng cách sử dụng UIImage được xoay chính xác. Không chỉ định bất kỳ siêu dữ liệu xoay nào—giá trị mặc định, .topLeft , phải được sử dụng.

      Nhanh

      let image = VisionImage(image: uiImage)

      Mục tiêu-C

      FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];

    Để sử dụng CMSampleBufferRef :

    1. Tạo một đối tượng VisionImageMetadata chỉ định hướng của dữ liệu hình ảnh có trong bộ đệm CMSampleBufferRef .

      Để có được hướng hình ảnh:

      Nhanh

      func imageOrientation(
          deviceOrientation: UIDeviceOrientation,
          cameraPosition: AVCaptureDevice.Position
          ) -> VisionDetectorImageOrientation {
          switch deviceOrientation {
          case .portrait:
              return cameraPosition == .front ? .leftTop : .rightTop
          case .landscapeLeft:
              return cameraPosition == .front ? .bottomLeft : .topLeft
          case .portraitUpsideDown:
              return cameraPosition == .front ? .rightBottom : .leftBottom
          case .landscapeRight:
              return cameraPosition == .front ? .topRight : .bottomRight
          case .faceDown, .faceUp, .unknown:
              return .leftTop
          }
      }

      Mục tiêu-C

      - (FIRVisionDetectorImageOrientation)
          imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation
                                 cameraPosition:(AVCaptureDevicePosition)cameraPosition {
        switch (deviceOrientation) {
          case UIDeviceOrientationPortrait:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationLeftTop;
            } else {
              return FIRVisionDetectorImageOrientationRightTop;
            }
          case UIDeviceOrientationLandscapeLeft:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationBottomLeft;
            } else {
              return FIRVisionDetectorImageOrientationTopLeft;
            }
          case UIDeviceOrientationPortraitUpsideDown:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationRightBottom;
            } else {
              return FIRVisionDetectorImageOrientationLeftBottom;
            }
          case UIDeviceOrientationLandscapeRight:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationTopRight;
            } else {
              return FIRVisionDetectorImageOrientationBottomRight;
            }
          default:
            return FIRVisionDetectorImageOrientationTopLeft;
        }
      }

      Sau đó, tạo đối tượng siêu dữ liệu:

      Nhanh

      let cameraPosition = AVCaptureDevice.Position.back  // Set to the capture device you used.
      let metadata = VisionImageMetadata()
      metadata.orientation = imageOrientation(
          deviceOrientation: UIDevice.current.orientation,
          cameraPosition: cameraPosition
      )

      Mục tiêu-C

      FIRVisionImageMetadata *metadata = [[FIRVisionImageMetadata alloc] init];
      AVCaptureDevicePosition cameraPosition =
          AVCaptureDevicePositionBack;  // Set to the capture device you used.
      metadata.orientation =
          [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation
                                       cameraPosition:cameraPosition];
    2. Tạo một đối tượng VisionImage bằng cách sử dụng đối tượng CMSampleBufferRef và siêu dữ liệu xoay:

      Nhanh

      let image = VisionImage(buffer: sampleBuffer)
      image.metadata = metadata

      Mục tiêu-C

      FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer];
      image.metadata = metadata;
  3. Sau đó, chuyển hình ảnh tới phương thức process(_:completion:) :

    Nhanh

    textRecognizer.process(visionImage) { result, error in
      guard error == nil, let result = result else {
        // ...
        return
      }
    
      // Recognized text
    }
    

    Mục tiêu-C

    [textRecognizer processImage:image
                      completion:^(FIRVisionText *_Nullable result,
                                   NSError *_Nullable error) {
      if (error != nil || result == nil) {
        // ...
        return;
      }
    
      // Recognized text
    }];
    

2. Trích xuất văn bản từ khối văn bản được nhận dạng

Nếu thao tác nhận dạng văn bản thành công, nó sẽ trả về đối tượng [`VisionText`][VisionText]. Đối tượng `VisionText` chứa toàn bộ văn bản được nhận dạng trong hình ảnh và không có hoặc nhiều đối tượng [`VisionTextBlock`][VisionTextBlock]. Mỗi `VisionTextBlock` đại diện cho một khối văn bản hình chữ nhật, chứa 0 hoặc nhiều đối tượng [`VisionTextLine`][VisionTextLine]. Mỗi đối tượng `VisionTextLine` chứa 0 hoặc nhiều đối tượng [`VisionTextElement`][VisionTextElement], đại diện cho các từ và các thực thể giống như từ (ngày, số, v.v.). Đối với mỗi đối tượng `VisionTextBlock`, `VisionTextLine` và `VisionTextElement`, bạn có thể nhận dạng văn bản trong vùng và tọa độ giới hạn của vùng. Ví dụ:

Nhanh

let resultText = result.text
for block in result.blocks {
    let blockText = block.text
    let blockConfidence = block.confidence
    let blockLanguages = block.recognizedLanguages
    let blockCornerPoints = block.cornerPoints
    let blockFrame = block.frame
    for line in block.lines {
        let lineText = line.text
        let lineConfidence = line.confidence
        let lineLanguages = line.recognizedLanguages
        let lineCornerPoints = line.cornerPoints
        let lineFrame = line.frame
        for element in line.elements {
            let elementText = element.text
            let elementConfidence = element.confidence
            let elementLanguages = element.recognizedLanguages
            let elementCornerPoints = element.cornerPoints
            let elementFrame = element.frame
        }
    }
}

Mục tiêu-C

NSString *resultText = result.text;
for (FIRVisionTextBlock *block in result.blocks) {
  NSString *blockText = block.text;
  NSNumber *blockConfidence = block.confidence;
  NSArray<FIRVisionTextRecognizedLanguage *> *blockLanguages = block.recognizedLanguages;
  NSArray<NSValue *> *blockCornerPoints = block.cornerPoints;
  CGRect blockFrame = block.frame;
  for (FIRVisionTextLine *line in block.lines) {
    NSString *lineText = line.text;
    NSNumber *lineConfidence = line.confidence;
    NSArray<FIRVisionTextRecognizedLanguage *> *lineLanguages = line.recognizedLanguages;
    NSArray<NSValue *> *lineCornerPoints = line.cornerPoints;
    CGRect lineFrame = line.frame;
    for (FIRVisionTextElement *element in line.elements) {
      NSString *elementText = element.text;
      NSNumber *elementConfidence = element.confidence;
      NSArray<FIRVisionTextRecognizedLanguage *> *elementLanguages = element.recognizedLanguages;
      NSArray<NSValue *> *elementCornerPoints = element.cornerPoints;
      CGRect elementFrame = element.frame;
    }
  }
}

Mẹo để cải thiện hiệu suất thời gian thực

Nếu bạn muốn sử dụng mô hình trên thiết bị để nhận dạng văn bản trong ứng dụng thời gian thực, hãy làm theo các nguyên tắc sau để đạt được tốc độ khung hình tốt nhất:

  • Điều tiết cuộc gọi đến trình nhận dạng văn bản. Nếu có khung video mới trong khi trình nhận dạng văn bản đang chạy, hãy thả khung đó xuống.
  • Nếu bạn đang sử dụng đầu ra của trình nhận dạng văn bản để phủ đồ họa lên hình ảnh đầu vào, trước tiên hãy lấy kết quả từ Bộ công cụ ML, sau đó kết xuất hình ảnh và lớp phủ trong một bước duy nhất. Bằng cách đó, bạn chỉ hiển thị trên bề mặt hiển thị một lần cho mỗi khung hình đầu vào. Xem các lớp PreviewOverlayViewFIRDetectionOverlayView trong ứng dụng mẫu giới thiệu để biết ví dụ.
  • Hãy cân nhắc việc chụp ảnh ở độ phân giải thấp hơn. Tuy nhiên, cũng hãy ghi nhớ các yêu cầu về kích thước hình ảnh của API này.

Bước tiếp theo


Nhận dạng văn bản trong hình ảnh của tài liệu

Để nhận dạng văn bản của tài liệu, hãy định cấu hình và chạy trình nhận dạng văn bản tài liệu dựa trên đám mây như mô tả bên dưới.

API nhận dạng văn bản tài liệu, được mô tả bên dưới, cung cấp giao diện nhằm mục đích thuận tiện hơn khi làm việc với hình ảnh của tài liệu. Tuy nhiên, nếu thích giao diện do API văn bản thưa thớt cung cấp, bạn có thể sử dụng giao diện này để quét tài liệu bằng cách định cấu hình trình nhận dạng văn bản trên đám mây để sử dụng mô hình văn bản dày đặc .

Để sử dụng API nhận dạng văn bản tài liệu:

1. Chạy trình nhận dạng văn bản

Truyền hình ảnh dưới dạng UIImage hoặc CMSampleBufferRef cho phương thức process(_:completion:) của VisionDocumentTextRecognizer :

  1. Nhận một phiên bản của VisionDocumentTextRecognizer bằng cách gọi cloudDocumentTextRecognizer :

    Nhanh

    let vision = Vision.vision()
    let textRecognizer = vision.cloudDocumentTextRecognizer()
    
    // Or, to provide language hints to assist with language detection:
    // See https://cloud.google.com/vision/docs/languages for supported languages
    let options = VisionCloudDocumentTextRecognizerOptions()
    options.languageHints = ["en", "hi"]
    let textRecognizer = vision.cloudDocumentTextRecognizer(options: options)
    

    Mục tiêu-C

    FIRVision *vision = [FIRVision vision];
    FIRVisionDocumentTextRecognizer *textRecognizer = [vision cloudDocumentTextRecognizer];
    
    // Or, to provide language hints to assist with language detection:
    // See https://cloud.google.com/vision/docs/languages for supported languages
    FIRVisionCloudDocumentTextRecognizerOptions *options =
            [[FIRVisionCloudDocumentTextRecognizerOptions alloc] init];
    options.languageHints = @[@"en", @"hi"];
    FIRVisionDocumentTextRecognizer *textRecognizer = [vision cloudDocumentTextRecognizerWithOptions:options];
    
  2. Tạo đối tượng VisionImage bằng UIImage hoặc CMSampleBufferRef .

    Để sử dụng UIImage :

    1. Nếu cần, hãy xoay hình ảnh sao cho thuộc tính imageOrientation của nó là .up .
    2. Tạo một đối tượng VisionImage bằng cách sử dụng UIImage được xoay chính xác. Không chỉ định bất kỳ siêu dữ liệu xoay nào—giá trị mặc định, .topLeft , phải được sử dụng.

      Nhanh

      let image = VisionImage(image: uiImage)

      Mục tiêu-C

      FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];

    Để sử dụng CMSampleBufferRef :

    1. Tạo một đối tượng VisionImageMetadata chỉ định hướng của dữ liệu hình ảnh có trong bộ đệm CMSampleBufferRef .

      Để có được hướng hình ảnh:

      Nhanh

      func imageOrientation(
          deviceOrientation: UIDeviceOrientation,
          cameraPosition: AVCaptureDevice.Position
          ) -> VisionDetectorImageOrientation {
          switch deviceOrientation {
          case .portrait:
              return cameraPosition == .front ? .leftTop : .rightTop
          case .landscapeLeft:
              return cameraPosition == .front ? .bottomLeft : .topLeft
          case .portraitUpsideDown:
              return cameraPosition == .front ? .rightBottom : .leftBottom
          case .landscapeRight:
              return cameraPosition == .front ? .topRight : .bottomRight
          case .faceDown, .faceUp, .unknown:
              return .leftTop
          }
      }

      Mục tiêu-C

      - (FIRVisionDetectorImageOrientation)
          imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation
                                 cameraPosition:(AVCaptureDevicePosition)cameraPosition {
        switch (deviceOrientation) {
          case UIDeviceOrientationPortrait:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationLeftTop;
            } else {
              return FIRVisionDetectorImageOrientationRightTop;
            }
          case UIDeviceOrientationLandscapeLeft:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationBottomLeft;
            } else {
              return FIRVisionDetectorImageOrientationTopLeft;
            }
          case UIDeviceOrientationPortraitUpsideDown:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationRightBottom;
            } else {
              return FIRVisionDetectorImageOrientationLeftBottom;
            }
          case UIDeviceOrientationLandscapeRight:
            if (cameraPosition == AVCaptureDevicePositionFront) {
              return FIRVisionDetectorImageOrientationTopRight;
            } else {
              return FIRVisionDetectorImageOrientationBottomRight;
            }
          default:
            return FIRVisionDetectorImageOrientationTopLeft;
        }
      }

      Sau đó, tạo đối tượng siêu dữ liệu:

      Nhanh

      let cameraPosition = AVCaptureDevice.Position.back  // Set to the capture device you used.
      let metadata = VisionImageMetadata()
      metadata.orientation = imageOrientation(
          deviceOrientation: UIDevice.current.orientation,
          cameraPosition: cameraPosition
      )

      Mục tiêu-C

      FIRVisionImageMetadata *metadata = [[FIRVisionImageMetadata alloc] init];
      AVCaptureDevicePosition cameraPosition =
          AVCaptureDevicePositionBack;  // Set to the capture device you used.
      metadata.orientation =
          [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation
                                       cameraPosition:cameraPosition];
    2. Tạo một đối tượng VisionImage bằng cách sử dụng đối tượng CMSampleBufferRef và siêu dữ liệu xoay:

      Nhanh

      let image = VisionImage(buffer: sampleBuffer)
      image.metadata = metadata

      Mục tiêu-C

      FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer];
      image.metadata = metadata;
  3. Sau đó, chuyển hình ảnh tới phương thức process(_:completion:) :

    Nhanh

    textRecognizer.process(visionImage) { result, error in
      guard error == nil, let result = result else {
        // ...
        return
      }
    
      // Recognized text
    }
    

    Mục tiêu-C

    [textRecognizer processImage:image
                      completion:^(FIRVisionDocumentText *_Nullable result,
                                   NSError *_Nullable error) {
      if (error != nil || result == nil) {
        // ...
        return;
      }
    
        // Recognized text
    }];
    

2. Trích xuất văn bản từ khối văn bản được nhận dạng

Nếu thao tác nhận dạng văn bản thành công, nó sẽ trả về đối tượng VisionDocumentText . Đối tượng VisionDocumentText chứa toàn bộ văn bản được nhận dạng trong hình ảnh và hệ thống phân cấp của các đối tượng phản ánh cấu trúc của tài liệu được nhận dạng:

Đối với mỗi đối tượng VisionDocumentTextBlock , VisionDocumentTextParagraph , VisionDocumentTextWordVisionDocumentTextSymbol , bạn có thể nhận dạng văn bản trong vùng và tọa độ giới hạn của vùng.

Ví dụ:

Nhanh

let resultText = result.text
for block in result.blocks {
    let blockText = block.text
    let blockConfidence = block.confidence
    let blockRecognizedLanguages = block.recognizedLanguages
    let blockBreak = block.recognizedBreak
    let blockCornerPoints = block.cornerPoints
    let blockFrame = block.frame
    for paragraph in block.paragraphs {
        let paragraphText = paragraph.text
        let paragraphConfidence = paragraph.confidence
        let paragraphRecognizedLanguages = paragraph.recognizedLanguages
        let paragraphBreak = paragraph.recognizedBreak
        let paragraphCornerPoints = paragraph.cornerPoints
        let paragraphFrame = paragraph.frame
        for word in paragraph.words {
            let wordText = word.text
            let wordConfidence = word.confidence
            let wordRecognizedLanguages = word.recognizedLanguages
            let wordBreak = word.recognizedBreak
            let wordCornerPoints = word.cornerPoints
            let wordFrame = word.frame
            for symbol in word.symbols {
                let symbolText = symbol.text
                let symbolConfidence = symbol.confidence
                let symbolRecognizedLanguages = symbol.recognizedLanguages
                let symbolBreak = symbol.recognizedBreak
                let symbolCornerPoints = symbol.cornerPoints
                let symbolFrame = symbol.frame
            }
        }
    }
}

Mục tiêu-C

NSString *resultText = result.text;
for (FIRVisionDocumentTextBlock *block in result.blocks) {
  NSString *blockText = block.text;
  NSNumber *blockConfidence = block.confidence;
  NSArray<FIRVisionTextRecognizedLanguage *> *blockRecognizedLanguages = block.recognizedLanguages;
  FIRVisionTextRecognizedBreak *blockBreak = block.recognizedBreak;
  CGRect blockFrame = block.frame;
  for (FIRVisionDocumentTextParagraph *paragraph in block.paragraphs) {
    NSString *paragraphText = paragraph.text;
    NSNumber *paragraphConfidence = paragraph.confidence;
    NSArray<FIRVisionTextRecognizedLanguage *> *paragraphRecognizedLanguages = paragraph.recognizedLanguages;
    FIRVisionTextRecognizedBreak *paragraphBreak = paragraph.recognizedBreak;
    CGRect paragraphFrame = paragraph.frame;
    for (FIRVisionDocumentTextWord *word in paragraph.words) {
      NSString *wordText = word.text;
      NSNumber *wordConfidence = word.confidence;
      NSArray<FIRVisionTextRecognizedLanguage *> *wordRecognizedLanguages = word.recognizedLanguages;
      FIRVisionTextRecognizedBreak *wordBreak = word.recognizedBreak;
      CGRect wordFrame = word.frame;
      for (FIRVisionDocumentTextSymbol *symbol in word.symbols) {
        NSString *symbolText = symbol.text;
        NSNumber *symbolConfidence = symbol.confidence;
        NSArray<FIRVisionTextRecognizedLanguage *> *symbolRecognizedLanguages = symbol.recognizedLanguages;
        FIRVisionTextRecognizedBreak *symbolBreak = symbol.recognizedBreak;
        CGRect symbolFrame = symbol.frame;
      }
    }
  }
}

Bước tiếp theo