Media Enhancement API を使ってみる

Media Enhancement API は、デバイス上の GPU アクセラレーションを使用して高品質かつ低レイテンシの画像拡張を行う強力なツールです。これには、自動トーン マッピング、ぼかし除去、ノイズ除去、アップスケーリングなどの機能が含まれます。

API を初期化する前に、プロジェクトの依存関係を構成し、マニフェストでハードウェア アクセラレーションの要件を宣言する必要があります。これらの構成をスキップすると、GLOBAL_INIT_FAILED ランタイム エラーの主な原因になります。

Gradle の依存関係

app/build.gradle.kts ファイルに次の依存関係を追加します。非同期のノンブロッキング実行を容易にするため、ハードウェア サーフェスの処理に Kotlin コルーチンと Jetpack Media3 を含めます。

dependencies {
    // Google Play services Media Enhancement Library (Beta)
    implementation("com.google.android.gms:play-services-media-effect-enhancement:16.0.0-beta04")
}

Google の Maven リポジトリで play-services-media-effect-enhancement のパッケージの詳細をご覧ください。

また、拡張セッションを非同期で管理するには、Kotlin コルーチンを使用することをおすすめします。

// Kotlin coroutines for asynchronous API handling
  implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3")
  implementation("org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.7.3")

Android マニフェストの要件

AndroidManifest.xml ファイルの <application> タグ内に次の要素を追加します。

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <application>
        <!-- 1. Google Play services version for runtime compatibility checks -->
        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />
        <!-- 2. Declare OpenCL compute libraries for NPU/GPU neural acceleration -->
        <uses-native-library android:name="libOpenCL.so" android:required="false" />
        <uses-native-library android:name="libOpenCL-car.so" android:required="false" />
        <uses-native-library android:name="libOpenCL-pixel.so" android:required="false" />
        <!-- 3. Declare OpenGL ES for high-performance graphics rendering -->
        <uses-native-library android:name="libGLESv2.so" android:required="false" />
        <uses-native-library android:name="libGLESv3.so" android:required="false" />
    </application>
</manifest>

OpenCL は、メディア エンハンスメント タスクで NPU と GPU のニューラル アクセラレーションを有効にするために必要なネイティブ コンピューティング ライブラリを提供します。マニフェストでこれらのライブラリを宣言することは、API がハードウェア アクセラレーションを活用するための前提条件です。これは、高品質で低レイテンシの拡張機能を実行するために不可欠です。OpenCL の詳細については、OpenCL の実装をご覧ください。

OpenGL ES は、メディア エンハンスメント出力の高性能レンダリングに必要なネイティブ グラフィック ライブラリを提供します。レンダリング パイプラインがハードウェア アクセラレーションされたサーフェスで処理されたメディアを効果的に表示できるようにするには、マニフェストでこれらのライブラリを宣言することが不可欠です。OpenGL については、OpenGL API ドキュメントの概要をご覧ください。

ボトルネックを防ぐため、Android レンダリング パイプラインはハードウェア アクセラレーションに対応している必要があります。API 14 以上を対象とするアプリではデフォルトで有効になっていますが、<activity> タグ内で android:hardwareAccelerated="true" を明示的に設定してください。

デバイスの互換性とモジュールのセットアップ

Google Play 開発者サービスは、初期 APK のストレージ容量を節約するために、機械学習モデルを動的に配信します。拡張機能を実行する前に、アプリは EnhancementClient を使用してハードウェア サポートを確認し、必要なモデルの重みがダウンロードされてローカルにキャッシュ保存されていることを確認する必要があります。この作業を行うのはデバイスごとに 1 回限りです。

suspendCancellableCoroutine を使用すると、タスクベースのクライアント コールバックを標準の Kotlin 停止関数でラップして、よりクリーンな順次実行を実現できます。

// Verifies if host hardware supports NPU/GPU acceleration
suspend fun EnhancementClient.isDeviceSupportedAsync(): Boolean = suspendCancellableCoroutine { continuation ->
    this.isDeviceSupported()
        .addOnSuccessListener { result -> continuation.resume(result) }
        .addOnFailureListener { exception -> continuation.resumeWithException(exception) }
}
// Verifies the presence of required neural network models
suspend fun EnhancementClient.isModuleInstalledAsync(): Boolean = suspendCancellableCoroutine { continuation ->
    this.isModuleInstalled()
        .addOnSuccessListener { result -> continuation.resume(result) }
        .addOnFailureListener { exception -> continuation.resumeWithException(exception) }
}