質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Google Cloud Platform

Google Cloud Platformは、Google社がクラウド上で提供しているサービス郡の総称です。エンドユーザー向けサービスと同様のインフラストラクチャーで運営されており、Webサイト開発から複雑なアプリ開発まで対応可能です。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

938閲覧

Firebaseを使って文字解析したい(swift)

onigiriZ

総合スコア3

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Google Cloud Platform

Google Cloud Platformは、Google社がクラウド上で提供しているサービス郡の総称です。エンドユーザー向けサービスと同様のインフラストラクチャーで運営されており、Webサイト開発から複雑なアプリ開発まで対応可能です。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2021/04/09 03:32

編集2021/04/09 05:18

やりたいこと

Firebaseの画像から文字を解析するサービスをXcodeから利用したいです。
公式のドキュメントが出ており、それ通りにやってみたのですが上手くいきません。
エラーも出ず、何が間違っているのかが分からないので質問させていただきます。

参考にしているドキュメント

作成したプロジェクトで手を加えた部分は以下になります。

ViewController

1import UIKit 2import FirebaseFunctions 3 4class ViewController: UIViewController { 5 6 lazy var functions = Functions.functions() 7 8 override func viewDidLoad() { 9 super.viewDidLoad() 10 // Do any additional setup after loading the view. 11 //UIImage(named: "sample1")は手書き文字の書かれた画像 12 guard let imageData = UIImage(named: "sample1")!.jpegData(compressionQuality: 1.0) else { return } 13 let base64encodedImage = imageData.base64EncodedString() 14 15 let requestData = [ 16 "image": ["content": base64encodedImage], 17 "features": ["type": "TEXT_DETECTION"], 18 "imageContext": ["languageHints": ["en"]] 19 ] 20 21 functions.httpsCallable("annotateImage").call(requestData) { (result, error) in 22 if let error = error as NSError? { 23 if error.domain == FunctionsErrorDomain { 24 let code = FunctionsErrorCode(rawValue: error.code) 25 let message = error.localizedDescription 26 let details = error.userInfo[FunctionsErrorDetailsKey] 27 } 28 // ... 29 } 30 // Function completed succesfully 31 guard let annotation = (result?.data as? [String: Any])?["fullTextAnnotation"] as? [String: Any] else { return } 32 print("%nComplete annotation:") 33 let text = annotation["text"] as? String ?? "" 34 print("%n(text)") 35 } 36 } 37} 38 39

AppDelegate

1import UIKit 2import Firebase 3 4@main 5class AppDelegate: UIResponder, UIApplicationDelegate { 6 7 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 8 // Override point for customization after application launch. 9 FirebaseApp.configure() 10 return true 11 } 12 13 // MARK: UISceneSession Lifecycle 14 15 func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { 16 // Called when a new scene session is being created. 17 // Use this method to select a configuration to create the new scene with. 18 return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) 19 } 20 21 func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) { 22 // Called when the user discards a scene session. 23 // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions. 24 // Use this method to release any resources that were specific to the discarded scenes, as they will not return. 25 } 26 27 28}

podfile

1# Uncomment the next line to define a global platform for your project 2platform :ios, ‘10.0’ 3 4target 'manjuutegaki' do 5 # Comment the next line if you don't want to use dynamic frameworks 6 use_frameworks! 7 8pod 'Firebase/Analytics' 9pod 'Firebase/Auth' 10pod 'Firebase/Firestore' 11pod 'Firebase/Functions' 12 13end

実行したところエラーは無く、正しく動けば画像から検出したテキストが出力されるはずなのですが、
コンソールには以下のメッセージのみ表示されます。

2021-04-09 11:53:37.293492+0900 manjuutegaki[3701:1867764] Metal API Validation Enabled

やったこと

基本的にはドキュメント通りに操作しましたが、
FirebaseとGCPのプロジェクト作成手順や、関数のデプロイに問題がある可能性があるので詳しく記載します。

1.GoogleCloudPlatformで新しいプロジェクトを作成する。
2.Firebaseで新しいプロジェクトを作成する(その際、先ほどGCPで作成したプロジェクトを選択し追加)
3.Firebaseの課金設定をBlazeに変更
4.Xcodeで新しいプロジェクトを作成し、FirebaseでそのxcodeプロジェクトのバンドルIDを入力し、アプリを登録
5.4の際にGoogleService-Info.plistをダウンロードし、xcodeに配置
6.GoogleCloudPlatformのプロジェクトの認証情報を開き、APIキーの編集から、APIキーの制限からcloudVisionAPIを選択
*ここでAPIキーにiOSkeyとBrowerkeyの2種類があるのが謎です。2種類とも↑の操作を行いました。
*制限なしにして実行してみましたが、結果は同じでした。
7.ドキュメントにあるfunctions-samplesを適当なフォルダにダウンロードしドキュメント通りのコマンドを実行
*ここでvision-annotate-imageがなく、vision-annotate-imagesならあるのですがドキュメントが間違っている?
8.firebase initコマンドを実行し、選択項目は◉ Hosting: Configure and deploy Firebase Hosting sites、
YES/NOはすべてNO、次にUse an existing project(多分これだったと思います、一番上の選択肢)→Firebaseのプロジェクトを選択
9.最後にfirebase deploy --only functions:annotateImageを実行

すべてエラーなどなく実行できています。
あとは、先述したコードを記述して実行した次第です。

上記の手順で間違っているところがないか、コードの部分でおかしなところがないかなど、
わかる方いましたら、よろしくお願いいたします。

開発環境

Xcode 12.4
Mac 11.2.3
iOS 14.4.2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2021/04/09 05:47

https://cloud.google.com/vision/docs/languages?hl=ja より、 > 手書き OCR 一般提供のリリースに伴い、DOCUMENT_TEXT_DETECTION を使用する場合、手書き文字の含まれた画像には手書き languageHints フラグが不要になりました。 ってことなので、TEXT_DETECTION だと手書き文字は対応してないのかも?
onigiriZ

2021/04/13 06:08

コメントありがとうございます。 確かに手書き文字は、TEXT_DETECTIONではなくDOCUMENT_TEXT_DETECTIONを使用するべきなようです。ですが、今回の問題の直接的な原因ではなかったようです。
guest

回答1

0

自己解決

firebaseを介さずに、直接googleCloudPlatformのvisionAPIを呼び出す形で解決しました。
import SwiftyJSON
import Alamofire を追加した上で、以下のコードを走らせると解析結果を表示できました。

//文字解析して表示 func mozikaiseki(image:UIImage){ let imageV = myimageview(image: image) imageV.setup(vc: self) self.view.addSubview(imageV) guard let imageData = image.pngData() else { return } let base64ImageString = imageData.base64EncodedString() let parameters = [ "requests": [ [ "image": [ "content": base64ImageString ], "features": [ [ "type": "DOCUMENT_TEXT_DETECTION" ] ] ] ] ] as [String : Any] let APIKey = "APIKEY" //通信 AF.request(URL(string: "https://vision.googleapis.com/v1/images:annotate?key=" + APIKEY)!, method: .post, parameters: parameters, encoding: JSONEncoding.default).responseJSON{(response) in switch(response.result){ case .success: let json:JSON = JSON(response.data as Any) let kaisekiStr = json["responses"][0]["fullTextAnnotation"]["text"] print(kaisekiStr) case .failure(let error): print(error) } } }

投稿2021/04/13 06:12

onigiriZ

総合スコア3

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問