オーディオマーカーの状態とアクティビティ結果
Android 5.0.10、iOS 5.0.9、およびAndroid/iOS向けFlutter 0.3.5以降では、SDKが現在のオーディオマーカー状態と認識されたアクティビティとの関連付けを管理します。SORI Consoleのアプリケーションでオーディオマーカーを使用する場合に認識を有効にしてください。デフォルトでは無効です。
インストールと更新
現在のマーカーを表示する
SDKが通知する状態を画面に反映してください。認識が無効、待機中、識別情報が未確定のマーカー検出、識別済み、状態クリアを区別します。識別済みの状態にのみ、SORI Consoleが解決したオーディオマーカーのIDと名前が含まれます。未識別のマーカーを検出した際に、以前のマーカー名を再利用しないでください。
SDKは新しい検出がない場合、有効なマーカーの根拠を最大4秒間保持できますが、必ず4秒間表示するという保証ではありません。連続した未検出、低い入力レベル(low RMS)、無音、別の未識別マーカー、認識の停止・リセットなどの条件で状態がクリアまたは無効になることがあります。UIを再接続する際は現在のスナップショット(snapshot)を読むか、再購読してください。スナップショットの取得や遅延した応答の受信で保持期間が再開されることはありません。アプリ独自の失効タイマーは不要です。
対応するアクティビティを更新する
マーカーの根拠が有効な間、SDKは後続の素材認識リクエストのマーカー属性(trait.marker)を補完します。素材が先に認識され、そのマーカーが後から識別された場合、素材の再認識なしで同じアクティビティを更新できます。SDKが関連付けとサーバー更新を管理するため、アプリでマーカーtraitを構築したり独自の更新リクエストを送る必要はありません。
- SDKが提供する正確なアクティビティIDで結果を追加・更新してください。過去の結果への遅延更新も同じIDに反映します。現在のヘッダーのマーカーを最新の結果へ任意に関連付けないでください。
- 補完時は最初の認識時刻、位置、行の順序を保持してください。
- 現在のマーカーがクリアされても、過去のアクティビティに反映済みのマーカーは削除しません。遅延したアクティビティ結果が、そのマーカーを再び現在の状態にすることもありません。
- アクティビティ結果にキャンペーンが含まれない場合があります。キャンペーンの存在を前提にせず、利用可能な識別情報とマーカーフィールドを表示してください。
Android
SORIListenerを継承し、onAudioMarkerStateChangedとonActivityResultを使用してください。現在のスナップショットはsori.audioMarkerState(JavaではgetAudioMarkerState())で取得できます。ISORIListenerを直接実装する場合は、これらのコールバックを受け取るために任意のインターフェースISORIAudioMarkerStateListenerとISORIActivityResultListenerも実装してください。
import android.util.Log
import com.iplateia.sorisdk.SORIAudioMarkerState
import com.iplateia.sorisdk.SORIActivityResult
import com.iplateia.sorisdk.SORIListener
import com.iplateia.sorisdk.SORIConfig
sori.setConfig(SORIConfig(audiomarker = true))
sori.setListener(this, object : SORIListener() {
override fun onAudioMarkerStateChanged(state: SORIAudioMarkerState) {
// Render the current state; marker is null until identified.
Log.d("SORI", "${state.status}: ${state.marker?.name}")
}
override fun onActivityResult(result: SORIActivityResult) {
// Insert or update the row identified by result.activityId.
Log.d("SORI", "${result.activityId}: ${result.audioMarker?.name}")
}
})
val current = sori.audioMarkerStateiOS
recognizerの構成後にaudioMarkerStateHandlerとactivityResultHandlerを設定してください。スナップショットが必要な場合はcurrentAudioMarkerStateを読みます。ハンドラーからビューコントローラーを参照する場合は弱参照を使用してください。
recognizer.audiomarker = true
recognizer.audioMarkerStateHandler = { snapshot in
// Render the current state; audioMarker is nil until identified.
print(snapshot.state, snapshot.audioMarker?.name ?? "")
}
recognizer.activityResultHandler = { result in
// Insert or update the row identified by result.activityID.
print(result.activityID, result.audioMarker?.name ?? "")
}
let current = recognizer.currentAudioMarkerStateFlutter
AndroidとiOSではaudioMarkerStateChanged、activityResult、getCurrentAudioMarkerState()を使用してください。SORIRecognitionStateがSDKイベントを反映し、アクティビティIDごとに結果を管理するため、アプリはcurrentAudioMarkerとactivitiesを表示できます。
await recognizer.configure(
config: const SORIRecognitionConfig(audiomarker: true),
);
final markerView = SORIRecognitionState();
final markerSubscription = recognizer.events.listen((event) {
if (markerView.accept(event)) {
// Rebuild your UI from markerView.currentAudioMarker and
// markerView.activities. Each result keeps its own activityId.
}
});
final current = await recognizer.getCurrentAudioMarkerState();
if (current != null && markerView.acceptAudioMarkerState(current)) {
// Rebuild the current-marker UI from markerView.currentAudioMarker.
}UIのスコープを破棄する際はmarkerSubscriptionを解除してください。アクティビティIDを省略する旧サーバー向けに、既存のキャンペーンリスナーも保持してください。
互換性
既存の開始・停止フローとキャンペーン・検出コールバックは引き続き使用できます。新しい現在マーカーUIには上記の状態APIを使用してください。検出コールバックは失効通知ではありません。アクティビティIDを省略する旧サーバーでも既存のキャンペーンコールバックは利用できますが、正確なIDを持つ新しいアクティビティ結果は提供できません。
Flutter Webの既存の認識・イベント動作は維持されます。新しい現在状態、失効、独立した遅延マーカー更新の動作はAndroid/iOSに適用されます。WebではgetCurrentAudioMarkerState()がnullを返すため、マーカーが未検出であることの根拠には使用しないでください。
