Skip to content

実装

認識の開始

まず、使用する場所でSORIフレームワークをインポートする必要があります。

swift
import SORI

SORIManagerクラスのstartメソッドで簡単に開始できます。このメソッドは内蔵のオーディオレコーダーで動作します。以下に例を示します:

swift
SORIManager.shared().applicationID = "application ID string"
SORIManager.shared().secretKey = "secret key string"
SORIManager.shared().apiVersion = .V3
SORIManager.shared().resultType = .local

SORIManager.shared().start(
  type: .local
  repeat: true,
  recognitionHandler: {
    [unowned self] (media, error) in
    self.recognized(mediaJSON: media as? [String : Any], error: error)
  })
)

録音されたオーディオはどこにも送信されないため、プライバシーの懸念は全くありません。

認識結果のデータ構造

以下は、レスポンスで受信するデータ構造の例です。

json
{
  "position": 3187,
  "campaign": {
    "_id": "campaign identifier",
    "action_url": "https://foo.bar/action/url",
    "created_at": "2023-01-01T00:00:48.187000+00:00",
    "image": "https://foo.bar/image.jpg",
    "name": "campaign name",
    "operating_period": {
        "start": "2023-01-01T01:01:10.610000+00:00",
        "until": "2024-12-31T12:59:59.999000+00:00",
    },
    "state": "pending",
    "title": "campaign title",
    "type": "link"
  },
  "_id": "material identifier",
  "duration": 29.375,
  "type": "cf",
  "image": "https://foo.bar/material/cover/image.png",
  "score": -32.84499943256378,
  "title": "material title"
}

認識の停止

SORIManagerクラスのstopメソッドで停止できます。オーディオレコーダーも動作を停止します。

swift
SORIManager.shared().stop()

バックグラウンド認識

バックグラウンド認識が必要ですか?アプリのInfo.plistを開いてください。キーUIBackgroundModesを追加し、値audioのアイテムを追加します。以下に例を示します:

xml
<key>UIBackgroundModes</key>
<array>
    <string>fetch</string>
    <string>remote-notification</string>
    <string>audio</string>
</array>

バックグラウンド認識は、アプリが開始されて実行中に動作します。逆に、アプリが終了すると、バックグラウンド認識も停止します。

エラーハンドリング

SORI SDKの認識プロセスはすべて非メインスレッドで実行されるため、このプロセス中に発生するすべてのエラーは通知を通じて配信されます。この通知を受信するために、NotificationCenterを通じてSORIError.errorNotificationName()の通知を監視できます。

swift
NotificationCenter.default.addObserver(forName: SORIError.errorNotificationName(), object: nil, queue: OperationQueue.main) { notification in
    // SORIエラーの処理
    guard let error = notification.object as? NSError, let code = SORIErrorCode(rawValue: error.code) else {
        print("Unknown error notification: \(notification)")
        return
    }

    if code == .authenticationFailure {
        print("Failed to authentication")
    }
}

SORIErrorCodeは以下のように定義されています:

swift
enum SORIErrorCode: Int {
    case .none = 0
    case .beginInterruption = 100
    case .finishInterruption = 101
    case .networkNotReachable = 400
    case .authenticationFailure = 401
    case .audioRecordDenied = 402
    case .serverError = 500
    case .audioServiceFailure = 501
    case .fileOperationFailure = 502
    case .invalidResponses = 503
    case .failedToDownloadAudiopacks = 504
}
objective-c
typedef NS_ENUM(NSInteger, SORIErrorCode) {
    SORIErrorCodeNone = 0,
    SORIErrorCodeBeginInterruption = 100,
    SORIErrorCodeFinishInterruption = 101,
    SORIErrorCodeNetworkNotReachable = 400,
    SORIErrorCodeAuthenticationFailure = 401,
    SORIErrorCodeAudioRecordDenied = 402,
    SORIErrorCodeServerError = 500,
    SORIErrorCodeAudioServiceFailure = 501,
    SORIErrorCodeFileOperationFailure = 502,
    SORIErrorCodeInvalidResponses = 503,
    SORIErrorCodeFailedToDownloadAudiopacks = 504,
};