Menganalisis konten video untuk materi yang tidak pantas di C#

Artikel ini menyediakan informasi dan sampel kode untuk membantu Anda mulai menggunakan SDK Content Moderator untuk .NET guna memindai konten video untuk konten dewasa atau agak cabul.

Jika Anda tidak memiliki langganan Azure, buat akun gratis sebelum Anda memulai.

Prasyarat

Menyiapkan sumber daya Azure

Kemampuan moderasi video Content Moderator tersedia sebagai prosesor media pratinjau publik gratis di Azure Media Services (AMS). Azure Media Services adalah layanan Azure khusus untuk menyimpan dan streaming konten video.

Membuat akun Azure Media Services

Ikuti petunjuk dalam Membuat akun Azure Media Services untuk berlangganan AMS dan membuat akun penyimpanan Azure terkait. Dalam akun penyimpanan tersebut, buat kontainer penyimpanan Blob baru.

Membuat aplikasi Microsoft Entra

Navigasi ke langganan AMS baru Anda di portal Azure dan pilih akses API dari menu samping. Pilih Sambungkan ke Azure Media Services dengan perwakilan layanan. Perhatikan nilai di bidang titik akhir REST API; Anda akan memerlukan ini nanti.

Di bagian aplikasi Microsoft Entra, pilih Buat Baru dan beri nama pendaftaran aplikasi Microsoft Entra baru Anda (misalnya, "VideoModADApp"). Pilih Simpan dan tunggu beberapa menit saat aplikasi dikonfigurasi. Kemudian, Anda akan melihat pendaftaran aplikasi baru di bawah bagian aplikasi Microsoft Entra di halaman.

Pilih pendaftaran aplikasi Anda dan klik tombol Kelola aplikasi di bawahnya. Catat nilai di bidang ID Aplikasi; Anda akan memerlukan ini nanti. Pilih Pengaturan>Kunci, dan masukkan deskripsi untuk kunci baru (seperti "VideoModKey"). Pilih Simpan, lalu perhatikan nilai kunci baru. Salin string ini dan simpan di tempat yang aman.

Untuk panduan yang lebih menyeluruh tentang proses di atas, Lihat Mulai menggunakan autentikasi Microsoft Entra.

Setelah melakukan ini, Anda dapat menggunakan prosesor media moderasi video dengan dua cara berbeda.

Menggunakan Azure Media Services Explorer

Azure Media Services Explorer adalah frontend yang ramah pengguna untuk AMS. Gunakan untuk menelusuri akun AMS Anda, mengunggah video, dan memindai konten dengan prosesor media Content Moderator. Unduh dan instal dari GitHub, atau lihat posting blog Azure Media Services Explorer untuk mengetahui informasi selengkapnya.

Azure Media Services explorer with Content Moderator

Membuat proyek Visual Studio

  1. Di Visual Studio, buat proyek Aplikasi konsol (.NET Framework) baru dan beri nama VideoModeration.
  2. Jika ada proyek lain dalam solusi Anda, pilih ini sebagai proyek startup tunggal.
  3. Dapatkan paket NuGet yang diperlukan. Klik kanan proyek Anda di Penjelajah Solusi dan pilih Kelola Paket NuGet; lalu temukan dan instal paket berikut:
    • windowsazure.mediaservices
    • windowsazure.mediaservices.extensions

Menambahkan kode moderasi video

Selanjutnya, Anda akan menyalin dan menempelkan kode dari panduan ini ke dalam proyek Anda untuk mengimplementasikan skenario moderasi konten dasar.

Memperbarui program menggunakan pernyataan

Tambahkan pernyataan using berikut ke bagian atas file Program.cs Anda.

using System;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.WindowsAzure.MediaServices.Client;
using System.IO;
using System.Threading;
using Microsoft.WindowsAzure.Storage.Blob;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Auth;
using System.Collections.Generic;

Menyiapkan referensi sumber daya

Tambahkan bidang statis berikut ke kelas Program di Program.cs. Bidang ini menyimpan informasi yang diperlukan untuk menyambungkan ke langganan AMS Anda. Isi dengan nilai yang Anda dapatkan dalam langkah-langkah di atas. Perhatikan bahwa CLIENT_ID adalah nilai ID Aplikasi aplikasi Microsoft Entra Anda, dan CLIENT_SECRET merupakan nilai "VideoModKey" yang Anda buat untuk aplikasi tersebut.

// declare constants and globals
private static CloudMediaContext _context = null;
private static CloudStorageAccount _StorageAccount = null;

// Azure Media Services (AMS) associated Storage Account, Key, and the Container that has
// a list of Blobs to be processed.
static string STORAGE_NAME = "YOUR AMS ASSOCIATED BLOB STORAGE NAME";
static string STORAGE_KEY = "YOUR AMS ASSOCIATED BLOB STORAGE KEY";
static string STORAGE_CONTAINER_NAME = "YOUR BLOB CONTAINER FOR VIDEO FILES";

private static StorageCredentials _StorageCredentials = null;

// Azure Media Services authentication.
private const string AZURE_AD_TENANT_NAME = "microsoft.onmicrosoft.com";
private const string CLIENT_ID = "YOUR CLIENT ID";
private const string CLIENT_SECRET = "YOUR CLIENT SECRET";

// REST API endpoint, for example "https://accountname.restv2.westcentralus.media.azure.net/API".
private const string REST_API_ENDPOINT = "YOUR API ENDPOINT";

// Content Moderator Media Processor Nam
private const string MEDIA_PROCESSOR = "Azure Media Content Moderator";

// Input and Output files in the current directory of the executable
private const string INPUT_FILE = "VIDEO FILE NAME";
private const string OUTPUT_FOLDER = "";

// JSON settings file
private static readonly string CONTENT_MODERATOR_PRESET_FILE = "preset.json";

Penting

Ingatlah untuk menghapus kunci dari kode setelah selesai dan jangan pernah mempostingnya secara publik. Untuk produksi, gunakan cara yang aman untuk menyimpan dan mengakses kredensial Anda seperti Azure Key Vault. Lihat artikel keamanan layanan Azure AI untuk informasi selengkapnya.

Jika Anda ingin menggunakan file video lokal (kasus paling sederhana), tambahkan ke proyek dan masukkan jalurnya sebagai nilai INPUT_FILE (jalur relatif bersifat relatif terhadap direktori eksekusi).

Anda juga perlu membuat file preset.json di direktori saat ini dan menggunakannya untuk menentukan nomor versi. Contohnya:

{
    "version": "2.0"
}

Memuat video input

Metode Utama kelas Program akan membuat Azure Media Context dan kemudian Azure Storage Context (jika video Anda berada dalam penyimpanan blob). Kode yang tersisa memindai video dari folder lokal, blob, atau beberapa blob dalam kontainer penyimpanan Azure. Anda dapat mencoba semua opsi dengan mengomentari baris kode lainnya.

// Create Azure Media Context
CreateMediaContext();

// Create Storage Context
CreateStorageContext();

// Use a file as the input.
IAsset asset = CreateAssetfromFile();

// -- OR ---

// Or a blob as the input
// IAsset asset = CreateAssetfromBlob((CloudBlockBlob)GetBlobsList().First());

// Then submit the asset to Content Moderator
RunContentModeratorJob(asset);

//-- OR ----

// Just run the content moderator on all blobs in a list (from a Blob Container)
// RunContentModeratorJobOnBlobs();

Membuat Azure Media Context

Tambahkan metode berikut ke kelas Program. Ini menggunakan info masuk AMS Anda untuk memungkinkan komunikasi dengan AMS.

// Creates a media context from azure credentials
static void CreateMediaContext()
{
    // Get Azure AD credentials
    var tokenCredentials = new AzureAdTokenCredentials(AZURE_AD_TENANT_NAME,
        new AzureAdClientSymmetricKey(CLIENT_ID, CLIENT_SECRET),
        AzureEnvironments.AzureCloudEnvironment);

    // Initialize an Azure AD token
    var tokenProvider = new AzureAdTokenProvider(tokenCredentials);

    // Create a media context
    _context = new CloudMediaContext(new Uri(REST_API_ENDPOINT), tokenProvider);
}

Menambahkan kode untuk membuat Azure Storage Context

Tambahkan metode berikut ke kelas Program. Anda menggunakan Storage Context, yang dibuat dari info masuk penyimpanan Anda, untuk mengakses penyimpanan blob Anda.

// Creates a storage context from the AMS associated storage name and key
static void CreateStorageContext()
{
    // Get a reference to the storage account associated with a Media Services account.
    if (_StorageCredentials == null)
    {
        _StorageCredentials = new StorageCredentials(STORAGE_NAME, STORAGE_KEY);
    }
    _StorageAccount = new CloudStorageAccount(_StorageCredentials, false);
}

Menambahkan kode untuk membuat Azure Media Assets dari file lokal dan blob

Prosesor media Content Moderator menjalankan pekerjaan pada Aset dalam platform Azure Media Services. Metode ini membuat Aset dari file lokal atau blob terkait.

// Creates an Azure Media Services Asset from the video file
static IAsset CreateAssetfromFile()
{
    return _context.Assets.CreateFromFile(INPUT_FILE, AssetCreationOptions.None); ;
}

// Creates an Azure Media Services asset from your blog storage
static IAsset CreateAssetfromBlob(CloudBlockBlob Blob)
{
    // Create asset from the FIRST blob in the list and return it
    return _context.Assets.CreateFromBlob(Blob, _StorageCredentials, AssetCreationOptions.None);
}

Menambahkan kode untuk memindai koleksi video (sebagai blob) dalam kontainer

// Runs the Content Moderator Job on all Blobs in a given container name
static void RunContentModeratorJobOnBlobs()
{
    // Get the reference to the list of Blobs. See the following method.
    var blobList = GetBlobsList();

    // Iterate over the Blob list items or work on specific ones as needed
    foreach (var sourceBlob in blobList)
    {
        // Create an Asset
        IAsset asset = _context.Assets.CreateFromBlob((CloudBlockBlob)sourceBlob,
                            _StorageCredentials, AssetCreationOptions.None);
        asset.Update();

        // Submit to Content Moderator
        RunContentModeratorJob(asset);
    }
}

// Get all blobs in your container
static IEnumerable<IListBlobItem> GetBlobsList()
{
    // Get a reference to the Container within the Storage Account
    // that has the files (blobs) for moderation
    CloudBlobClient CloudBlobClient = _StorageAccount.CreateCloudBlobClient();
    CloudBlobContainer MediaBlobContainer = CloudBlobClient.GetContainerReference(STORAGE_CONTAINER_NAME);

    // Get the reference to the list of Blobs
    var blobList = MediaBlobContainer.ListBlobs();
    return blobList;
}

Menambahkan metode untuk menjalankan Pekerjaan Content Moderator

// Run the Content Moderator job on the designated Asset from local file or blob storage
static void RunContentModeratorJob(IAsset asset)
{
    // Grab the presets
    string configuration = File.ReadAllText(CONTENT_MODERATOR_PRESET_FILE);

    // grab instance of Azure Media Content Moderator MP
    IMediaProcessor mp = _context.MediaProcessors.GetLatestMediaProcessorByName(MEDIA_PROCESSOR);

    // create Job with Content Moderator task
    IJob job = _context.Jobs.Create(String.Format("Content Moderator {0}",
            asset.AssetFiles.First() + "_" + Guid.NewGuid()));

    ITask contentModeratorTask = job.Tasks.AddNew("Adult and racy classifier task",
            mp, configuration,
            TaskOptions.None);
    contentModeratorTask.InputAssets.Add(asset);
    contentModeratorTask.OutputAssets.AddNew("Adult and racy classifier output",
        AssetCreationOptions.None);

    job.Submit();


    // Create progress printing and querying tasks
    Task progressPrintTask = new Task(() =>
    {
        IJob jobQuery = null;
        do
        {
            var progressContext = _context;
            jobQuery = progressContext.Jobs
            .Where(j => j.Id == job.Id)
                .First();
                Console.WriteLine(string.Format("{0}\t{1}",
                DateTime.Now,
                jobQuery.State));
                Thread.Sleep(10000);
            }
            while (jobQuery.State != JobState.Finished &&
            jobQuery.State != JobState.Error &&
            jobQuery.State != JobState.Canceled);
    });
    progressPrintTask.Start();

    Task progressJobTask = job.GetExecutionProgressTask(
    CancellationToken.None);
    progressJobTask.Wait();

    // If job state is Error, the event handling
    // method for job progress should log errors.  Here we check
    // for error state and exit if needed.
    if (job.State == JobState.Error)
    {
        ErrorDetail error = job.Tasks.First().ErrorDetails.First();
        Console.WriteLine(string.Format("Error: {0}. {1}",
        error.Code,
        error.Message));
    }

    DownloadAsset(job.OutputMediaAssets.First(), OUTPUT_FOLDER);
}

Menambahkan fungsi pembantu

Metode ini mengunduh file output (JSON) Content Moderator dari aset Azure Media Services, dan membantu melacak status pekerjaan moderasi sehingga program dapat mencatat status yang berjalan ke konsol.

static void DownloadAsset(IAsset asset, string outputDirectory)
{
    foreach (IAssetFile file in asset.AssetFiles)
    {
        file.Download(Path.Combine(outputDirectory, file.Name));
    }
}

// event handler for Job State
static void StateChanged(object sender, JobStateChangedEventArgs e)
{
    Console.WriteLine("Job state changed event:");
    Console.WriteLine("  Previous state: " + e.PreviousState);
    Console.WriteLine("  Current state: " + e.CurrentState);
    switch (e.CurrentState)
    {
        case JobState.Finished:
            Console.WriteLine();
            Console.WriteLine("Job finished.");
            break;
        case JobState.Canceling:
        case JobState.Queued:
        case JobState.Scheduled:
        case JobState.Processing:
            Console.WriteLine("Please wait...\n");
            break;
        case JobState.Canceled:
            Console.WriteLine("Job is canceled.\n");
            break;
        case JobState.Error:
            Console.WriteLine("Job failed.\n");
            break;
        default:
            break;
    }
}

Menjalankan program dan meninjau output

Setelah pekerjaan Content Moderation selesai, analisis respons JSON. Ini terdiri dari elemen-elemen ini:

  • Ringkasan informasi video
  • Tangkapan sebagai "fragments"
  • Bingkai utama seabagi "events" dengan bendera reviewRecommended" (= true atau false)" berdasarkan skor Dewasa dan Cabul
  • start, duration, totalDuration, dan timestamp ada di "ticks". Bagi menurut skala waktu untuk mendapatkan angka dalam detik.

Catatan

  • adultScore mewakili potensi kehadiran dan prediksi skor konten yang mungkin dianggap eksplisit secara seksual atau dewasa dalam situasi tertentu.
  • racyScore mewakili potensi kehadiran dan prediksi skor konten yang mungkin dianggap sugestif secara seksual atau dewasa dalam situasi tertentu.
  • adultScore dan racyScore adalah antara 0 dan 1. Semakin tinggi skor, semakin tinggi model memprediksi bahwa kategori mungkin berlaku. Pratinjau ini bergantung pada model statistik daripada hasil yang dikodekan secara manual. Kami merekomendasikan pengujian dengan konten Anda sendiri untuk menentukan bagaimana setiap kategori sesuai dengan kebutuhan Anda.
  • reviewRecommended benar atau salah tergantung pada ambang skor internal. Pelanggan harus menilai apakah akan menggunakan nilai ini atau memutuskan ambang kustom berdasarkan kebijakan konten mereka.
{
"version": 2,
"timescale": 90000,
"offset": 0,
"framerate": 50,
"width": 1280,
"height": 720,
"totalDuration": 18696321,
"fragments": [
{
    "start": 0,
    "duration": 18000
},
{
    "start": 18000,
    "duration": 3600,
    "interval": 3600,
    "events": [
    [
        {
        "reviewRecommended": false,
        "adultScore": 0.00001,
        "racyScore": 0.03077,
        "index": 5,
        "timestamp": 18000,
        "shotIndex": 0
        }
    ]
    ]
},
{
    "start": 18386372,
    "duration": 119149,
    "interval": 119149,
    "events": [
    [
        {
        "reviewRecommended": true,
        "adultScore": 0.00000,
        "racyScore": 0.91902,
        "index": 5085,
        "timestamp": 18386372,
        "shotIndex": 62
        }
    ]
    ]
}
]
}

Langkah berikutnya

Unduh solusi Visual Studio untuk ini dan mulai cepat Content Moderator lainnya untuk .NET.