Пример #1
0
        public override void Invoke(AWSCredentials creds, RegionEndpoint region, int maxItems)
        {
            AmazonTranscribeServiceConfig config = new AmazonTranscribeServiceConfig();

            config.RegionEndpoint = region;
            ConfigureClient(config);
            AmazonTranscribeServiceClient client = new AmazonTranscribeServiceClient(creds, config);

            ListTranscriptionJobsResponse resp = new ListTranscriptionJobsResponse();

            do
            {
                ListTranscriptionJobsRequest req = new ListTranscriptionJobsRequest
                {
                    NextToken = resp.NextToken
                    ,
                    MaxResults = maxItems
                };

                resp = client.ListTranscriptionJobs(req);
                CheckError(resp.HttpStatusCode, "200");

                foreach (var obj in resp.TranscriptionJobSummaries)
                {
                    AddObject(obj);
                }
            }while (!string.IsNullOrEmpty(resp.NextToken));
        }
Пример #2
0
 //--- Methods ---
 public override async Task InitializeAsync(LambdaConfig config)
 {
     _transcribe       = new AmazonTranscribeServiceClient();
     _outputBucketName = config.ReadS3BucketName("ExtractedTextBucket");
     _notifyQueueUrl   = config.ReadSqsQueueUrl("ProgressQueue");
     _sqsClient        = new AmazonSQSClient();
 }
        public async Task ExecuteAsync(WorkerJobHelper <AIJob> jobHelper)
        {
            S3Locator inputFile;

            if (!jobHelper.JobInput.TryGet <S3Locator>(nameof(inputFile), out inputFile))
            {
                throw new Exception("Invalid or missing input file.");
            }

            string mediaFileUrl;

            if (!string.IsNullOrWhiteSpace(inputFile.HttpEndpoint))
            {
                mediaFileUrl = inputFile.HttpEndpoint;
            }
            else
            {
                var bucketLocation = await inputFile.GetBucketLocationAsync();

                var s3SubDomain = !string.IsNullOrWhiteSpace(bucketLocation) ? $"s3-{bucketLocation}" : "s3";
                mediaFileUrl = $"https://{s3SubDomain}.amazonaws.com/{inputFile.AwsS3Bucket}/{inputFile.AwsS3Key}";
            }

            string mediaFormat;

            if (mediaFileUrl.EndsWith("mp3", StringComparison.OrdinalIgnoreCase))
            {
                mediaFormat = "mp3";
            }
            else if (mediaFileUrl.EndsWith("mp4", StringComparison.OrdinalIgnoreCase))
            {
                mediaFormat = "mp4";
            }
            else if (mediaFileUrl.EndsWith("wav", StringComparison.OrdinalIgnoreCase))
            {
                mediaFormat = "wav";
            }
            else if (mediaFileUrl.EndsWith("flac", StringComparison.OrdinalIgnoreCase))
            {
                mediaFormat = "flac";
            }
            else
            {
                throw new Exception($"Unable to determine media format from input file '{mediaFileUrl}'");
            }

            var transcribeParameters = new StartTranscriptionJobRequest
            {
                TranscriptionJobName = "TranscriptionJob-" + jobHelper.JobAssignmentId.Substring(jobHelper.JobAssignmentId.LastIndexOf("/") + 1),
                LanguageCode         = "en-US",
                Media = new Media {
                    MediaFileUri = mediaFileUrl
                },
                MediaFormat      = mediaFormat,
                OutputBucketName = jobHelper.Request.GetRequiredContextVariable("ServiceOutputBucket")
            };

            using (var transcribeService = new AmazonTranscribeServiceClient())
                await transcribeService.StartTranscriptionJobAsync(transcribeParameters);
        }
Пример #4
0
 //--- Methods ---
 public override async Task InitializeAsync(LambdaConfig config)
 {
     _transcribe = new AmazonTranscribeServiceClient();
     _table      = new IndexingStatusTable(
         config.ReadDynamoDBTableName("IndexingStatusTable"),
         new AmazonDynamoDBClient()
         );
 }
 //--Methods--
 public override Task InitializeAsync(LambdaConfig config)
 {
     _rand             = new Random();
     _textBucket       = new S3Bucket(config.ReadText("TextForPolly"));
     _audioBucket      = new S3Bucket(config.ReadText("AudioForTranscribe"));
     _pollyClient      = new AmazonPollyClient();
     _transcribeClient = new AmazonTranscribeServiceClient();
     return(Task.CompletedTask);
 }
Пример #6
0
 //--Methods--
 public override Task InitializeAsync(LambdaConfig config)
 {
     _audioBucket      = AwsConverters.ConvertBucketArnToName(config.ReadText("AudioForTranscribe"));
     _textBucket       = AwsConverters.ConvertBucketArnToName(config.ReadText("TextForPolly"));
     _topic            = config.ReadText("Loop");
     _rand             = new Random();
     _s3Client         = new AmazonS3Client();
     _pollyClient      = new AmazonPollyClient();
     _transcribeClient = new AmazonTranscribeServiceClient();
     _snsClient        = new AmazonSimpleNotificationServiceClient();
     return(Task.CompletedTask);
 }
Пример #7
0
        protected IAmazonTranscribeService CreateClient(AWSCredentials credentials, RegionEndpoint region)
        {
            var config = new AmazonTranscribeServiceConfig {
                RegionEndpoint = region
            };

            Amazon.PowerShell.Utils.Common.PopulateConfig(this, config);
            this.CustomizeClientConfig(config);
            var client = new AmazonTranscribeServiceClient(credentials, config);

            client.BeforeRequestEvent += RequestEventHandler;
            client.AfterResponseEvent += ResponseEventHandler;
            return(client);
        }
Пример #8
0
        internal static ISpeechServiceStrategy CreateService(SpeechServiceType type)
        {
            switch (type)
            {
            case SpeechServiceType.aws:
                string accessKey;
                string secretAccessKey;
                string regionEndpointName;
                if (ConfigurationManager.GetSection("awsConfig") is NameValueCollection awsSettings)
                {
                    accessKey          = awsSettings["accessKey"];
                    secretAccessKey    = awsSettings["secretAccessKey"];
                    regionEndpointName = awsSettings["region"];
                }
                else
                {
                    throw new InvalidCredentialException();
                }
                var s3Client      = new AmazonS3Client(accessKey, secretAccessKey, RegionEndpoint.GetBySystemName(regionEndpointName));
                var atClient      = new AmazonTranscribeServiceClient(accessKey, secretAccessKey, RegionEndpoint.GetBySystemName(regionEndpointName));
                var awsBucketName = Guid.NewGuid().ToString();
                return(new Aws(s3Client, atClient, awsBucketName));


            case SpeechServiceType.google:
                string credentialPath;
                string projectId;
                if (ConfigurationManager.GetSection("googleConfig") is NameValueCollection googleSettings)
                {
                    credentialPath = googleSettings["pathToCredentialsFile"];
                    projectId      = googleSettings["projectId"];
                    if (Environment.GetEnvironmentVariable("GOOGLE_APPLICATION_CREDENTIALS") == null)
                    {
                        Environment.SetEnvironmentVariable("GOOGLE_APPLICATION_CREDENTIALS", credentialPath);
                    }
                }
                else
                {
                    throw new InvalidCredentialException();
                }
                var googleClient   = StorageClient.Create();
                var googBucketName = Guid.NewGuid().ToString();
                return(new Goog(googleClient, googBucketName, projectId));


            case SpeechServiceType.ibm:
                string username;
                string password;
                if (ConfigurationManager.GetSection("ibmConfig") is NameValueCollection ibmSettings)
                {
                    username = ibmSettings["username"];
                    password = ibmSettings["password"];
                }
                else
                {
                    throw new InvalidCredentialException();
                }
                var authBytes = Encoding.UTF8.GetBytes(username + ":" + password);
                var base64EncryptedCredentials = Convert.ToBase64String(authBytes);
                var ibmClient = new HttpClient();
                ibmClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", base64EncryptedCredentials);
                return(new Ibm(ibmClient));


            case SpeechServiceType.azure:
                string apiKey;
                string apiRegion;
                if (ConfigurationManager.GetSection("azureConfig") is NameValueCollection azureSettings)
                {
                    apiKey    = azureSettings["subscriptionKey"];
                    apiRegion = azureSettings["region"];
                }
                else
                {
                    throw new InvalidCredentialException();
                }
                return(new Azure(apiKey, apiRegion));


            case SpeechServiceType.azureAdv:
                string subscriptionKey;
                string accountId;
                string location;
                if (ConfigurationManager.GetSection("azureAdvanced") is NameValueCollection azureAdvSettings)
                {
                    subscriptionKey = azureAdvSettings["subscriptionKey"];
                    accountId       = azureAdvSettings["accountId"];
                    location        = azureAdvSettings["location"];
                }
                else
                {
                    throw new InvalidCredentialException();
                }
                return(new AzureAdvanced(subscriptionKey, accountId, location));


            default:
                throw new NotSupportedException();
            }
        }
Пример #9
0
        internal static async Task ProcessJobAssignmentAsync(AwsAiServiceWorkerRequest @event)
        {
            var resourceManager = @event.GetAwsV4ResourceManager();
            var table           = new DynamoDbTable(@event.StageVariables["TableName"]);
            var jobAssignmentId = @event.JobAssignmentId;

            try
            {
                // 1. Setting job assignment status to RUNNING
                await UpdateJobAssignmentStatusAsync(resourceManager, table, jobAssignmentId, "RUNNING", null);

                // 2. Retrieving WorkflowJob
                var job = await RetrieveJobAsync(resourceManager, table, jobAssignmentId);

                // 3. Retrieve JobProfile
                var jobProfile = await RetrieveJobProfileAsync(resourceManager, job);

                // 4. Retrieve job inputParameters
                var jobInput = job.JobInput;

                // 5. Check if we support jobProfile and if we have required parameters in jobInput
                ValidateJobProfile(jobProfile, jobInput);

                S3Locator inputFile;
                if (!jobInput.TryGet <S3Locator>(nameof(inputFile), out inputFile))
                {
                    throw new Exception("Invalid or missing input file.");
                }

                S3Locator outputLocation;
                if (!jobInput.TryGet <S3Locator>(nameof(outputLocation), out outputLocation))
                {
                    throw new Exception("Invalid or missing output location.");
                }

                switch (jobProfile.Name)
                {
                case JOB_PROFILE_TRANSCRIBE_AUDIO:
                    string mediaFileUrl;
                    if (!string.IsNullOrWhiteSpace(inputFile.HttpEndpoint))
                    {
                        mediaFileUrl = inputFile.HttpEndpoint;
                    }
                    else
                    {
                        var bucketLocation = await inputFile.GetBucketLocationAsync();

                        var s3SubDomain = !string.IsNullOrWhiteSpace(bucketLocation) ? $"s3-{bucketLocation}" : "s3";
                        mediaFileUrl = $"https://{s3SubDomain}.amazonaws.com/{inputFile.AwsS3Bucket}/{inputFile.AwsS3Key}";
                    }

                    string mediaFormat;
                    if (mediaFileUrl.EndsWith("mp3", StringComparison.OrdinalIgnoreCase))
                    {
                        mediaFormat = "mp3";
                    }
                    else if (mediaFileUrl.EndsWith("mp4", StringComparison.OrdinalIgnoreCase))
                    {
                        mediaFormat = "mp4";
                    }
                    else if (mediaFileUrl.EndsWith("wav", StringComparison.OrdinalIgnoreCase))
                    {
                        mediaFormat = "wav";
                    }
                    else if (mediaFileUrl.EndsWith("flac", StringComparison.OrdinalIgnoreCase))
                    {
                        mediaFormat = "flac";
                    }
                    else
                    {
                        throw new Exception($"Unable to determine media format from input file '{mediaFileUrl}'");
                    }

                    var transcribeParameters = new StartTranscriptionJobRequest
                    {
                        TranscriptionJobName = "TranscriptionJob-" + jobAssignmentId.Substring(jobAssignmentId.LastIndexOf("/") + 1),
                        LanguageCode         = "en-US",
                        Media = new Media {
                            MediaFileUri = mediaFileUrl
                        },
                        MediaFormat      = mediaFormat,
                        OutputBucketName = @event.StageVariables["ServiceOutputBucket"]
                    };

                    var transcribeService = new AmazonTranscribeServiceClient();

                    var startJobResponse = await transcribeService.StartTranscriptionJobAsync(transcribeParameters);

                    Logger.Debug(startJobResponse.ToMcmaJson().ToString());
                    break;

                case JOB_PROFILE_TRANSLATE_TEXT:
                    var s3Bucket = inputFile.AwsS3Bucket;
                    var s3Key    = inputFile.AwsS3Key;

                    GetObjectResponse s3Object;
                    try
                    {
                        s3Object = await inputFile.GetAsync();
                    }
                    catch (Exception error)
                    {
                        throw new Exception($"Unable to read file in bucket '{s3Bucket}' with key '{s3Key}'.", error);
                    }

                    var inputText = await new StreamReader(s3Object.ResponseStream).ReadToEndAsync();

                    var translateParameters = new TranslateTextRequest
                    {
                        SourceLanguageCode = jobInput.TryGet("sourceLanguageCode", out string srcLanguageCode) ? srcLanguageCode : "auto",
                        TargetLanguageCode = jobInput.Get <string>("targetLanguageCode"),
                        Text = inputText
                    };

                    var translateService  = new AmazonTranslateClient();
                    var translateResponse = await translateService.TranslateTextAsync(translateParameters);

                    var s3Params = new PutObjectRequest
                    {
                        BucketName  = outputLocation.AwsS3Bucket,
                        Key         = (!string.IsNullOrWhiteSpace(outputLocation.AwsS3KeyPrefix) ? outputLocation.AwsS3Key : string.Empty) + Guid.NewGuid() + ".txt",
                        ContentBody = translateResponse.TranslatedText
                    };

                    var outputS3 = await outputLocation.GetClientAsync();

                    await outputS3.PutObjectAsync(s3Params);

                    var jobOutput = new JobParameterBag();
                    jobOutput["outputFile"] = new S3Locator
                    {
                        AwsS3Bucket = s3Params.BucketName,
                        AwsS3Key    = s3Params.Key
                    };

                    Logger.Debug("Updating job assignment");
                    await UpdateJobAssignmentWithOutputAsync(table, jobAssignmentId, jobOutput);
                    await UpdateJobAssignmentStatusAsync(resourceManager, table, jobAssignmentId, "COMPLETED");

                    break;

                case JOB_PROFILE_DETECT_CELEBRITIES:
                    var randomBytes = new byte[16];
                    new Random().NextBytes(randomBytes);
                    var clientToken = randomBytes.HexEncode();

                    var base64JobId = Encoding.UTF8.GetBytes(jobAssignmentId).HexEncode();

                    var rekoParams = new StartCelebrityRecognitionRequest
                    {
                        Video = new Video
                        {
                            S3Object = new Amazon.Rekognition.Model.S3Object
                            {
                                Bucket = inputFile.AwsS3Bucket,
                                Name   = inputFile.AwsS3Key
                            }
                        },
                        ClientRequestToken  = clientToken,
                        JobTag              = base64JobId,
                        NotificationChannel = new NotificationChannel
                        {
                            RoleArn     = REKO_SNS_ROLE_ARN,
                            SNSTopicArn = SNS_TOPIC_ARN
                        }
                    };

                    var rekognitionClient             = new AmazonRekognitionClient();
                    var startCelebRecognitionResponse = await rekognitionClient.StartCelebrityRecognitionAsync(rekoParams);

                    Logger.Debug(startCelebRecognitionResponse.ToMcmaJson().ToString());
                    break;
                }
            }
            catch (Exception ex)
            {
                Logger.Exception(ex);

                try
                {
                    await UpdateJobAssignmentStatusAsync(resourceManager, table, jobAssignmentId, "FAILED", ex.ToString());
                }
                catch (Exception innerEx)
                {
                    Logger.Exception(innerEx);
                }
            }
        }
Пример #10
0
        public string GetTranscriptURL()
        {
            string result = string.Empty;

            try
            {
                AmazonTranscribeServiceClient client = new AmazonTranscribeServiceClient(ConfigurationManager.AppSettings["AmazonAccessKey"],
                                                                                         ConfigurationManager.AppSettings["AmazonSecretAccessKey"],
                                                                                         RegionEndpoint.EUWest1);

                if (client != null)
                {
                    string url = String.Format(ConfigurationManager.AppSettings["AmazonBucketURL"],
                                               ConfigurationManager.AppSettings["AmazonBucketName"],
                                               keyName);

                    Media media = new Media();
                    StartTranscriptionJobResponse transcriptionJobResponse = null;
                    GetTranscriptionJobResponse   checkJob = null;

                    media.MediaFileUri = url;



                    StartTranscriptionJobRequest transcriptionJobRequest = new StartTranscriptionJobRequest();
                    string name = Guid.NewGuid().ToString();
                    transcriptionJobRequest.TranscriptionJobName = name;
                    transcriptionJobRequest.MediaFormat          = "wav";
                    transcriptionJobRequest.Media        = media;
                    transcriptionJobRequest.LanguageCode = "en-US";

                    GetTranscriptionJobRequest getTranscriptionJobRequest = new GetTranscriptionJobRequest();
                    getTranscriptionJobRequest.TranscriptionJobName = name;

                    bool finished = false;
                    transcriptionJobResponse = client.StartTranscriptionJob(transcriptionJobRequest);

                    while (!finished)
                    {
                        checkJob = client.GetTranscriptionJob(getTranscriptionJobRequest);

                        if (checkJob != null)
                        {
                            if (!checkJob.TranscriptionJob.TranscriptionJobStatus.Value.Contains("IN_PROGRESS"))
                            {
                                finished = true;
                            }

                            Thread.Sleep(1000);
                        }
                    }


                    result = checkJob.TranscriptionJob.Transcript.TranscriptFileUri;
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }

            return(result);
        }
Пример #11
0
 public Function()
 {
     transClient = new AmazonTranscribeServiceClient();
     S3Client    = new AmazonS3Client();
 }
Пример #12
0
        private async void BeginTranscription_Click(object sender, RoutedEventArgs e)
        {
            this._ctlBeginTranscription.IsEnabled = false;
            try
            {
                this._ctlStatusLog.Text     = "";
                this._ctlTranscription.Text = "";

                var filepath = this._ctlFilepath.Text;
                if (string.IsNullOrEmpty(filepath))
                {
                    MessageBox.Show($"An mp4 file must be selected first before transcribing", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
                    return;
                }
                if (!System.IO.File.Exists(filepath))
                {
                    MessageBox.Show($"File {filepath} does not exist", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
                    return;
                }

                var s3Key    = System.IO.Path.GetFileName(filepath);
                var s3Bucket = _ctlS3Bucket.Text;


                var            chain = new CredentialProfileStoreChain();
                AWSCredentials credentials;
                if (!chain.TryGetAWSCredentials(this._ctlProfile.Text, out credentials))
                {
                    MessageBox.Show($"Profile {this._ctlProfile.Text} was not found", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
                    return;
                }

                var region = RegionEndpoint.GetBySystemName(this._ctlRegion.Text);

                var transcriptionJobName = $"{s3Key}-{Guid.NewGuid().ToString()}";

                using (var s3Client = new AmazonS3Client(credentials, region))
                    using (var transcribeClient = new AmazonTranscribeServiceClient(credentials, region))
                        using (var httpClient = new HttpClient()) // Http Client to download the transcription once complete
                        {
                            AppendStatusLine("Ensuring S3 bucket exists");
                            await s3Client.PutBucketAsync(s3Bucket);


                            var transferUtility = new TransferUtility(s3Client);

                            AppendStatusLine("Starting upload");

                            var uploadRequest = new TransferUtilityUploadRequest
                            {
                                FilePath   = filepath,
                                BucketName = s3Bucket,
                                Key        = s3Key
                            };

                            uploadRequest.UploadProgressEvent += ProgressUploadStatus;

                            await transferUtility.UploadAsync(uploadRequest);

                            var mediaFileUri = $"https://s3.{region.SystemName}.amazonaws.com/{s3Bucket}/{s3Key}";
                            AppendStatusLine($"Upload Complete to: {mediaFileUri}");

                            await transcribeClient.StartTranscriptionJobAsync(new StartTranscriptionJobRequest
                            {
                                LanguageCode = LanguageCode.EnUS,
                                Media        = new Media
                                {
                                    MediaFileUri = mediaFileUri
                                },
                                MediaFormat          = MediaFormat.Mp4,
                                TranscriptionJobName = transcriptionJobName
                            });

                            AppendStatusLine($"Started transcription job: {transcriptionJobName}");

                            GetTranscriptionJobRequest request = new GetTranscriptionJobRequest {
                                TranscriptionJobName = transcriptionJobName
                            };
                            GetTranscriptionJobResponse response = null;
                            do
                            {
                                AppendStatusLine($"... {DateTime.Now} Waiting for transcription job to complete");
                                await Task.Delay(TimeSpan.FromSeconds(2));

                                response = await transcribeClient.GetTranscriptionJobAsync(request);
                            } while (response.TranscriptionJob.TranscriptionJobStatus == TranscriptionJobStatus.IN_PROGRESS);

                            if (response.TranscriptionJob.TranscriptionJobStatus == TranscriptionJobStatus.FAILED)
                            {
                                AppendStatusLine($"Transcription job failed: {response.TranscriptionJob.FailureReason}");
                                return;
                            }

                            AppendStatusLine("Job Done");

                            var transcriptionDocument = await httpClient.GetStringAsync(response.TranscriptionJob.Transcript.TranscriptFileUri);

                            var root = JsonConvert.DeserializeObject(transcriptionDocument) as JObject;

                            var sb = new StringBuilder();
                            foreach (JObject transcriptionNode in root["results"]["transcripts"])
                            {
                                if (sb.Length != 0)
                                {
                                    sb.AppendLine("\n\n");
                                }

                                sb.Append(transcriptionNode["transcript"]);
                            }

                            this._ctlTranscription.Text = sb.ToString();
                        }
            }
            catch (Exception ex)
            {
                AppendStatusLine($"Unknown error: {ex.Message}");
            }
            finally
            {
                this._ctlBeginTranscription.IsEnabled = true;
            }
        }