このトピックでは、Content Moderation SDK for Go を使用して、動画の危険なコンテンツをモデレートする方法について説明します。
説明
動画モデレーション API は、同期と非同期の 2 つの検出メソッドを提供します。
同期動画モデレーションを使用する場合、モデレーションのために動画からキャプチャした一連のフレームのみを送信できます。関連するパラメーターの詳細については、「/green/video/syncscan」をご参照ください。
(推奨) 非同期動画モデレーションを使用する場合、モデレーションのために動画または動画からキャプチャした一連のフレームを送信できます。関連するパラメーターの詳細については、「/green/video/asyncscan および /green/video/results」をご参照ください。
SDK は公開されている動画 URL のみを受け付けます。ローカルファイルやバイナリデータは受け付けません。
長さが 2048 文字までのインターネット HTTP および HTTPS URL がサポートされています。
前提条件
(推奨) 非同期動画モデレーションタスクの送信
操作 | 説明 | サポートされているリージョン |
VideoAsyncScanRequest | ポルノ、テロリストのコンテンツ、広告、不適切なシーン、ロゴ検出など、複数のモデレーションシナリオで、動画の危険なコンテンツをモデレートするための非同期リクエストを送信します。 |
|
サンプルコード
動画モデレーションのために動画の URL を送信する
package main import ( "encoding/json" "fmt" "github.com/aliyun/alibaba-cloud-sdk-go/services/green" "strconv" ) func main() { /** * 注: インスタンス化されたクライアントを再利用して、検出パフォーマンスを向上させ、繰り返し接続を回避します。 * 環境変数を取得する一般的な方法: * RAM ユーザーの AccessKey ID を取得する: os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID") * RAM ユーザーの AccessKey Secret を取得する: os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET") */ client, _err := green.NewClientWithAccessKey( "cn-shanghai", "環境変数から RAM ユーザーの AccessKey ID を取得します", "環境変数から RAM ユーザーの AccessKey Secret を取得します") if err != nil { fmt.Println(err.Error()) return } task := map[string]interface{}{"dataId": "データ ID", "url": "モデレートする動画の URL"} // scenes: 検出シナリオ。複数のシナリオを指定できます。 // callback および seed パラメーターはオプションで、Webhook 通知に使用されます。 content, _ := json.Marshal( map[string]interface{}{ "tasks": [...]map[string]interface{}{task}, "scenes": [...]string{"porn", "terrorism"}, "bizType": "ビジネスシナリオ", "callback": "Webhook アドレス", "seed": "ランダムな文字列", }, ) request := green.CreateVideoAsyncScanRequest() request.SetContent(content) response, _err := client.VideoAsyncScan(request) if _err != nil { fmt.Println(_err.Error()) return } if response.GetHttpStatus() != 200 { fmt.Println("response not success. status:" + strconv.Itoa(response.GetHttpStatus())) } fmt.Println(response.GetHttpContentString()) }動画モデレーションのために動画ライブストリームを送信する
package main import ( "encoding/json" "fmt" "github.com/aliyun/alibaba-cloud-sdk-go/services/green" "strconv" ) func main() { /** * 注: インスタンス化されたクライアントを再利用して、検出パフォーマンスを向上させ、繰り返し接続を回避します。 * 環境変数を取得する一般的な方法: * RAM ユーザーの AccessKey ID を取得する: os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID") * RAM ユーザーの AccessKey Secret を取得する: os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET") */ client, _err := green.NewClientWithAccessKey( "cn-shanghai", "環境変数から RAM ユーザーの AccessKey ID を取得します", "環境変数から RAM ユーザーの AccessKey Secret を取得します") if err != nil { fmt.Println(err.Error()) return } // url パラメーターをストリーミング URL に設定します。 task := map[string]interface{}{"dataId": "データ ID", "url": "モデレートする動画の URL"} // scenes: 検出シナリオ。複数のシナリオを指定できます。 // callback および seed パラメーターはオプションで、Webhook 通知に使用されます。 content, _ := json.Marshal( map[string]interface{}{ "tasks": [...]map[string]interface{}{task}, "scenes": [...]string{"porn", "terrorism"}, "live": "true", "bizType": "ビジネスシナリオ", "callback": "Webhook アドレス", "seed": "ランダムな文字列", }, ) request := green.CreateVideoAsyncScanRequest() request.SetContent(content) response, _err := client.VideoAsyncScan(request) if _err != nil { fmt.Println(_err.Error()) return } if response.GetHttpStatus() != 200 { fmt.Println("response not success. status:" + strconv.Itoa(response.GetHttpStatus())) } fmt.Println(response.GetHttpContentString()) }動画の画像と音声の両方をモデレートするために、動画ライブストリームを送信する
package main import ( "encoding/json" "fmt" "github.com/aliyun/alibaba-cloud-sdk-go/services/green" "strconv" ) func main() { /** * 注: インスタンス化されたクライアントを再利用して、検出パフォーマンスを向上させ、繰り返し接続を回避します。 * 環境変数を取得する一般的な方法: * RAM ユーザーの AccessKey ID を取得する: os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID") * RAM ユーザーの AccessKey Secret を取得する: os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET") */ client, _err := green.NewClientWithAccessKey( "cn-shanghai", "環境変数から RAM ユーザーの AccessKey ID を取得します", "環境変数から RAM ユーザーの AccessKey Secret を取得します") if err != nil { fmt.Println(err.Error()) return } // url パラメーターをストリーミング URL に設定します。 task := map[string]interface{}{"dataId": "データ ID", "url": "モデレートする動画の URL"} // scenes: 検出シナリオ。複数のシナリオを指定できます。 // callback および seed パラメーターはオプションで、Webhook 通知に使用されます。 content, _ := json.Marshal( map[string]interface{}{ "tasks": [...]map[string]interface{}{task}, "scenes": [...]string{"porn", "terrorism"}, "live": "true", "audioScenes": [...]string{"antispam"}, "bizType": "ビジネスシナリオ", "callback": "Webhook アドレス", "seed": "ランダムな文字列", }, ) request := green.CreateVideoAsyncScanRequest() request.SetContent(content) response, _err := client.VideoAsyncScan(request) if _err != nil { fmt.Println(_err.Error()) return } if response.GetHttpStatus() != 200 { fmt.Println("response not success. status:" + strconv.Itoa(response.GetHttpStatus())) } fmt.Println(response.GetHttpContentString()) }
非同期動画モデレーションの結果のクエリ
操作 | 説明 | サポートされているリージョン |
VideoAsyncScanResultsRequest | 非同期動画モデレーションの結果をクエリします。 説明 この操作を呼び出してモデレーション結果をポーリングする代わりに、非同期動画モデレーションタスクを送信するときに callback パラメーターを設定してモデレーション結果を受信することをお勧めします。 |
|
サンプルコード
package main
import (
"encoding/json"
"fmt"
"github.com/aliyun/alibaba-cloud-sdk-go/services/green"
"strconv"
)
func main() {
/**
* 注: インスタンス化されたクライアントを再利用して、検出パフォーマンスを向上させ、繰り返し接続を回避します。
* 環境変数を取得する一般的な方法:
* RAM ユーザーの AccessKey ID を取得する: os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")
* RAM ユーザーの AccessKey Secret を取得する: os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")
*/
client, _err := green.NewClientWithAccessKey(
"cn-shanghai",
"環境変数から RAM ユーザーの AccessKey ID を取得します",
"環境変数から RAM ユーザーの AccessKey Secret を取得します")
if err != nil {
fmt.Println(err.Error())
return
}
content, _ := json.Marshal(
[...]string{"非同期動画モデレーションタスクのタスク ID"},
)
request := green.CreateVideoAsyncScanResultsRequest()
request.SetContent(content)
response, _err := client.VideoAsyncScanResults(request)
if _err != nil {
fmt.Println(_err.Error())
return
}
if response.GetHttpStatus() != 200 {
fmt.Println("response not success. status:" + strconv.Itoa(response.GetHttpStatus()))
}
fmt.Println(response.GetHttpContentString())
}ビデオスナップショットの同期チェック
操作 | 説明 | サポートされているリージョン |
VideoSyncScanRequest | 危険なコンテンツについて動画をモデレートするための同期リクエストを送信します。 説明 動画モデレーションのために、動画からキャプチャされた一連のフレームのみを送信できます。他の種類の動画を送信するには、VideoAsyncScanRequest 操作を使用することをお勧めします。 |
|
サンプルコード
この例では、動画からキャプチャされた一連のフレームがモデレートされます。
package main
import (
"encoding/json"
"fmt"
"github.com/aliyun/alibaba-cloud-sdk-go/services/green"
"strconv"
)
func main() {
/**
* 注: インスタンス化されたクライアントを再利用して、検出パフォーマンスを向上させ、繰り返し接続を回避します。
* 環境変数を取得する一般的な方法:
* RAM ユーザーの AccessKey ID を取得する: os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")
* RAM ユーザーの AccessKey Secret を取得する: os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")
*/
client, _err := green.NewClientWithAccessKey(
"cn-shanghai",
"環境変数から RAM ユーザーの AccessKey ID を取得します",
"環境変数から RAM ユーザーの AccessKey Secret を取得します")
if err != nil {
fmt.Println(err.Error())
return
}
frame1 := map[string]interface{}{
"offset": "0", "url": "動画スナップショット 1 の URL",
}
frame2 := map[string]interface{}{
"offset": "5", "url": "動画スナップショット 2 の URL",
}
frame3 := map[string]interface{}{
"offset": "10", "url": "動画スナップショット 3 の URL",
}
// frames: スナップショット情報。
task := map[string]interface{}{"dataId": "データ ID", "frames": [...]map[string]interface{}{frame1, frame2, frame3}}
// scenes: 検出シナリオ。複数のシナリオを指定できます。
content, _ := json.Marshal(
map[string]interface{}{
"tasks": [...]map[string]interface{}{task}, "scenes": [...]string{"porn", "terrorism"},
"bizType": "ビジネスシナリオ",
},
)
request := green.CreateVideoSyncScanRequest()
request.SetContent(content)
response, _err := client.VideoSyncScan(request)
if _err != nil {
fmt.Println(_err.Error())
return
}
if response.GetHttpStatus() != 200 {
fmt.Println("response not success. status:" + strconv.Itoa(response.GetHttpStatus()))
}
fmt.Println(response.GetHttpContentString())
}モデレーション結果に関するフィードバックの提供
モデレーション結果が期待どおりでない場合は、VideoFeedbackRequest 操作を呼び出して結果を修正できます。Content Moderation は、フィードバックに基づいて、モデレートされた動画フレームを類似画像のブラックリストまたはホワイトリストに追加します。類似の動画フレームをモデレーションのために送信すると、Content Moderation はフィードバックのラベルに基づいてモデレーション結果を返します。
詳細については、「検出結果のフィードバック」をご参照ください。
インターフェイス | 説明 | サポートされているリージョン |
VideoFeedbackRequest | 動画モデレーションの結果に関するフィードバックを提供し、フィードバックに基づいて機械支援によるモデレーション結果を修正します。 |
|
サンプルコード
package main
import (
"encoding/json"
"fmt"
"github.com/aliyun/alibaba-cloud-sdk-go/services/green"
"strconv"
)
func main() {
/**
* 注: インスタンス化されたクライアントを再利用して、検出パフォーマンスを向上させ、繰り返し接続を回避します。
* 環境変数を取得する一般的な方法:
* RAM ユーザーの AccessKey ID を取得する: os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")
* RAM ユーザーの AccessKey Secret を取得する: os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")
*/
client, _err := green.NewClientWithAccessKey(
"cn-shanghai",
"環境変数から RAM ユーザーの AccessKey ID を取得します",
"環境変数から RAM ユーザーの AccessKey Secret を取得します")
if err != nil {
fmt.Println(err.Error())
return
}
frame1 := map[string]interface{}{"url": "モデレートされた動画スナップショット 1 の URL", "offset": "オフセット 1 の UNIX タイムスタンプ"}
frame2 := map[string]interface{}{"url": "モデレートされた動画スナップショット 2 の URL", "offset": "オフセット 2 の UNIX タイムスタンプ"}
frames := [...]map[string]interface{}{frame1, frame2}
// scenes: 検出シナリオ。複数のシナリオを指定できます。
// suggestion: 期待される検出結果。pass: コンテンツは正常です。block: コンテンツには違反が含まれています。
content, _ := json.Marshal(
map[string]interface{}{
"taskId": "動画モデレーションタスク ID", "dataId": "データ ID", "url": "動画 URL", "frames": frames,
"suggestion": "block", "scenes": [...]string{"ad", "terrorism"}, "note": "注",
},
)
request := green.CreateVideoFeedbackRequest()
request.SetContent(content)
response, err := client.VideoFeedback(request)
if err != nil {
fmt.Println(err.Error())
return
}
if response.GetHttpStatus() != 200 {
fmt.Println("response not success. status:" + strconv.Itoa(response.GetHttpStatus()))
}
fmt.Println(response.GetHttpContentString())
}