La interactividad y la imprevisibilidad de las plataformas de contenido generado por el usuario (UGC) son una gran parte de por qué son tan populares. Pero esa imprevisibilidad significa que las comunidades deben ser diligentes en el control de su contenido para asegurarse de que cumpla con las pautas de la comunidad o la política de uso aceptable y sea apropiado, seguro y acogedor para todos los usuarios. Esto a menudo da como resultado un sistema de moderación en el que los usuarios informan sobre posibles infracciones a las pautas de la comunidad y los moderadores o administradores toman las medidas necesarias. Este es a menudo un proceso manual que deja mucho que desear. de transmisión en vivo Las herramientas (IA) y aprendizaje automático (ML) han mejorado en los últimos años, y los desarrolladores pueden usar estas herramientas para ayudar a moderar sus comunidades. En esta publicación, veremos una forma de hacerlo con Amazon Interactive Video Service (Amazon IVS) y Amazon Rekognition. de inteligencia artificial Descripción general de la solución Analizar cada cuadro de cada transmisión en vivo en una aplicación con sería una tarea muy costosa y difícil. En cambio, los desarrolladores pueden analizar muestras de las transmisiones en vivo en sus aplicaciones en una frecuencia específica para ayudar a sus moderadores al alertarlos si hay contenido que necesita una revisión adicional por parte de un moderador humano. No es una solución 100% perfecta, pero es una forma de automatizar la moderación de contenido y ayudar a facilitar el trabajo de los moderadores. AI/ML Esta solución implica los siguientes pasos: Configurar en sus canales de Amazon IVS para guardar imágenes en miniatura en una frecuencia específica grabación automática de transmisiones en vivo a Amazon Simple Storage Service (Amazon S3) Cree una regla de Amazon EventBridge que se active cuando se cree un nuevo objeto en el depósito de Amazon S3 Cree una función de AWS Lambda que se active mediante la regla de EventBridge y utilice Amazon Rekognition para detectar contenido como desnudos, violencia o juegos de apuestas que podría necesitar ser moderado por un moderador humano. Cree una función de AWS Lambda y expóngala a través de Amazon API Gateway para proporcionar un medio para detener una transmisión en vivo, si es necesario. Enviar un evento personalizado a un que contiene los resultados del análisis Sala de chat de Amazon IVS Creación de la regla de Amazon EventBridge y las funciones de AWS Lambda Usaremos el modelo de aplicación sin servidor (SAM) de AWS para facilitar la creación de la regla y las funciones. Aquí está el archivo completo que describe los permisos necesarios, la regla de Amazon EventBridge, la capa de AWS Lambda (para la dependencia del SDK de AWS) y las definiciones de funciones. Desglosaremos esto a continuación. template.yaml 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/" Están sucediendo muchas cosas en ese archivo, así que analicemos un poco. Primero, creamos una capa para permitir la inclusión de AWS SDK for JavaScript (v3) en nuestra función. IvsChatLambdaRefLayer: Type: AWS::Serverless::LayerVersion Properties: LayerName: sam-app-dependencies Description: Dependencies for sam app ContentUri: dependencies/ CompatibleRuntimes: - nodejs18.x LicenseInfo: "MIT" RetentionPolicy: Retain En el directorio hay un archivo que incluye los módulos que necesita nuestra función. 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" } } La siguiente sección, identificada por las claves y , brinda a nuestra aplicación sin servidor la capacidad de acceder a las API necesarias ( , , , y ) y exponer el método de detener flujo que crearemos a continuación a través de Amazon API Gateway. IVSAccessPolicy APIAccessPolicy s3:GetObject s3:GetObjectAcl ivschat:SendEvent ivs:StopStream rekognition:DetectModerationLabels A continuación, creamos la regla de Amazon EventBridge. La propiedad debajo debe coincidir con el nombre del depósito de Amazon S3 que configuró en su configuración de grabación. La grabación en Amazon S3 crea varios archivos, incluidas listas de reproducción y medios HLS, por lo que podemos filtrar esta regla para activar solo nuestras miniaturas configurando la debajo del para que tenga . name bucket key object 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 A continuación, otorgamos a la regla los permisos necesarios para invocar la función AWS Lambda. PermissionForEventsToInvokeLambda: Type: AWS::Lambda::Permission Properties: FunctionName: !Ref ModerateImage Action: lambda:InvokeFunction Principal: events.amazonaws.com SourceArn: !GetAtt EventRule.Arn Ahora podemos definir nuestra función que será invocada por la regla de 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/ Declaro y como variables de entorno, pero es probable que su aplicación obtenga los valores de ARN del evento pasado a la función, ya que probablemente usaría esta funcionalidad con más de un solo canal de Amazon IVS. Nota: DEMO_CHAT_ARN DEMO_CHANNEL_ARN Finalmente, podemos definir la función que se usará para detener una transmisión, si es necesario. 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 Creación de las funciones de AWS Lambda Ahora que hemos descrito nuestra infraestructura con AWS SAM, creemos las funciones que describimos. En , las clases SDK, recuperamos los valores de las variables de entorno que pasamos y creamos instancias de los clientes necesarios para nuestras funciones. index.mjs 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(); La función recibirá el evento de Amazon EventBridge, extraerá el y del evento y enviará un a través de para detectar cualquier contenido inapropiado u ofensivo en las imágenes según las categorías. . moderateImage bucket key DetectModerationLabelsCommand rekognitionClient listado aquí 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); } }; Si es necesario, la función llama a para publicar un evento personalizado en cualquier cliente conectado a una sala de chat de Amazon IVS determinada. moderateImage 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); }; Su front-end puede decidir cómo manejar este evento y la lógica para publicar este evento dependerá de las necesidades de su negocio. ¿Tal vez prefiera activar una alarma personalizada en CloudWatch, enviar un correo electrónico o publicar una notificación a través de Amazon SNS? Las necesidades de cada aplicación difieren, pero los datos de moderación están disponibles en este punto para hacer con ellos lo que necesites. El método usa para enviar un . Nuevamente, la implementación de esto depende de usted. Incluso podría automatizar por completo este comando si el resultado de Amazon Rekognition coincide con una determinada categoría o supera un nivel de confianza. stopStream ivsClient StopStreamCommand 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; }; Manifestación En mi demostración, decidí escuchar los eventos personalizados y mostrar los resultados en una vista de moderador que muestra el elemento detectado y el nivel de confianza. También le presento al moderador un botón 'Detener flujo' que invoca el método a través de Amazon API Gateway expuesto. stopStream Resumen En esta publicación, aprendimos a usar Amazon Rekognition para ayudar a los moderadores humanos a moderar el contenido de las aplicaciones que crean con Amazon IVS. Si desea obtener más información sobre cómo Amazon IVS puede ayudar a crear comunidades UGC más seguras, consulte las siguientes publicaciones de blog: Moderación de mensajes de chat de Amazon IVS con una función AWS Lambda Moderación manual de mensajes de chat de Amazon IVS