このトピックでは、Go 用の Content Moderation SDK を使用して、動画の危険なコンテンツをモデレートする方法について説明します。
説明
Go 用 Content Moderation SDK は、同期および非同期ビデオモデレーションの両方をサポートしています。
同期ビデオモデレーションを使用する場合、ビデオからキャプチャされた一連のフレームのみをモデレーションのために送信できます。 関連パラメータの詳細については、「/green/video/syncscan」をご参照ください。
(推奨) 非同期ビデオモデレーションを使用する場合、ビデオまたはビデオからキャプチャされた一連のフレームをモデレーションのために送信できます。 関連パラメータの詳細については、「/green/video/asyncscan and /green/video/results」をご参照ください。
前提条件
(推奨) 非同期ビデオモデレーションタスクを送信する
操作 | 説明 | サポートされているリージョン |
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 シークレットを取得する: os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET") */ client, _err := green.NewClientWithAccessKey( "cn-shanghai", "RAM ユーザーの AccessKey ID を環境変数から取得することをお勧めします", "RAM ユーザーの AccessKey シークレットを環境変数から取得することをお勧めします") if err != nil { fmt.Println(err.Error()) return } task := map[string]interface{}{"dataId": "モデレートされるビデオの ID", "url": "モデレートされるビデオの URL"} // scenes: モデレーションシナリオ。 1 つ以上のモデレーションシナリオを指定できます。 // callback and seed: これら 2 つのパラメータはオプションであり、コールバック通知を設定するために使用されます。 content, _ := json.Marshal( map[string]interface{}{ "tasks": [...]map[string]interface{}{task}, "scenes": [...]string{"porn", "terrorism"}, "bizType": "ビジネスシナリオ", "callback": "コールバック URL", "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 シークレットを取得する: os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET") */ client, _err := green.NewClientWithAccessKey( "cn-shanghai", "RAM ユーザーの AccessKey ID を環境変数から取得することをお勧めします", "RAM ユーザーの AccessKey シークレットを環境変数から取得することをお勧めします") if err != nil { fmt.Println(err.Error()) return } // url パラメータをライブストリームの URL に設定します。 task := map[string]interface{}{"dataId": "モデレートされるビデオの ID", "url": "モデレートされるビデオの URL"} // scenes: モデレーションシナリオ。 1 つ以上のモデレーションシナリオを指定できます。 // callback and seed: これら 2 つのパラメータはオプションであり、コールバック通知を設定するために使用されます。 content, _ := json.Marshal( map[string]interface{}{ "tasks": [...]map[string]interface{}{task}, "scenes": [...]string{"porn", "terrorism"}, "live": "true", "bizType": "ビジネスシナリオ", "callback": "コールバック URL", "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 シークレットを取得する: os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET") */ client, _err := green.NewClientWithAccessKey( "cn-shanghai", "RAM ユーザーの AccessKey ID を環境変数から取得することをお勧めします", "RAM ユーザーの AccessKey シークレットを環境変数から取得することをお勧めします") if err != nil { fmt.Println(err.Error()) return } // url パラメータをライブストリームの URL に設定します。 task := map[string]interface{}{"dataId": "モデレートされるビデオの ID", "url": "モデレートされるビデオの URL"} // scenes: モデレーションシナリオ。 1 つ以上のモデレーションシナリオを指定できます。 // callback and seed: これら 2 つのパラメータはオプションであり、コールバック通知を設定するために使用されます。 content, _ := json.Marshal( map[string]interface{}{ "tasks": [...]map[string]interface{}{task}, "scenes": [...]string{"porn", "terrorism"}, "live": "true", "audioScenes": [...]string{"antispam"}, "bizType": "ビジネスシナリオ", "callback": "コールバック URL", "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 シークレットを取得する: os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")
*/
client, _err := green.NewClientWithAccessKey(
"cn-shanghai",
"RAM ユーザーの AccessKey ID を環境変数から取得することをお勧めします",
"RAM ユーザーの AccessKey シークレットを環境変数から取得することをお勧めします")
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 シークレットを取得する: os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")
*/
client, _err := green.NewClientWithAccessKey(
"cn-shanghai",
"RAM ユーザーの AccessKey ID を環境変数から取得することをお勧めします",
"RAM ユーザーの AccessKey シークレットを環境変数から取得することをお勧めします")
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: モデレーションシナリオ。 1 つ以上のモデレーションシナリオを指定できます。
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 はフィードバックのラベルに基づいてモデレーション結果を返します。
詳細については、「/green/video/feedback」をご参照ください。
操作 | 説明 | サポートされているリージョン |
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 シークレットを取得する: os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")
*/
client, _err := green.NewClientWithAccessKey(
"cn-shanghai",
"RAM ユーザーの AccessKey ID を環境変数から取得することをお勧めします",
"RAM ユーザーの AccessKey シークレットを環境変数から取得することをお勧めします")
if _err != nil {
fmt.Println(_err.Error())
return
}
frame1 := map[string]interface{}{"url": "キャプチャされ、モデレートされたビデオフレーム 1 の URL", "offset": "キャプチャされ、モデレートされたビデオフレーム 1 のオフセット"}
frame2 := map[string]interface{}{"url": "キャプチャされ、モデレートされたビデオフレーム 2 の URL", "offset": "キャプチャされ、モデレートされたビデオフレーム 2 のオフセット"}
frames := [...]map[string]interface{}{frame1, frame2}
// scenes: モデレーションシナリオ。 1 つ以上のモデレーションシナリオを指定できます。
// 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())
}