AWSSDK 中。转录 StartTranscription作业完成

AWSSDK.Transcribe StartTranscriptionJob completion

提问人:Leon 提问时间:4/4/2023 更新时间:6/21/2023 访问量:64

问:

我编写了以下使用 AWSSDK 的代码。转录以转录音频文件。 代码执行并返回状态为 OK 的响应,但返回对象响应。TranscriptionJob.Transcript 为 null 我想出的解释是,它只指示工作的开始,一位同事告诉我,我现在需要轮询结果,或者使用 AWS Step Functions 或 AWS Lambda 来监控作业完成情况......我可以使用任何其他选项来了解转录何时完成?

    public static string Transcribe(string inputAudioFilePath)
    {
        var awsCredentials = new BasicAWSCredentials(accessKey, secretKey);
        // North CA, for streaming "us-west-2"
        var config = new AmazonTranscribeServiceConfig { RegionEndpoint = RegionEndpoint.GetBySystemName("us-west-2") }; 

        AmazonTranscribeServiceClient client = new AmazonTranscribeServiceClient(awsCredentials, config);
        client.AfterResponseEvent += Client_AfterResponseEvent;

        var jobName = String.Format("AWSSTT-{0}", DateTime.Now.ToString("yyyy-MM-dd-hh-mm-t"));
        var inputLanguage = "en-US";

        #region Upload File to S3 Bucket

        string s3BucketName = "tts-experiment";
        string s3KeyName = inputAudioFilePath;


        mAmazonS3Client = new AmazonS3Client(accessKey, secretKey, mRegionEndpoint);
        string s3MediaUrl = UploadFileToS3(inputAudioFilePath, s3BucketName, s3KeyName);
        string ext = Path.GetExtension(inputAudioFilePath).ToUpper();
        MediaFormat mediaFormat = MediaFormat.Wav;
        if (String.Compare(ext, ".MP3", true) == 0)
            mediaFormat = MediaFormat.Mp3;

        #endregion

        var media = new Media() { MediaFileUri = s3MediaUrl };
        var request = new StartTranscriptionJobRequest
        {
            TranscriptionJobName = jobName,
            LanguageCode = inputLanguage,
            Media = media,
            MediaFormat = MediaFormat.Mp3,
        };

        try
        {
            string text = "";
            StartTranscriptionJobResponse response = client.StartTranscriptionJob(request);
            if (response.HttpStatusCode == System.Net.HttpStatusCode.OK)
            {
                Console.WriteLine("Transcription completed successfully");

                if (response.TranscriptionJob.Transcript != null && response.TranscriptionJob.Transcript.TranscriptFileUri != null)
                {
                    string transcriptUrl = response.TranscriptionJob.Transcript.TranscriptFileUri.ToString();
                    WebClient webClient = new WebClient();

                    string targetDir = Path.Combine(Program.InstallDir, @"TTSExperiment\Transcribed");
                    if (!Directory.Exists(targetDir))
                    {
                        Directory.CreateDirectory(targetDir);
                    }
                    string localFilePath = Path.Combine(targetDir, Path.GetFileNameWithoutExtension(transcriptUrl) +".txt");
                
                    webClient.DownloadFile(transcriptUrl, localFilePath);

                    text = File.ReadAllText(localFilePath);

                    Console.WriteLine($"Transcription job {jobName} completed.");
                }
                else
                {
                    Console.WriteLine("No Transcript created");
                }
                return text;
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error starting transcription job: {ex.Message}");
        }

        return "";
    }
C# Amazon-Web-Services 回调 SDK

评论


答:

1赞 rlhagerm 6/21/2023 #1

您的同事是对的,您确实需要轮询结果或以其他方式进行检查,因为转录可能需要很长时间,具体取决于媒体的长度。AWS 开发工具包示例存储库包含一个 .NET 示例,该示例使用一些您可能会发现有用的简单轮询逻辑。

Console.WriteLine("Start a transcription.");

    var transcriptionName = $"ExampleTranscription_{DateTime.Now.Ticks}";

    var transcriptionJob = await transcribeWrapper.StartTranscriptionJob(
        transcriptionName, transcriptionMediaLocation, MediaFormat.Mp3,
        LanguageCode.EnUS, null);

    Console.WriteLine($"Transcription started: {transcriptionJob.TranscriptionJobName}, " +
                      $"status: {transcriptionJob.TranscriptionJobStatus}.");

    Console.WriteLine($"Waiting for transcription {transcriptionName}.");

    while (transcriptionJob.TranscriptionJobStatus != TranscriptionJobStatus.COMPLETED
           && transcriptionJob.TranscriptionJobStatus != TranscriptionJobStatus.FAILED)
    {
        transcriptionJob =
            await transcribeWrapper.GetTranscriptionJob(transcriptionName);
        Thread.Sleep(5000);
    }

    Console.WriteLine($"Transcription status:  {transcriptionJob.TranscriptionJobStatus}, " +
                      $"completed at: {transcriptionJob.CompletionTime}.");

评论

0赞 Leon 6/23/2023
谢谢。OenAI API 没有这个问题。我实际上实现了这一点并在一个单独的线程上调用 - 然后等到它完成......