제퍼넷 로고

AWS 기계 학습 서비스를 사용하여 콘텐츠를 여러 언어로 현지화

시간

지난 몇 년 동안 온라인 교육 플랫폼은 학습자의 참여를 유도하는 효과적인 매체를 제공하기 때문에 비디오 기반 학습의 채택이 증가하고 수요가 증가했습니다. 국제 시장으로 확장하고 문화 및 언어적으로 다양한 인구를 다루기 위해 기업은 콘텐츠를 여러 언어로 현지화하여 학습 제공을 다양화하는 방법도 모색하고 있습니다. 이러한 기업은 현지화 사용 사례를 해결할 수 있는 안정적이고 비용 효율적인 방법을 찾고 있습니다.

콘텐츠 현지화에는 주로 원본 음성을 새로운 언어로 번역하고 자막과 같은 시각 자료를 추가하는 작업이 포함됩니다. 전통적으로 이 프로세스는 비용이 많이 들고 수동이며 현지화 전문가와 협력하는 것을 포함하여 많은 시간이 걸립니다. 다음과 같은 AWS 기계 학습(ML) 서비스의 힘으로 아마존 전사, 아마존 번역아마존 폴리, 실행 가능하고 비용 효율적인 현지화 솔루션을 만들 수 있습니다. Amazon Transcribe를 사용하여 기존 오디오 및 비디오 스트림의 스크립트를 생성한 다음 Amazon Translate를 사용하여 이 스크립트를 여러 언어로 번역할 수 있습니다. 그런 다음 텍스트 음성 변환 서비스인 Amazon Polly를 사용하여 번역된 텍스트를 자연스러운 음성으로 변환할 수 있습니다.

현지화의 다음 단계는 콘텐츠에 자막을 추가하여 접근성과 이해도를 높이고 시청자가 동영상을 더 잘 이해할 수 있도록 하는 것입니다. 번역된 음성이 원래 음성 타이밍과 일치하지 않기 때문에 비디오 콘텐츠에 자막을 만드는 것이 어려울 수 있습니다. 오디오와 자막 간의 이러한 동기화는 동기화되지 않은 경우 청중과 콘텐츠의 연결이 끊길 수 있으므로 고려해야 할 중요한 작업입니다. Amazon Polly는 활성화를 통해 이 문제에 대한 솔루션을 제공합니다. 음성 표시, 생성된 음성 출력과 동기화할 수 있는 자막 파일을 만드는 데 사용할 수 있습니다.

이 게시물에서는 원본 영어 비디오를 사용하여 스페인어로 변환하는 AWS ML 서비스를 사용하는 현지화 솔루션을 검토합니다. 또한 음성 표시를 사용하여 스페인어로 동기화된 자막 파일을 만드는 데 중점을 둡니다.

솔루션 개요

다음 다이어그램은 솔루션 아키텍처를 보여줍니다.

이 솔루션은 비디오 파일과 대상 언어 설정을 입력으로 사용하고 Amazon Transcribe를 사용하여 비디오의 트랜스크립션을 생성합니다. 그런 다음 Amazon Translate를 사용하여 대본을 대상 언어로 번역합니다. 번역된 텍스트는 대상 언어로 오디오 스트림과 음성 표시를 생성하기 위해 Amazon Polly에 대한 입력으로 제공됩니다. Amazon Polly 반환 음성 표시 출력 시간, 유형, 시작, 끝 및 값과 같은 필드를 포함하는 줄로 구분된 JSON 스트림에서. 값은 다음과 같이 입력에서 요청된 음성 표시 유형에 따라 달라질 수 있습니다. SSML, 비짐, 단어 또는 문장. 이 예의 목적을 위해 우리는 다음을 요청했습니다. 음성 표시 유형 as word. 이 옵션을 사용하면 Amazon Polly가 문장을 문장의 개별 단어와 오디오 스트림의 시작 및 종료 시간으로 나눕니다. 그런 다음 이 메타데이터를 사용하여 음성 표시를 처리하여 Amazon Polly에서 생성된 해당 오디오 스트림에 대한 자막을 생성합니다.

마지막으로 우리는 AWS Elemental 미디어 변환 번역된 오디오 및 해당 자막으로 최종 비디오를 렌더링합니다.

다음 비디오는 솔루션의 최종 결과를 보여줍니다.

AWS Step Functions 워크 플로

우리는 사용 AWS 단계 함수 이 프로세스를 조정합니다. 다음 그림은 Step Functions 워크플로의 상위 수준 보기를 보여줍니다(더 명확성을 위해 다이어그램에서 일부 단계는 생략됨).

워크플로 단계는 다음과 같습니다.

  1. 사용자가 소스 비디오 파일을 아마존 단순 스토리지 서비스 (Amazon S3) 버킷.
  2. XNUMXD덴탈의 S3 이벤트 알림 방아쇠를 당긴다 AWS 람다 기능 state_machine.py (다이어그램에 표시되지 않음), 이것은 Step Functions 상태 머신을 호출합니다.
  3. 첫 번째 단계, 오디오 텍스트 변환, Lambda 함수를 호출합니다. transcribe.py, Amazon Transcribe를 사용하여 소스 비디오에서 오디오의 스크립트를 생성합니다.

다음 샘플 코드는 Amazon Transcribe를 사용하여 트랜스크립션 작업을 생성하는 방법을 보여줍니다. 보토3 파이썬 SDK:

response = transcribe.start_transcription_job(
    TranscriptionJobName = jobName,
    MediaFormat=media_format,
    Media = {"MediaFileUri": "s3://"+bucket+"/"+mediaconvert_video_filename},
    OutputBucketName=bucket,
    OutputKey=outputKey,
    IdentifyLanguage=True
)

작업이 완료되면 출력 파일이 S3 버킷에 저장되고 프로세스는 콘텐츠 번역의 다음 단계로 계속됩니다.

  1. XNUMXD덴탈의 전사 번역 단계는 Lambda 함수를 호출합니다. 번역.py Amazon Translate를 사용하여 대본을 대상 언어로 번역합니다. 여기서는 동기/실시간 번역을 사용합니다. 번역_텍스트 기능:
    # Real-time translation
    response = translate.translate_text(
        Text=transcribe_text,
        SourceLanguageCode=source_language_code,
        TargetLanguageCode=target_language_code,
    )
    

    동기 번역은 번역할 수 있는 문서 크기에 제한이 있습니다. 이 글을 쓰는 시점에서 5,000바이트로 설정되어 있습니다. 더 큰 문서 크기의 경우 다음을 사용하여 작업을 만드는 비동기 경로를 사용하는 것이 좋습니다. start_text_translation_job 를 통해 상태를 확인하고 설명_텍스트_번역_작업.

  2. 다음 단계는 Step Functions입니다. 평행 상태 머신에서 병렬 분기를 생성합니다.
    1. 첫 번째 분기에서 Lambda 함수를 호출합니다. 생성_polly_audio.py Amazon Polly 오디오 스트림을 생성하려면:
      # Set up the polly and translate services
      client = boto3.client('polly')
      
      # Use the translated text to create the synthesized speech
      response = client.start_speech_synthesis_task(
                   Engine="standard", LanguageCode="es", OutputFormat="mp3",
                   SampleRate="22050", Text=polly_text, VoiceId="Miguel",
                   TextType="text",
                   OutputS3BucketName="S3-bucket-name",
                   OutputS3KeyPrefix="-polly-recording")
      audio_task_id = response['SynthesisTask']['TaskId']

      여기서 우리는 start_speech_synesis_task Amazon Polly Python SDK의 메서드를 사용하여 Amazon Polly 오디오를 생성하는 음성 합성 작업을 트리거합니다. 우리는 설정 OutputFormatmp3이 API 호출에 대한 오디오 스트림을 생성하도록 Amazon Polly에 지시합니다.

    2. 두 번째 분기에서는 Lambda 함수를 호출합니다. generate_speech_marks.py 스피치 마크 출력을 생성하려면:
      ....
      # Use the translated text to create the speech marks
      response = client.start_speech_synthesis_task(
                   Engine="standard", LanguageCode="es", OutputFormat="json",
                   SampleRate="22050", Text=polly_text, VoiceId="Miguel",
                   TextType="text", SpeechMarkTypes=['word'],
                   OutputS3BucketName="S3-bucket-name", 
                   OutputS3KeyPrefix="-polly-speech-marks")
      speechmarks_task_id = response['SynthesisTask']['TaskId']

  • 우리는 다시 사용 start_speech_synesis_task 방법이지만 지정 OutputFormatjson이 API 호출에 대한 음성 표시를 생성하도록 Amazon Polly에 지시합니다.

두 번째 분기의 다음 단계에서는 Lambda 함수를 호출합니다. 생성_자막.py, 음성 표시 출력에서 ​​자막 파일을 생성하는 논리를 구현합니다.

파일에서 Python 모듈을 사용합니다. webvtt_utils.py. 이 모듈에는 자막 파일을 만드는 여러 유틸리티 기능이 있습니다. 그러한 방법 중 하나 get_phrases_from_speechmarks 음성 표시 파일의 구문 분석을 담당합니다. 음성 표시 JSON 구조는 각 단어의 시작 시간만 개별적으로 제공합니다. SRT 파일에 필요한 자막 타이밍을 만들기 위해 먼저 스피치 마크 파일의 단어 목록에서 약 n(n=10) 단어의 구를 만듭니다. 그런 다음 구문의 첫 번째 단어에서 시작 시간을 취하여 SRT 파일 형식으로 작성하고 종료 시간에는 (n+1) 단어의 시작 시간을 사용하고 1을 빼서 시퀀스된 항목을 만듭니다. . 다음 함수는 SRT 파일에 쓰기를 준비하기 위해 구문을 생성합니다.

def get_phrases_from_speechmarks(words, transcript):
.....

    for item in items:
        # if it is a new phrase, then get the start_time of the first item
        if n_phrase:
            phrase["start_time"] = get_time_code(words[c]["start_time"])
            n_phrase = False

        else:
            if c == len(words) - 1:
                phrase["end_time"] = get_time_code(words[c]["start_time"])
            else:
                phrase["end_time"] = get_time_code(words[c + 1]["start_time"] - 1)

        # in either case, append the word to the phrase...
        phrase["words"].append(item)
        x += 1

        # now add the phrase to the phrases, generate a new phrase, etc.
        if x == 10 or c == (len(items) - 1):
            # print c, phrase
            if c == (len(items) - 1):
                if phrase["end_time"] == '':
                    start_time = words[c]["start_time"]
                    end_time = int(start_time) + 500
                    phrase["end_time"] = get_time_code(end_time)

            phrases.append(phrase)
            phrase = new_phrase()
            n_phrase = True
            x = 0

        .....

    return phrases

  1. 마지막 단계, 미디어 변환, Lambda 함수를 호출합니다. create_mediaconvert_job.py Amazon Polly의 오디오 스트림과 자막 파일을 소스 비디오 파일과 결합하여 최종 출력 파일을 생성한 다음 S3 버킷에 저장합니다. 이 단계에서 사용하는 MediaConvert, 방송급 기능을 갖춘 파일 기반 비디오 트랜스코딩 서비스입니다. 주문형 비디오 콘텐츠를 쉽게 생성하고 고급 비디오 및 오디오 기능을 간단한 웹 인터페이스와 결합할 수 있습니다. 여기서 다시 Python을 사용합니다. 보토3 SDK를 생성하려면 MediaConvert 직업:
    ……
    job_metadata = {'asset_id': asset_id, 'application': "createMediaConvertJob"}
    mc_client = boto3.client('mediaconvert', region_name=region)
    endpoints = mc_client.describe_endpoints()
    mc_endpoint_url = endpoints['Endpoints'][0]['Url']
    
    mc = boto3.client('mediaconvert', region_name=region, endpoint_url=mc_endpoint_url, verify=True)
    
    mc.create_job(Role=mediaconvert_role_arn, UserMetadata=job_metadata, Settings=mc_data["Settings"])

사전 조건

시작하기 전에 다음 전제 조건이 있어야 합니다.

솔루션 배포

AWS CDK를 사용하여 솔루션을 배포하려면 다음 단계를 완료하십시오.

  1. 클론 저장소:
    git clone https://github.com/aws-samples/localize-content-using-aws-ml-services.git 

  2. AWS CDK가 다음인지 확인하려면 부트 스트랩, 명령을 실행 cdk bootstrap 저장소의 루트에서:
    $ cdk bootstrap
    ⏳ Bootstrapping environment aws://<acct#>/<region>...
    Trusted accounts for deployment: (none)
    Trusted accounts for lookup: (none)
    Using default execution policy of 'arn:aws:iam::aws:policy/AdministratorAccess'. Pass '--cloudformation-execution-policies' to customize.
    ✅ Environment aws://<acct#>/<region> bootstrapped (no changes).

  3. 작업 디렉토리를 저장소의 루트로 변경하고 다음 명령을 실행하십시오.
    cdk deploy

기본적으로 대상 오디오 설정은 미국 스페인어(es-US). 다른 대상 언어로 테스트하려는 경우 다음 명령을 사용하십시오.

cdk deploy --parameters pollyLanguageCode=<pollyLanguageCode> 
           --parameters pollyVoiceId=<pollyVoiceId>
           --parameters pollyEngine=<pollyEngine> 
           --parameters mediaConvertLangShort=<mediaConvertLangShort>
           --parameters mediaConvertLangLong=<mediaConvertLangLong>
           --parameters targetLanguageCode=<targetLanguageCode>

프로세스를 완료하는 데 몇 분이 소요되며, 그 후에 번역된 오디오 및 번역된 자막이 포함된 대상 비디오 파일을 보는 데 사용할 수 있는 링크가 표시됩니다.

솔루션 테스트

이 솔루션을 테스트하기 위해 다음 중 일부를 사용했습니다. AWS re:Invent 2017 비디오 Amazon Transcribe가 처음 도입된 YouTube에서. 자신의 비디오로 솔루션을 테스트할 수도 있습니다. 테스트 비디오의 원래 언어는 영어입니다. 이 솔루션을 배포할 때 대상 오디오 설정을 지정하거나 스페인어를 사용하여 오디오 및 자막을 생성하는 기본 대상 오디오 설정을 사용할 수 있습니다. 솔루션은 비디오 파일을 업로드하는 데 사용할 수 있는 S3 버킷을 생성합니다.

  1. Amazon S3 콘솔에서 버킷으로 이동합니다. PollyBlogBucket.
  2. 버킷을 선택하고 /inputVideo 디렉토리로 이동하고 비디오 파일을 업로드합니다(솔루션은 mp4 유형의 비디오로 테스트됨). 이 시점에서 S3 이벤트 알림은 상태 머신을 시작하는 Lambda 함수를 트리거합니다.
  3. Step Functions 콘솔에서 상태 머신(ProcessAudioWithSubtitles).
  4. 상태 머신의 실행 중 하나를 선택하여 위치를 찾습니다. 그래프 인스펙터.

각 상태에 대한 실행 결과를 보여줍니다. Step Functions 워크플로를 완료하는 데 몇 분이 소요되며, 그 후에 모든 단계가 성공적으로 완료되었는지 확인할 수 있습니다.

출력 검토

출력을 검토하려면 Amazon S3 콘솔을 열고 오디오 파일(.mp3)과 음성 표시 파일(.marks)이 아래의 S3 버킷에 저장되어 있는지 확인하십시오. <ROOT_S3_BUCKET>/<UID>/synthesisOutput/.

다음은 번역된 텍스트에서 생성된 음성 표시 파일의 샘플입니다.

{"time":6,"type":"word","start":2,"end":6,"value":"Qué"}
{"time":109,"type":"word","start":7,"end":10,"value":"tal"}
{"time":347,"type":"word","start":11,"end":13,"value":"el"}
{"time":453,"type":"word","start":14,"end":20,"value":"idioma"}
{"time":1351,"type":"word","start":22,"end":24,"value":"Ya"}
{"time":1517,"type":"word","start":25,"end":30,"value":"sabes"}
{"time":2240,"type":"word","start":32,"end":38,"value":"hablé"}
{"time":2495,"type":"word","start":39,"end":44,"value":"antes"}
{"time":2832,"type":"word","start":45,"end":50,"value":"sobre"}
{"time":3125,"type":"word","start":51,"end":53,"value":"el"}
{"time":3227,"type":"word","start":54,"end":59,"value":"hecho"}
{"time":3464,"type":"word","start":60,"end":62,"value":"de"}

이 출력에서 ​​텍스트의 각 부분은 음성 표시로 구분됩니다.

  • 시간 – 해당 오디오 스트림의 시작부터 밀리초 단위의 타임스탬프
  • 유형 – 스피치 마크의 유형(문장, 단어, viseme 또는 SSML)
  • 스타트 – 입력 텍스트에서 개체 시작의 바이트 단위 오프셋(문자 아님)(viseme 표시 제외)
  • end – 입력 텍스트에서 개체 끝의 바이트 단위 오프셋(문자 아님)(viseme 표시 제외)
  • 가치 – 문장의 개별 단어

생성된 자막 파일은 S3 버킷에 다시 기록됩니다. 아래에서 파일을 찾을 수 있습니다. <ROOT_S3_BUCKET>/<UID>/subtitlesOutput/. 자막 파일을 검사하십시오. 내용은 다음 텍스트와 유사해야 합니다.

1
00:00:00,006 --> 00:00:03,226
¿Qué tal el idioma? Ya sabes, hablé antes sobre el

2
00:00:03,227 --> 00:00:06,065
hecho de que el año pasado lanzamos Polly y Lex,

3
00:00:06,066 --> 00:00:09,263
pero hay muchas otras cosas que los constructores quieren hacer

4
00:00:09,264 --> 00:00:11,642
con el lenguaje. Y una de las cosas que ha

5
00:00:11,643 --> 00:00:14,549
sido interesante es que ahora hay tantos datos que están

자막 파일과 오디오 파일이 생성된 후 MediaConvert를 사용하여 최종 소스 비디오 파일이 생성됩니다. MediaConvert 콘솔을 확인하여 작업 상태가 다음인지 확인하십시오. COMPLETE.

MediaConvert 작업이 완료되면 최종 비디오 파일이 생성되어 아래에 있는 S3 버킷에 다시 저장됩니다. <ROOT_S3_BUCKET>/<UID>/convertedAV/.

이 배포의 일부로 최종 비디오는 다음을 통해 배포됩니다. 아마존 CloudFront를 (CDN) 링크 및 터미널 또는 AWS 클라우드 포메이션 콘솔.

오디오 및 자막에 대한 추가 옵션이 있는 원본 비디오를 보려면 브라우저에서 URL을 엽니다. 번역된 오디오와 자막이 동기화되어 있는지 확인할 수 있습니다.

결론

이 게시물에서 우리는 수동 개입 없이 새로운 언어 버전의 비디오 파일을 만드는 방법에 대해 논의했습니다. 콘텐츠 제작자는 이 프로세스를 사용하여 비디오의 오디오와 자막을 동기화하고 전 세계 청중에게 다가갈 수 있습니다.

이 접근 방식을 자체 프로덕션 파이프라인에 쉽게 통합하여 필요에 따라 대량으로 처리하고 확장할 수 있습니다. Amazon Polly 사용 신경 TTS(NTTS) 자연스럽고 사람과 같은 TTS(텍스트 음성 변환) 음성을 생성합니다. 또한 지원합니다 SSML에서 음성 생성, Amazon Polly가 제공된 텍스트에서 음성을 생성하는 방법을 추가로 제어할 수 있습니다. Amazon Polly는 또한 다양한 다양한 목소리 귀하의 요구를 지원하기 위해 여러 언어로.

다음을 방문하여 AWS 기계 학습 서비스를 시작하십시오. G 시리즈 페이지, 또는 아마존 머신 러닝 솔루션 랩 전문가와 협력하여 조직에 기계 학습 솔루션을 제공할 수 있는 페이지입니다.

추가 리소스

이 솔루션에서 사용하는 서비스에 대한 자세한 내용은 다음을 참조하십시오.


저자 소개

레이건 로사리오 AWS에서 교육 기술 회사에 중점을 둔 솔루션 설계자로 일하고 있습니다. 그는 고객이 AWS 클라우드에서 확장 가능하고 가용성이 높으며 안전한 솔루션을 구축하도록 돕는 것을 좋아합니다. 그는 소프트웨어 엔지니어링 및 아키텍처에 중점을 둔 다양한 기술 역할에서 XNUMX년 이상의 경험을 가지고 있습니다.

아닐 코달리 Amazon Web Services의 솔루션 아키텍트입니다. 그는 AWS EdTech 고객과 협력하여 기존 워크로드를 클라우드로 마이그레이션하고 클라우드 우선 접근 방식으로 새로운 워크로드를 설계하기 위한 아키텍처 모범 사례를 안내합니다. AWS에 합류하기 전에 그는 대규모 소매업체와 협력하여 클라우드 마이그레이션을 도왔습니다.

프라산나 사라스와티 크리슈난 EdTech 고객과 협력하는 Amazon Web Services의 솔루션 아키텍트입니다. 그는 모범 사례를 사용하여 클라우드 아키텍처 및 데이터 전략을 추진하도록 돕습니다. 그의 배경은 분산 컴퓨팅, 빅 데이터 분석 및 데이터 엔지니어링입니다. 그는 기계 학습과 자연어 처리에 열정적입니다.

spot_img

최신 인텔리전스

spot_img