लाइव-स्ट्रीमिंग उपयोगकर्ता-जनित सामग्री (UGC) प्लेटफ़ॉर्म की अन्तरक्रियाशीलता और अप्रत्याशितता इस बात का एक बड़ा हिस्सा है कि वे इतने लोकप्रिय क्यों हैं। लेकिन, उस अप्रत्याशितता का मतलब है कि समुदायों को अपनी सामग्री की निगरानी में मेहनती होना चाहिए ताकि यह सुनिश्चित हो सके कि यह उनके सामुदायिक दिशानिर्देशों या स्वीकार्य उपयोग नीति को पूरा करता है और सभी उपयोगकर्ताओं के लिए उपयुक्त, सुरक्षित और स्वागत योग्य है। इसका परिणाम अक्सर एक मॉडरेशन प्रणाली में होता है जहां उपयोगकर्ता समुदाय के दिशा-निर्देशों के लिए संभावित अपराधों की रिपोर्ट करते हैं और मॉडरेटर या व्यवस्थापक आवश्यक कार्रवाई करते हैं। यह अक्सर एक मैन्युअल प्रक्रिया होती है जो वांछित होने के लिए बहुत कुछ छोड़ देती है।
आर्टिफिशियल इंटेलिजेंस (एआई) और मशीन लर्निंग (एमएल) टूल्स में हाल के वर्षों में सुधार हुआ है, और डेवलपर्स इन टूल्स का उपयोग अपने समुदायों को मॉडरेट करने में सहायता के लिए कर सकते हैं। इस पोस्ट में, हम Amazon Interactive Video Service (Amazon IVS) और Amazon Rekognition के साथ ऐसा करने का एक तरीका देखेंगे।
एआई/एमएल के साथ एक एप्लिकेशन में हर लाइव स्ट्रीम के हर फ्रेम का विश्लेषण करना बहुत महंगा और मुश्किल काम होगा। इसके बजाय, डेवलपर अपने मॉडरेटर्स की मदद के लिए एक निर्दिष्ट आवृत्ति पर उनके अनुप्रयोगों में लाइव स्ट्रीम के नमूनों का विश्लेषण कर सकते हैं, अगर सामग्री में मानव मॉडरेटर द्वारा आगे की समीक्षा की आवश्यकता है तो उन्हें सतर्क कर सकते हैं। यह 100% सही समाधान नहीं है, लेकिन यह सामग्री मॉडरेशन को स्वचालित करने और मॉडरेटर के काम को आसान बनाने में मदद करने का एक तरीका है।
इस समाधान में निम्नलिखित चरण शामिल हैं:
नियम और कार्यों को बनाना आसान बनाने के लिए हम AWS सर्वर रहित एप्लिकेशन मॉडल (SAM) का उपयोग करेंगे। यहाँ संपूर्ण template.yaml
फ़ाइल है जो आवश्यक अनुमतियों, Amazon EventBridge नियम, AWS लैम्ब्डा परत (AWS SDK निर्भरता के लिए), और फ़ंक्शन परिभाषाओं का वर्णन करती है। हम इसे नीचे तोड़ देंगे।
AWSTemplateFormatVersion: '2010-09-09' Transform: 'AWS::Serverless-2016-10-31' Description: Amazon IVS Moderation Functions Globals: Function: Runtime: nodejs18.x Timeout: 30 MemorySize: 128 Api: EndpointConfiguration: Type: REGIONAL Cors: AllowMethods: "'GET, POST, OPTIONS'" AllowHeaders: "'Content-Type'" AllowOrigin: "'*'" MaxAge: "'600'" Resources: IvsChatLambdaRefLayer: Type: AWS::Serverless::LayerVersion Properties: LayerName: sam-app-dependencies Description: Dependencies for sam app ContentUri: dependencies/ CompatibleRuntimes: - nodejs18.x LicenseInfo: "MIT" RetentionPolicy: Retain IVSAccessPolicy: Type: AWS::IAM::Policy Properties: PolicyName: IVSModerationAccessPolicy PolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Action: - 's3:GetObject' - 's3:GetObjectAcl' - 'ivschat:SendEvent' - 'ivs:StopStream' - 'rekognition:DetectModerationLabels' Resource: '*' Roles: - Ref: ModerateImageRole - Ref: StopStreamRole ApiAccessPolicy: Type: AWS::IAM::Policy Properties: PolicyName: ApiAccessPolicy PolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Action: - 'sts:AssumeRole' Resource: '*' Roles: - Ref: ModerateImageRole - Ref: StopStreamRole EventRule: Type: AWS::Events::Rule Properties: Description: EventRule State: ENABLED EventPattern: source: - aws.s3 detail-type: - "Object Created" detail: bucket: name: - ivs-demo-channel-stream-archive object: key: - suffix: .jpg Targets: - Arn: !GetAtt ModerateImage.Arn Id: MyLambdaFunctionTarget PermissionForEventsToInvokeLambda: Type: AWS::Lambda::Permission Properties: FunctionName: !Ref ModerateImage Action: lambda:InvokeFunction Principal: events.amazonaws.com SourceArn: !GetAtt EventRule.Arn ModerateImage: Type: 'AWS::Serverless::Function' Properties: Environment: Variables: DEMO_CHAT_ARN: 'arn:aws:ivschat:us-east-1:[redacted]:room/[redacted]' DEMO_CHANNEL_ARN: 'arn:aws:ivs:us-east-1:[redacted]:channel/[redacted]' Handler: index.moderateImage Layers: - !Ref IvsChatLambdaRefLayer CodeUri: lambda/ StopStream: Type: 'AWS::Serverless::Function' Properties: Environment: Variables: DEMO_CHAT_ARN: 'arn:aws:ivschat:us-east-1:[redacted]:room/[redacted]' DEMO_CHANNEL_ARN: 'arn:aws:ivs:us-east-1:[redacted]:channel/[redacted]' Handler: index.stopStream Layers: - !Ref IvsChatLambdaRefLayer CodeUri: lambda/ Events: Api1: Type: Api Properties: Path: /stop-stream Method: POST Outputs: ApiURL: Description: "API endpoint URL for Prod environment" Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/"
उस फ़ाइल में बहुत कुछ चल रहा है, तो आइए इसे थोड़ा सा तोड़ दें। सबसे पहले, हम अपने फंक्शन में JavaScript (v3) के लिए AWS SDK को शामिल करने के लिए एक लेयर बनाते हैं।
IvsChatLambdaRefLayer: Type: AWS::Serverless::LayerVersion Properties: LayerName: sam-app-dependencies Description: Dependencies for sam app ContentUri: dependencies/ CompatibleRuntimes: - nodejs18.x LicenseInfo: "MIT" RetentionPolicy: Retain
dependencies/nodejs
निर्देशिका में, एक package.json
फ़ाइल होती है जिसमें मॉड्यूल शामिल होते हैं जिनकी हमारे फ़ंक्शन को आवश्यकता होती है।
{ "dependencies": { "@aws-sdk/client-ivs": "^3.289.0", "@aws-sdk/client-ivschat": "^3.289.0", "@aws-sdk/client-rekognition": "^3.289.0" } }
IVSAccessPolicy
और APIAccessPolicy
कुंजियों द्वारा पहचाना जाने वाला अगला खंड हमारे सर्वर रहित एप्लिकेशन को आवश्यक APIs ( s3:GetObject
, s3:GetObjectAcl
, ivschat:SendEvent
, ivs:StopStream
, और rekognition:DetectModerationLabels
) तक पहुंचने की क्षमता देता है और स्टॉप स्ट्रीम विधि को उजागर करता है। जिसे हम Amazon API गेटवे के माध्यम से नीचे बनाएंगे।
अगला, हम Amazon EventBridge नियम बनाते हैं। bucket
के अंतर्गत name
संपत्ति Amazon S3 बकेट के नाम से मेल खानी चाहिए जिसे आपने अपने रिकॉर्डिंग कॉन्फ़िगरेशन में कॉन्फ़िगर किया था। अमेज़ॅन एस 3 में रिकॉर्डिंग प्लेलिस्ट और एचएलएस मीडिया समेत विभिन्न फाइलें बनाती है, इसलिए हम इस नियम को केवल हमारे थंबनेल के लिए सक्रिय करने के लिए फ़िल्टर कर सकते हैं, object
के नीचे key
को suffix: jpg
।
EventRule: Type: AWS::Events::Rule Properties: Description: EventRule State: ENABLED EventPattern: source: - aws.s3 detail-type: - "Object Created" detail: bucket: name: - ivs-demo-channel-stream-archive object: key: - suffix: .jpg Targets: - Arn: !GetAtt ModerateImage.Arn Id: MyLambdaFunctionTarget
अगला, हम नियम को AWS लैम्ब्डा फ़ंक्शन को लागू करने के लिए आवश्यक अनुमतियाँ देते हैं।
PermissionForEventsToInvokeLambda: Type: AWS::Lambda::Permission Properties: FunctionName: !Ref ModerateImage Action: lambda:InvokeFunction Principal: events.amazonaws.com SourceArn: !GetAtt EventRule.Arn
अब हम अपने कार्य को परिभाषित कर सकते हैं जिसे Amazon EventBridge नियम द्वारा लागू किया जाएगा।
ModerateImage: Type: 'AWS::Serverless::Function' Properties: Environment: Variables: DEMO_CHAT_ARN: 'arn:aws:ivschat:us-east-1:[redacted]:room/[redacted]' DEMO_CHANNEL_ARN: 'arn:aws:ivs:us-east-1:[redacted]:channel/[redacted]' Handler: index.moderateImage Layers: - !Ref IvsChatLambdaRefLayer CodeUri: lambda/
नोट: मैं DEMO_CHAT_ARN
और DEMO_CHANNEL_ARN
को पर्यावरण चर के रूप में घोषित कर रहा हूं, लेकिन आपके एप्लिकेशन को फ़ंक्शन में पारित ईवेंट से ARN मान प्राप्त होने की संभावना है क्योंकि आप इस कार्यक्षमता का उपयोग केवल एक Amazon IVS चैनल से अधिक के साथ करेंगे।
अंत में, हम उस फ़ंक्शन को परिभाषित कर सकते हैं जिसका उपयोग यदि आवश्यक हो तो स्ट्रीम को रोकने के लिए किया जाएगा।
StopStream: Type: 'AWS::Serverless::Function' Properties: Environment: Variables: DEMO_CHAT_ARN: 'arn:aws:ivschat:us-east-1:[redacted]:room/[redacted]' DEMO_CHANNEL_ARN: 'arn:aws:ivs:us-east-1:[redacted]:channel/[redacted]' Handler: index.stopStream Layers: - !Ref IvsChatLambdaRefLayer CodeUri: lambda/ Events: Api1: Type: Api Properties: Path: /stop-stream Method: POST
अब जब हमने AWS SAM के साथ अपने बुनियादी ढांचे का वर्णन कर लिया है, तो चलिए उन कार्यों को बनाते हैं जिनका हमने वर्णन किया था। index.mjs
में, हम SDK क्लासेस को import
, उन पर्यावरण चरों से Arn मानों को पुनः प्राप्त करते हैं जिन्हें हमने पारित किया है, और हमारे कार्यों के लिए आवश्यक क्लाइंट के उदाहरण बनाते हैं।
import { IvsClient, StopStreamCommand } from "@aws-sdk/client-ivs"; import { IvschatClient, SendEventCommand } from "@aws-sdk/client-ivschat"; import { RekognitionClient, DetectModerationLabelsCommand } from "@aws-sdk/client-rekognition"; const chatArn = process.env.DEMO_CHAT_ARN; const channelArn = process.env.DEMO_CHANNEL_ARN; const ivsClient = new IvsClient(); const ivsChatClient = new IvschatClient(); const rekognitionClient = new RekognitionClient();
moderateImage
फंक्शन Amazon EventBridge ईवेंट प्राप्त करेगा, ईवेंट से bucket
और key
निकालेगा, और श्रेणियों के आधार पर छवियों में किसी भी अनुचित या आपत्तिजनक सामग्री का पता लगाने के लिए rekognitionClient
के माध्यम से DetectModerationLabelsCommand
भेजेगा
export const moderateImage = async (event) => { console.log('moderateImage:', JSON.stringify(event, null, 2)); const bucket = event.detail.bucket.name; const key = event.detail.object.key; const detectLabelsCommandInput = { Image: { S3Object: { Bucket: bucket, Name: key, } }, }; const detectLabelsRequest = new DetectModerationLabelsCommand(detectLabelsCommandInput); const detectLabelsResponse = await rekognitionClient.send(detectLabelsRequest); if (detectLabelsResponse.ModerationLabels) { sendEvent('STREAM_MODERATION', detectLabelsResponse.ModerationLabels); } };
यदि आवश्यक हो, तो moderateImage
फ़ंक्शन किसी दिए गए Amazon IVS चैट रूम में किसी भी फ्रंट एंड कनेक्टेड क्लाइंट को कस्टम इवेंट प्रकाशित करने के लिए sendEvent
कॉल करता है।
const sendEvent = async (eventName, eventDetails) => { const sendEventInput = { roomIdentifier: chatArn, attributes: { streamModerationEvent: JSON.stringify(eventDetails), }, eventName, }; const sendEventRequest = new SendEventCommand(sendEventInput); await ivsChatClient.send(sendEventRequest); };
आपका फ्रंट एंड यह तय कर सकता है कि इस घटना को कैसे संभालना है और इस घटना को प्रकाशित करने का तर्क आपकी व्यावसायिक आवश्यकताओं पर निर्भर करेगा। शायद आप क्लाउडवॉच में कस्टम अलार्म ट्रिगर करना चाहते हैं, एक ईमेल भेजें, या अमेज़ॅन एसएनएस के माध्यम से अधिसूचना प्रकाशित करें? हर एप्लिकेशन की ज़रूरतें अलग-अलग होती हैं, लेकिन इस बिंदु पर मॉडरेशन डेटा उपलब्ध है, जिससे आपको इसकी आवश्यकता है।
StopStreamCommand
भेजने के लिए stopStream
विधि ivsClient
का उपयोग करती है। दोबारा, इसका कार्यान्वयन आप पर निर्भर है। आप संभावित रूप से इस कमांड को पूरी तरह से स्वचालित भी कर सकते हैं यदि Amazon रिकॉग्निशन परिणाम एक निश्चित श्रेणी से मेल खाता है या एक आत्मविश्वास स्तर से अधिक है।
export const stopStream = async (event) => { console.log('stopStream:', JSON.stringify(event, null, 2)); try { const stopStreamRequest = new StopStreamCommand({ channelArn }); const stopStreamResponse = await ivsClient.send(stopStreamRequest); responseObject.body = JSON.stringify(stopStreamResponse); } catch (err) { responseObject.statusCode = err?.name === 'ChannelNotBroadcasting' ? 404 : 500; responseObject.body = JSON.stringify(err); } return responseObject; };
मेरे डेमो में, मैंने कस्टम इवेंट्स को सुनने और परिणामों को एक मॉडरेटर दृश्य में प्रदर्शित करने का निर्णय लिया, जो पता लगाए गए आइटम और आत्मविश्वास के स्तर को दर्शाता है। मैं मॉडरेटर को 'स्टॉप स्ट्रीम' बटन के साथ भी प्रस्तुत करता हूं जो उजागर अमेज़ॅन एपीआई गेटवे के माध्यम से stopStream
विधि को आमंत्रित करता है।
इस पोस्ट में हमने सीखा कि मानव मध्यस्थों को उन अनुप्रयोगों में सामग्री को मॉडरेट करने में मदद करने के लिए Amazon रिकॉग्निशन का उपयोग कैसे करें जो वे Amazon IVS का उपयोग करके बनाते हैं। अगर आप इस बारे में अधिक जानना चाहते हैं कि कैसे Amazon IVS सुरक्षित UGC समुदायों को बनाने में मदद कर सकता है, तो निम्न ब्लॉग पोस्ट देखें: