Catch up on everything we announced at this year's Firebase Summit. Learn more

অ্যাপল প্ল্যাটফর্মে ফায়ারবেস প্রমাণীকরণ এবং ফাংশন ব্যবহার করে ক্লাউড ভিশনের মাধ্যমে সুরক্ষিতভাবে চিত্রগুলিতে পাঠ্য সনাক্ত করুন

আপনার অ্যাপ থেকে একটি Google ক্লাউড API কল করার জন্য, আপনাকে একটি মধ্যবর্তী REST API তৈরি করতে হবে যা অনুমোদন পরিচালনা করে এবং API কীগুলির মতো গোপন মানগুলিকে রক্ষা করে৷ তারপরে আপনাকে এই মধ্যবর্তী পরিষেবার সাথে প্রমাণীকরণ এবং যোগাযোগ করতে আপনার মোবাইল অ্যাপে কোড লিখতে হবে৷

এই REST API তৈরি করার একটি উপায় হল Firebase প্রমাণীকরণ এবং ফাংশনগুলি ব্যবহার করা, যা আপনাকে Google ক্লাউড API-এর একটি পরিচালিত, সার্ভারহীন গেটওয়ে দেয় যা প্রমাণীকরণ পরিচালনা করে এবং পূর্ব-নির্মিত SDK সহ আপনার মোবাইল অ্যাপ থেকে কল করা যেতে পারে।

আপনার অ্যাপ থেকে ক্লাউড ভিশন API কল করতে এই কৌশলটি কীভাবে ব্যবহার করবেন তা এই নির্দেশিকাটি প্রদর্শন করে৷ এই পদ্ধতিটি সমস্ত প্রমাণীকৃত ব্যবহারকারীদের আপনার ক্লাউড প্রকল্পের মাধ্যমে ক্লাউড ভিশন বিল করা পরিষেবাগুলি অ্যাক্সেস করার অনুমতি দেবে, তাই এগিয়ে যাওয়ার আগে এই প্রমাণীকরণ প্রক্রিয়াটি আপনার ব্যবহারের ক্ষেত্রে যথেষ্ট কিনা তা বিবেচনা করুন।

তুমি শুরু করার আগে

আপনার প্রকল্প কনফিগার করুন

আপনি ইতিমধ্যে আপনার অ্যাপ্লিকেশানে Firebase করে তাহলে, এ পদক্ষেপগুলি অনুসরণ করে তা করতে শুরু করার নির্দেশিকা

ফায়ারবেস নির্ভরতা ইনস্টল এবং পরিচালনা করতে সুইফট প্যাকেজ ম্যানেজার ব্যবহার করুন।

  1. Xcode ক্ষেত্রে File খোলা আপনার অ্যাপ প্রকল্পের, নেভিগেট সঙ্গে> সুইফট প্যাকেজগুলি> প্যাকেজ নির্ভরতা যুক্ত করো।
  2. অনুরোধ করা হলে, Firebase Apple প্ল্যাটফর্ম SDK সংগ্রহস্থল যোগ করুন:
  3.   https://github.com/firebase/firebase-ios-sdk
      
  4. Firebase ML লাইব্রেরি বেছে নিন।
  5. শেষ হয়ে গেলে, Xcode স্বয়ংক্রিয়ভাবে পটভূমিতে আপনার নির্ভরতাগুলি সমাধান এবং ডাউনলোড করা শুরু করবে।

এরপরে, কিছু ইন-অ্যাপ সেটআপ সম্পাদন করুন:

  1. আপনার অ্যাপে, Firebase আমদানি করুন:

    সুইফট

    import Firebase

    উদ্দেশ্য গ

    @import Firebase;

আরও কয়েকটি কনফিগারেশন ধাপ, এবং আমরা যেতে প্রস্তুত:

  1. আপনি যদি ইতিমধ্যে আপনার প্রকল্পের জন্য ক্লাউড-ভিত্তিক API সক্রিয় না করে থাকেন তবে এখনই তা করুন:

    1. খুলুন Firebase এমএল API গুলি পৃষ্ঠা Firebase কনসোলের।
    2. যদি আপনি ইতিমধ্যে আলোকচ্ছটা মূল্যের পরিকল্পনা আপনার প্রকল্পের উন্নীত না করে থাকেন, তাই এ আপগ্রেড করুন এ ক্লিক করুন। (যদি আপনার প্রকল্পটি ব্লেজ প্ল্যানে না থাকে তবেই আপনাকে আপগ্রেড করার জন্য অনুরোধ করা হবে।)

      শুধুমাত্র ব্লেজ-স্তরের প্রকল্প ক্লাউড-ভিত্তিক API ব্যবহার করতে পারে।

    3. মেঘ-ভিত্তিক API গুলি ইতিমধ্যেই সক্ষম না হয় তাহলে, ক্লিক করুন মেঘ-ভিত্তিক API সক্ষম করুন।
  2. ক্লাউড ভিশন API-এ অ্যাক্সেসের অনুমতি না দেওয়ার জন্য আপনার বিদ্যমান Firebase API কীগুলি কনফিগার করুন:
    1. খুলুন শংসাপত্রের ক্লাউড কনসোলের পাতা।
    2. তালিকার প্রতিটি API কী জন্য, সম্পাদনা দৃশ্য খুলুন, এবং কী বিধিনিষেধ বিভাগে, লিস্টে ক্লাউড ভিশন এপিআই ব্যতীত প্রাপ্তিসাধ্য API গুলি সব যোগ করুন।

কলযোগ্য ফাংশন স্থাপন করুন

এরপরে, ক্লাউড ফাংশনটি স্থাপন করুন যা আপনি আপনার অ্যাপ এবং ক্লাউড ভিশন API ব্রিজ করতে ব্যবহার করবেন। functions-samples সংগ্রহস্থলের একটি উদাহরণ আপনি ব্যবহার করতে পারেন ধারণ করে।

ডিফল্টরূপে, এই ফাংশনের মাধ্যমে ক্লাউড ভিশন API অ্যাক্সেস করা শুধুমাত্র আপনার অ্যাপের প্রমাণীকৃত ব্যবহারকারীদের ক্লাউড ভিশন API-এ অ্যাক্সেসের অনুমতি দেবে। আপনি বিভিন্ন প্রয়োজনীয়তার জন্য ফাংশন পরিবর্তন করতে পারেন.

ফাংশন স্থাপন করতে:

  1. ক্লোন বা ডাউনলোড ফাংশন-নমুনার রেপো এবং পরিবর্তন vision-annotate-image ডিরেক্টরি:
    git clone https://github.com/firebase/functions-samples
    cd vision-annotate-image
    
  2. নির্ভরতা ইনস্টল করুন:
    cd functions
    npm install
    cd ..
    
  3. আপনি Firebase CLI না থাকে তাহলে, এটি ইনস্টল করুন
  4. একটি Firebase প্রকল্পের আরম্ভ vision-annotate-image ডিরেক্টরি। অনুরোধ করা হলে, তালিকায় আপনার প্রকল্প নির্বাচন করুন।
    firebase init
  5. ফাংশন স্থাপন করুন:
    firebase deploy --only functions:annotateImage

আপনার অ্যাপে Firebase Auth যোগ করুন

উপরে স্থাপিত কলযোগ্য ফাংশন আপনার অ্যাপের অ-প্রমাণিত ব্যবহারকারীদের যেকোনো অনুরোধ প্রত্যাখ্যান করবে। যদি আপনি ইতিমধ্যে এটি না করে থাকে, তাহলে আপনি করতে হবে আপনার অ্যাপ্লিকেশানে Firebase প্রমাণীকরণ যোগ করুন।

আপনার অ্যাপে প্রয়োজনীয় নির্ভরতা যোগ করুন

ফায়ারবেস লাইব্রেরির জন্য ক্লাউড ফাংশন ইনস্টল করতে সুইফট প্যাকেজ ম্যানেজার ব্যবহার করুন।

এখন আপনি চিত্রগুলিতে পাঠ্য সনাক্তকরণ শুরু করতে প্রস্তুত৷

1. ইনপুট ইমেজ প্রস্তুত করুন

ক্লাউড ভিশন কল করার জন্য, ছবিটি একটি বেস 64-এনকোডেড স্ট্রিং হিসাবে ফর্ম্যাট করা আবশ্যক৷ একটি প্রক্রিয়া করতে UIImage :

সুইফট

guard let imageData = uiImage.jpegData(compressionQuality: 1.0f) else { return }
let base64encodedImage = imageData.base64EncodedString()

উদ্দেশ্য গ

NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f);
NSString *base64encodedImage =
  [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];

2. টেক্সট সনাক্ত করতে কলযোগ্য ফাংশন আহ্বান করুন

একটি চিত্র পথনির্দেশক চিহ্নগুলি চিনতে, callable ফাংশন একটি ক্ষণস্থায়ী ডাকা তাদেরকে JSON ক্লাউড ভিশন অনুরোধ

  1. প্রথমে, ক্লাউড ফাংশনগুলির একটি উদাহরণ শুরু করুন:

    সুইফট

    lazy var functions = Functions.functions()
    

    উদ্দেশ্য গ

    @property(strong, nonatomic) FIRFunctions *functions;
    
  2. অনুরোধ তৈরি করুন. ক্লাউড ভিশন এপিআই দুই সমর্থন প্রকারভেদ : পাঠ্য সনাক্তকরণের TEXT_DETECTION এবং DOCUMENT_TEXT_DETECTION । দেখুন ক্লাউড ভিশন OCR করুন ডক্স দুই ব্যবহারের ক্ষেত্রে পার্থক্য জন্য।

    সুইফট

    let requestData = [
      "image": ["content": base64encodedImage],
      "features": ["type": "TEXT_DETECTION"],
      "imageContext": ["languageHints": ["en"]]
    ]
    

    উদ্দেশ্য গ

    NSDictionary *requestData = @{
      @"image": @{@"content": base64encodedImage},
      @"features": @{@"type": @"TEXT_DETECTION"},
      @"imageContext": @{@"languageHints": @[@"en"]}
    };
    
  3. অবশেষে, ফাংশনটি আহ্বান করুন:

    সুইফট

    functions.httpsCallable("annotateImage").call(requestData) { (result, error) in
      if let error = error as NSError? {
        if error.domain == FunctionsErrorDomain {
          let code = FunctionsErrorCode(rawValue: error.code)
          let message = error.localizedDescription
          let details = error.userInfo[FunctionsErrorDetailsKey]
        }
        // ...
      }
      // Function completed succesfully
    }
    

    উদ্দেশ্য গ

    [[_functions HTTPSCallableWithName:@"annotateImage"]
                              callWithObject:requestData
                                  completion:^(FIRHTTPSCallableResult * _Nullable result, NSError * _Nullable error) {
            if (error) {
              if (error.domain == FIRFunctionsErrorDomain) {
                FIRFunctionsErrorCode code = error.code;
                NSString *message = error.localizedDescription;
                NSObject *details = error.userInfo[FIRFunctionsErrorDetailsKey];
              }
              // ...
            }
            // Function completed succesfully
            // Get information about labeled objects
    
          }];
    

3. স্বীকৃত পাঠ্যের ব্লকগুলি থেকে পাঠ্য বের করুন

পাঠ্য স্বীকৃতির অপারেশন সফল হয়, তাহলে একটি JSON প্রতিক্রিয়া BatchAnnotateImagesResponse টাস্ক এর ফলাফলে ফেরত পাঠানো হবে। টেক্সট টীকা খুঁজে পাওয়া যেতে পারে fullTextAnnotation অবজেক্ট।

আপনি একটি স্ট্রিং হিসাবে স্বীকৃত টেক্সট পেতে পারেন text ক্ষেত্র। উদাহরণ স্বরূপ:

সুইফট

guard let annotation = (result?.data as? [String: Any])?["fullTextAnnotation"] as? [String: Any] else { return }
print("%nComplete annotation:")
let text = annotation["text"] as? String ?? ""
print("%n\(text)")

উদ্দেশ্য গ

NSDictionary *annotation = result.data[@"fullTextAnnotation"];
if (!annotation) { return; }
NSLog(@"\nComplete annotation:");
NSLog(@"\n%@", annotation[@"text"]);

আপনি চিত্রের অঞ্চলগুলির জন্য নির্দিষ্ট তথ্যও পেতে পারেন। প্রত্যেকের জন্য block , paragraph , word , এবং symbol হয়ে গেলে আপনি পাঠ্য অঞ্চলের স্বীকৃত এবং অঞ্চলের সীমান্তবর্তী স্থানাঙ্ক পেতে পারেন। উদাহরণ স্বরূপ:

সুইফট

guard let pages = annotation["pages"] as? [[String: Any]] else { return }
for page in pages {
var pageText = ""
guard let blocks = page["blocks"] as? [[String: Any]] else { continue }
for block in blocks {
    var blockText = ""
    guard let paragraphs = block["paragraphs"] as? [[String: Any]] else { continue }
    for paragraph in paragraphs {
    var paragraphText = ""
    guard let words = paragraph["words"] as? [[String: Any]] else { continue }
    for word in words {
        var wordText = ""
        guard let symbols = word["symbols"] as? [[String: Any]] else { continue }
        for symbol in symbols {
        let text = symbol["text"] as? String ?? ""
        let confidence = symbol["confidence"] as? Float ?? 0.0
        wordText += text
        print("Symbol text: \(text) (confidence: \(confidence)%n")
        }
        let confidence = word["confidence"] as? Float ?? 0.0
        print("Word text: \(wordText) (confidence: \(confidence)%n%n")
        let boundingBox = word["boundingBox"] as? [Float] ?? [0.0, 0.0, 0.0, 0.0]
        print("Word bounding box: \(boundingBox.description)%n")
        paragraphText += wordText
    }
    print("%nParagraph: %n\(paragraphText)%n")
    let boundingBox = paragraph["boundingBox"] as? [Float] ?? [0.0, 0.0, 0.0, 0.0]
    print("Paragraph bounding box: \(boundingBox)%n")
    let confidence = paragraph["confidence"] as? Float ?? 0.0
    print("Paragraph Confidence: \(confidence)%n")
    blockText += paragraphText
    }
    pageText += blockText
}

উদ্দেশ্য গ

for (NSDictionary *page in annotation[@"pages"]) {
  NSMutableString *pageText = [NSMutableString new];
  for (NSDictionary *block in page[@"blocks"]) {
    NSMutableString *blockText = [NSMutableString new];
    for (NSDictionary *paragraph in block[@"paragraphs"]) {
      NSMutableString *paragraphText = [NSMutableString new];
      for (NSDictionary *word in paragraph[@"words"]) {
        NSMutableString *wordText = [NSMutableString new];
        for (NSDictionary *symbol in word[@"symbols"]) {
          NSString *text = symbol[@"text"];
          [wordText appendString:text];
          NSLog(@"Symbol text: %@ (confidence: %@\n", text, symbol[@"confidence"]);
        }
        NSLog(@"Word text: %@ (confidence: %@\n\n", wordText, word[@"confidence"]);
        NSLog(@"Word bounding box: %@\n", word[@"boundingBox"]);
        [paragraphText appendString:wordText];
      }
      NSLog(@"\nParagraph: \n%@\n", paragraphText);
      NSLog(@"Paragraph bounding box: %@\n", paragraph[@"boundingBox"]);
      NSLog(@"Paragraph Confidence: %@\n", paragraph[@"confidence"]);
      [blockText appendString:paragraphText];
    }
    [pageText appendString:blockText];
  }
}