التعرّف على النص في الصور باستخدام حزمة تعلُّم الآلة على نظام التشغيل iOS

يمكنك استخدام ML Kit للتعرّف على النص في الصور. تتضمّن حزمة تعلُّم الآلة واجهة برمجة تطبيقات عامة الأغراض مناسبة للتعرّف على النص في الصور، مثل نص لوحة إرشادية في الشارع، وواجهة برمجة تطبيقات محسَّنة للتعرّف على نص المستندات. تتضمّن واجهة برمجة التطبيقات للأغراض العامة نماذج على الجهاز ونماذج مستندة إلى السحابة الإلكترونية. لا يتوفّر التعرّف على نص المستند إلا كنموذج مستند إلى السحابة الإلكترونية. يمكنك الاطّلاع على النظرة العامة لمقارنة النماذج المستندة إلى السحابة الإلكترونية والنماذج التي تعمل على الجهاز.

قبل البدء

  1. إذا لم يسبق لك إضافة Firebase إلى تطبيقك، يمكنك إجراء ذلك باتّباع الخطوات الواردة في دليل بدء الاستخدام.
  2. أدرِج مكتبات ML Kit في ملف Podfile:
    pod 'Firebase/MLVision', '6.25.0'
    # If using an on-device API:
    pod 'Firebase/MLVisionTextModel', '6.25.0'
    
    بعد تثبيت أو تعديل Pods في مشروعك، احرص على فتح مشروع Xcode باستخدام .xcworkspace.
  3. في تطبيقك، استورِد Firebase:

    Swift

    import Firebase

    Objective-C

    @import Firebase;
  4. إذا كنت تريد استخدام النموذج المستند إلى السحابة الإلكترونية ولم يسبق لك تفعيل واجهات برمجة التطبيقات المستندة إلى السحابة الإلكترونية لمشروعك، عليك إجراء ذلك الآن باتّباع الخطوات التالية:

    1. افتح صفحة واجهات برمجة التطبيقات في ML Kit ضمن Firebase.
    2. إذا لم يسبق لك ترقية مشروعك إلى خطة أسعار Blaze، انقر على ترقية لإجراء ذلك. (لن يُطلب منك الترقية إلا إذا لم يكن مشروعك مشتركًا في خطة Blaze).

      يمكن للمشاريع على مستوى Blaze فقط استخدام واجهات برمجة التطبيقات المستندة إلى السحابة الإلكترونية.

    3. إذا لم تكن واجهات برمجة التطبيقات المستندة إلى السحابة الإلكترونية مفعّلة، انقر على تفعيل واجهات برمجة التطبيقات المستندة إلى السحابة الإلكترونية.

    يمكنك تخطّي هذه الخطوة إذا كنت تريد استخدام النموذج على الجهاز فقط.

أنت الآن جاهز لبدء التعرّف على النص في الصور.

إرشادات حول الصور المدخَلة

  • لكي يتعرّف ML Kit على النص بدقة، يجب أن تحتوي الصور المدخلة على نص يمثّله عدد كافٍ من وحدات البكسل. من المفترض أن يكون حجم كل حرف 16×16 بكسل على الأقل بالنسبة إلى النصوص اللاتينية. بالنسبة إلى النصوص الصينية واليابانية والكورية (التي تتوافق فقط مع واجهات برمجة التطبيقات المستندة إلى السحابة الإلكترونية)، يجب أن يكون حجم كل حرف 24 × 24 بكسل. وبالنسبة إلى جميع اللغات، لا تتحسّن الدقة بشكل عام إذا كان حجم الأحرف أكبر من 24 × 24 بكسل.

    على سبيل المثال، قد تكون صورة بحجم 640x480 مناسبة لمسح بطاقة عمل ضوئيًا تشغل العرض الكامل للصورة. لمسح مستند ضوئيًا مطبوع على ورق بحجم Letter، قد تحتاج إلى صورة بحجم 720x1280 بكسل.

  • يمكن أن يؤدي عدم وضوح الصورة إلى انخفاض دقة التعرّف على النص. إذا لم تحصل على نتائج مقبولة، اطلب من المستخدم إعادة التقاط الصورة.

  • إذا كنت تستخدم تطبيقًا يتعرّف على النص في الوقت الفعلي، قد تحتاج أيضًا إلى مراعاة الأبعاد الإجمالية للصور المدخلة. يمكن معالجة الصور الأصغر حجمًا بشكل أسرع، لذا لتقليل وقت الاستجابة، التقط الصور بدقة أقل (مع مراعاة متطلبات الدقة المذكورة أعلاه) وتأكَّد من أنّ النص يشغل أكبر قدر ممكن من الصورة. يمكنك أيضًا الاطّلاع على نصائح لتحسين الأداء في الوقت الفعلي.


التعرّف على النص في الصور

للتعرّف على نص في صورة باستخدام نموذج على الجهاز أو نموذج مستند إلى السحابة الإلكترونية، شغِّل أداة التعرّف على النص كما هو موضّح أدناه.

1. تشغيل أداة التعرّف على النص

مرِّر الصورة كـ `UIImage` أو `CMSampleBufferRef` إلى طريقة `process(_:completion:)` في `VisionTextRecognizer`:
  1. احصل على مثيل من VisionTextRecognizer عن طريق استدعاء onDeviceTextRecognizer أو cloudTextRecognizer:

    Swift

    لاستخدام النموذج على الجهاز، اتّبِع الخطوات التالية:

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

    لاستخدام النموذج السحابي، اتّبِع الخطوات التالية:

    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)

    Objective-C

    لاستخدام النموذج على الجهاز، اتّبِع الخطوات التالية:

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

    لاستخدام النموذج السحابي، اتّبِع الخطوات التالية:

    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. أنشئ عنصر VisionImage باستخدام UIImage أو CMSampleBufferRef.

    لاستخدام UIImage:

    1. إذا لزم الأمر، عليك تدوير الصورة بحيث تكون قيمة السمة imageOrientation هي .up.
    2. أنشئ كائن VisionImage باستخدام UIImage الذي تم تدويره بشكل صحيح. يجب عدم تحديد أي بيانات وصفية خاصة بالتدوير، بل استخدام القيمة التلقائية .topLeft.

      Swift

      let image = VisionImage(image: uiImage)

      Objective-C

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

    لاستخدام CMSampleBufferRef:

    1. أنشئ عنصر VisionImageMetadata يحدّد اتجاه بيانات الصورة الواردة في المخزن المؤقت CMSampleBufferRef.

      للحصول على اتجاه الصورة، اتّبِع الخطوات التالية:

      Swift

      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
          }
      }

      Objective-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;
        }
      }

      بعد ذلك، أنشئ عنصر بيانات التعريف:

      Swift

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

      Objective-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. أنشئ عنصر VisionImage باستخدام عنصر CMSampleBufferRef وبيانات الدوران الوصفية:

      Swift

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

      Objective-C

      FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer];
      image.metadata = metadata;
  3. بعد ذلك، مرِّر الصورة إلى طريقة process(_:completion:):

    Swift

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

    Objective-C

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

2. استخراج النص من كتل النص التي تم التعرّف عليها

في حال نجاح عملية التعرّف على النص، سيتم عرض عنصر [`VisionText`][VisionText]. يحتوي عنصر `VisionText` على النص الكامل الذي تم التعرّف عليه في الصورة وعلى صفر أو أكثر من عناصر [`VisionTextBlock`][VisionTextBlock]. يمثّل كل `VisionTextBlock` مقطعًا نصيًا مستطيلاً يحتوي على صفر أو أكثر من عناصر [`VisionTextLine`][VisionTextLine]. يحتوي كل عنصر `VisionTextLine` على صفر أو أكثر من عناصر [`VisionTextElement`][VisionTextElement]، والتي تمثّل الكلمات والكيانات الشبيهة بالكلمات (التواريخ والأرقام وما إلى ذلك). بالنسبة إلى كل عنصر من عناصر `VisionTextBlock` و`VisionTextLine` و `VisionTextElement`، يمكنك الحصول على النص الذي تم التعرّف عليه في المنطقة وإحداثيات حدود المنطقة. على سبيل المثال:

Swift

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
        }
    }
}

Objective-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;
    }
  }
}

نصائح لتحسين الأداء في الوقت الفعلي

إذا كنت تريد استخدام النموذج على الجهاز للتعرّف على النص في تطبيق يعمل في الوقت الفعلي، اتّبِع الإرشادات التالية لتحقيق أفضل معدّلات عرض اللقطات:

  • تقليل عدد طلبات التعرّف على النص إذا توفّر إطار فيديو جديد أثناء تشغيل أداة التعرّف على النصوص، يجب تجاهل الإطار.
  • إذا كنت تستخدم ناتج أداة التعرّف على النصوص لتراكب الرسومات على صورة الإدخال، احصل أولاً على النتيجة من &quot;حزمة تعلُّم الآلة&quot;، ثم اعرض الصورة والتراكب في خطوة واحدة. وبذلك، يتم العرض على مساحة العرض مرة واحدة فقط لكل إطار إدخال. يمكنك الاطّلاع على الفئتَين previewOverlayView وFIRDetectionOverlayView في تطبيق العرض التوضيحي النموذجي للحصول على مثال.
  • ننصحك بالتقاط الصور بدقة أقل. ومع ذلك، يجب أيضًا مراعاة متطلبات أبعاد الصورة في واجهة برمجة التطبيقات هذه.

الخطوات التالية


التعرّف على النص في صور المستندات

للتعرّف على نص مستند، اضبط مشغّل التعرّف على نص المستند المستند إلى السحابة الإلكترونية وشغّله كما هو موضّح أدناه.

توفّر واجهة برمجة التطبيقات للتعرّف على نص المستندات، الموضّحة أدناه، واجهة تهدف إلى تسهيل التعامل مع صور المستندات. ومع ذلك، إذا كنت تفضّل الواجهة التي توفّرها واجهة برمجة التطبيقات الخاصة بالنص المتفرّق، يمكنك استخدامها بدلاً من ذلك لفحص المستندات من خلال ضبط أداة التعرّف على النص في السحابة الإلكترونية على استخدام نموذج النص الكثيف.

لاستخدام واجهة برمجة التطبيقات للتعرّف على نص المستند، اتّبِع الخطوات التالية:

1. تشغيل أداة التعرّف على النص

مرِّر الصورة كـ UIImage أو CMSampleBufferRef إلى طريقة process(_:completion:) في VisionDocumentTextRecognizer:

  1. يمكنك الحصول على مثيل من VisionDocumentTextRecognizer من خلال استدعاء cloudDocumentTextRecognizer:

    Swift

    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)

    Objective-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. أنشئ عنصر VisionImage باستخدام UIImage أو CMSampleBufferRef.

    لاستخدام UIImage:

    1. إذا لزم الأمر، عليك تدوير الصورة بحيث تكون قيمة السمة imageOrientation هي .up.
    2. أنشئ كائن VisionImage باستخدام UIImage الذي تم تدويره بشكل صحيح. يجب عدم تحديد أي بيانات وصفية خاصة بالتدوير، بل استخدام القيمة التلقائية .topLeft.

      Swift

      let image = VisionImage(image: uiImage)

      Objective-C

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

    لاستخدام CMSampleBufferRef:

    1. أنشئ عنصر VisionImageMetadata يحدّد اتجاه بيانات الصورة الواردة في المخزن المؤقت CMSampleBufferRef.

      للحصول على اتجاه الصورة، اتّبِع الخطوات التالية:

      Swift

      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
          }
      }

      Objective-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;
        }
      }

      بعد ذلك، أنشئ عنصر بيانات التعريف:

      Swift

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

      Objective-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. أنشئ عنصر VisionImage باستخدام عنصر CMSampleBufferRef وبيانات الدوران الوصفية:

      Swift

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

      Objective-C

      FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer];
      image.metadata = metadata;
  3. بعد ذلك، مرِّر الصورة إلى طريقة process(_:completion:):

    Swift

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

    Objective-C

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

2. استخراج النص من كتل النص التي تم التعرّف عليها

في حال نجاح عملية التعرّف على النص، سيتم عرض عنصر VisionDocumentText. يحتوي عنصر VisionDocumentText على النص الكامل الذي تم التعرّف عليه في الصورة وعلى تسلسل هرمي للعناصر يعكس بنية المستند الذي تم التعرّف عليه:

بالنسبة إلى كل عنصر من عناصر VisionDocumentTextBlock وVisionDocumentTextParagraph وVisionDocumentTextWord وVisionDocumentTextSymbol، يمكنك الحصول على النص الذي تم التعرّف عليه في المنطقة وإحداثيات حدود المنطقة.

على سبيل المثال:

Swift

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
            }
        }
    }
}

Objective-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;
      }
    }
  }
}

الخطوات التالية