Lokalisera innehåll till flera språk med hjälp av AWS maskininlärningstjänster PlatoBlockchain Data Intelligence. Vertikal sökning. Ai.

Lokalisera innehåll till flera språk med hjälp av AWS maskininlärningstjänster

Under de senaste åren har onlineutbildningsplattformar sett en ökad användning av och en ökning av efterfrågan på videobaserad inlärning eftersom det erbjuder ett effektivt medium för att engagera elever. För att expandera till internationella marknader och adressera en kulturellt och språkligt mångfaldig befolkning, tittar företag också på att diversifiera sina utbildningserbjudanden genom att lokalisera innehåll till flera språk. Dessa företag letar efter pålitliga och kostnadseffektiva sätt att lösa sina lokaliseringsanvändningsfall.

Lokalisering av innehåll innefattar främst att översätta originalröster till nya språk och lägga till visuella hjälpmedel som undertexter. Traditionellt är denna process kostsam, manuell och tar mycket tid, inklusive att arbeta med lokaliseringsspecialister. Med kraften i AWS maskininlärning (ML) tjänster som t.ex Amazon Transcribe, Amazon Translateoch Amazon Polly, kan du skapa en hållbar och kostnadseffektiv lokaliseringslösning. Du kan använda Amazon Transcribe för att skapa en transkription av dina befintliga ljud- och videoströmmar och sedan översätta denna transkription till flera språk med Amazon Translate. Du kan sedan använda Amazon Polly, en text-till-tal-tjänst, för att konvertera den översatta texten till naturligt klingande mänskligt tal.

Nästa steg i lokaliseringen är att lägga till undertexter till innehållet, vilket kan förbättra tillgängligheten och förståelsen och hjälpa tittarna att förstå videorna bättre. Att skapa undertexter på videoinnehåll kan vara utmanande eftersom det översatta talet inte stämmer överens med den ursprungliga talets timing. Denna synkronisering mellan ljud och undertexter är en viktig uppgift att överväga eftersom den kan koppla bort publiken från ditt innehåll om de inte är synkroniserade. Amazon Polly erbjuder en lösning på denna utmaning genom att möjliggöra talmärken, som du kan använda för att skapa en undertextfil som kan synkroniseras med den genererade talutgången.

I det här inlägget granskar vi en lokaliseringslösning som använder AWS ML-tjänster där vi använder en original engelsk video och konverterar den till spanska. Vi fokuserar också på att använda talmärken för att skapa en synkroniserad undertextfil på spanska.

Lösningsöversikt

Följande diagram illustrerar lösningsarkitekturen.

Lösningen tar en videofil och målspråksinställningarna som indata och använder Amazon Transcribe för att skapa en transkription av videon. Vi använder sedan Amazon Translate för att översätta transkriptet till målspråket. Den översatta texten tillhandahålls som en input till Amazon Polly för att generera ljudströmmen och talmärken på målspråket. Amazon Polly återvänder utmatning av talmärken i en radavgränsad JSON-ström, som innehåller fälten som tid, typ, start, slut och värde. Värdet kan variera beroende på vilken typ av talmärke som efterfrågas i inmatningen, t.ex SSML, viseme, ord eller mening. För vårt exempel begärde vi att typ av talmärke as word. Med det här alternativet delar Amazon Polly upp en mening i sina enskilda ord i meningen och deras start- och sluttider i ljudströmmen. Med denna metadata bearbetas sedan talmärkena för att generera undertexterna för motsvarande ljudström som genereras av Amazon Polly.

Slutligen använder vi AWS Elemental MediaConvert för att återge den slutliga videon med det översatta ljudet och motsvarande undertexter.

Följande video visar det slutliga resultatet av lösningen:

AWS stegfunktioner arbetsflöde

Vi använder AWS stegfunktioner att orkestrera denna process. Följande figur visar en vy på hög nivå av arbetsflödet för stegfunktioner (vissa steg har utelämnats från diagrammet för bättre tydlighet).

Lokalisera innehåll till flera språk med hjälp av AWS maskininlärningstjänster PlatoBlockchain Data Intelligence. Vertikal sökning. Ai.

Arbetsflödesstegen är följande:

  1. En användare laddar upp källvideofilen till en Amazon enkel lagringstjänst (Amazon S3) hink.
  2. Smakämnen S3 händelseavisering utlöser AWS Lambda fungera state_machine.py (visas inte i diagrammet), vilket anropar tillståndsmaskinen för stegfunktioner.
  3. Det första steget, Transkribera ljud, anropar Lambda-funktionen transcribe.py, som använder Amazon Transcribe för att generera en transkription av ljudet från källvideon.

Följande exempelkod visar hur man skapar ett transkriptionsjobb med Amazon Transcribe Boto3 Python SDK:

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

När jobbet är klart sparas utdatafilerna i S3-hinken och processen fortsätter till nästa steg för att översätta innehållet.

  1. Smakämnen Översätt transkription steg anropar Lambda-funktionen translate.py som använder Amazon Translate för att översätta avskriften till målspråket. Här använder vi den synkrona/realtidsöversättningen med hjälp av översätt_text fungera:
    # Real-time translation
    response = translate.translate_text(
        Text=transcribe_text,
        SourceLanguageCode=source_language_code,
        TargetLanguageCode=target_language_code,
    )
    

    Synkron översättning har begränsningar för dokumentstorleken den kan översätta; När detta skrivs är den inställd på 5,000 XNUMX byte. För större dokumentstorlekar, överväg att använda en asynkron väg för att skapa jobbet med start_text_translation_job och kontrollera status via beskriv_text_översättningsjobb.

  2. Nästa steg är ett Steg Funktioner Parallell stat, där vi skapar parallella grenar i vår statsmaskin.
    1. I den första grenen anropar vi lambdafunktionen lambdafunktionen generera_polly_audio.py för att generera vår Amazon Polly-ljudström:
      # 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']

      Här använder vi start_speech_synthesis_task metod för Amazon Polly Python SDK för att utlösa talsyntesuppgiften som skapar Amazon Polly-ljudet. Vi ställer in OutputFormat till mp3, som säger åt Amazon Polly att generera en ljudström för detta API-anrop.

    2. I den andra grenen anropar vi Lambda-funktionen generera_speech_marks.py för att generera talmärken:
      ....
      # 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']

  • Vi använder återigen start_speech_synthesis_task metod men specificera OutputFormat till json, som säger åt Amazon Polly att generera talmärken för detta API-anrop.

I nästa steg i den andra grenen anropar vi Lambda-funktionen generera_undertexter.py, som implementerar logiken för att generera en undertextfil från utmatningen av talmärken.

Den använder Python-modulen i filen webvtt_utils.py. Den här modulen har flera verktygsfunktioner för att skapa undertextfilen; en sådan metod get_phrases_from_speechmarks är ansvarig för att analysera speech marks-filen. Talmärkens JSON-struktur ger bara starttiden för varje ord individuellt. För att skapa den undertextning som krävs för SRT-filen, skapar vi först fraser med cirka n (där n=10) ord från listan över ord i speech marks-filen. Sedan skriver vi dem i SRT-filformatet, tar starttiden från det första ordet i frasen, och för sluttiden använder vi starttiden för ordet (n+1) och subtraherar det med 1 för att skapa den sekvenserade posten . Följande funktion skapar fraserna som förberedelse för att skriva dem till SRT-filen:

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. Det sista steget, Medie Konvertera, anropar Lambda-funktionen create_mediaconvert_job.py att kombinera ljudströmmen från Amazon Polly och undertextfilen med källvideofilen för att generera den slutliga utdatafilen, som sedan lagras i en S3-hink. Detta steg använder MediaConvert, en filbaserad videoomkodningstjänst med funktioner i sändningsklass. Den låter dig enkelt skapa video-on-demand-innehåll och kombinerar avancerade video- och ljudfunktioner med ett enkelt webbgränssnitt. Även här använder vi Python Boto3 SDK för att skapa en MediaConvert jobb:
    ……
    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"])

Förutsättningar

Innan du börjar måste du ha följande förutsättningar:

Distribuera lösningen

Utför följande steg för att distribuera lösningen med AWS CDK:

  1. Klona Repository:
    git clone https://github.com/aws-samples/localize-content-using-aws-ml-services.git 

  2. För att säkerställa att AWS CDK är det stövlar, kör kommandot cdk bootstrap från roten av förvaret:
    $ 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. Ändra arbetskatalogen till roten av förvaret och kör följande kommando:
    cdk deploy

Som standard är målljudinställningarna inställda på amerikansk spanska (es-US). Om du planerar att testa det med ett annat målspråk, använd följande kommando:

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

Processen tar några minuter att slutföra, varefter den visar en länk som du kan använda för att visa målvideofilen med översatt ljud och översatta undertexter.

Lokalisera innehåll till flera språk med hjälp av AWS maskininlärningstjänster PlatoBlockchain Data Intelligence. Vertikal sökning. Ai.

Testa lösningen

För att testa denna lösning använde vi en liten del av följande AWS re:Invent 2017-video från YouTube, där Amazon Transcribe först introducerades. Du kan också testa lösningen med din egen video. Originalspråket för vår testvideo är engelska. När du distribuerar den här lösningen kan du ange målljudinställningarna eller så kan du använda standardinställningarna för målljud, som använder spanska för att generera ljud och undertexter. Lösningen skapar en S3-hink som kan användas för att ladda upp videofilen till.

  1. På Amazon S3-konsolen, navigera till hinken PollyBlogBucket.
    Lokalisera innehåll till flera språk med hjälp av AWS maskininlärningstjänster PlatoBlockchain Data Intelligence. Vertikal sökning. Ai.
  2. Välj hink, navigera till /inputVideo katalogen och ladda upp videofilen (lösningen testas med videor av typen mp4). Vid denna tidpunkt utlöser ett S3-händelsemeddelande Lambda-funktionen, som startar tillståndsmaskinen.
  3. På Step Functions-konsolen bläddrar du till tillståndsmaskinen (ProcessAudioWithSubtitles).
  4. Välj en av körningarna av tillståndsmaskinen för att lokalisera Grafinspektör.

Detta visar körresultaten för varje stat. Arbetsflödet för Stegfunktioner tar några minuter att slutföra, varefter du kan verifiera om alla steg har slutförts.

Lokalisera innehåll till flera språk med hjälp av AWS maskininlärningstjänster PlatoBlockchain Data Intelligence. Vertikal sökning. Ai.

Granska utgången

För att granska utdata, öppna Amazon S3-konsolen och kontrollera om ljudfilen (.mp3) och talmärkesfilen (.marks) är lagrade i S3-hinken under <ROOT_S3_BUCKET>/<UID>/synthesisOutput/.

Lokalisera innehåll till flera språk med hjälp av AWS maskininlärningstjänster PlatoBlockchain Data Intelligence. Vertikal sökning. Ai.

Följande är ett exempel på talmarkeringsfilen som genereras från den översatta texten:

{"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"}

I denna utgång är varje del av texten uppdelad i termer av talmärken:

  • tid – Tidsstämpeln i millisekunder från början av motsvarande ljudström
  • Typ – Typen av talmärke (mening, ord, viseme eller SSML)
  • starta – Förskjutningen i byte (inte tecken) för början av objektet i inmatningstexten (exklusive visememärken)
  • änden – Förskjutningen i byte (inte tecken) av objektets ände i inmatningstexten (exklusive visemmärken)
  • värde – Enstaka ord i meningen

Den genererade undertextfilen skrivs tillbaka till S3-hinken. Du hittar filen under <ROOT_S3_BUCKET>/<UID>/subtitlesOutput/. Inspektera undertextfilen; innehållet ska likna följande text:

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

Efter att undertextfilen och ljudfilen har genererats skapas den slutliga källvideofilen med MediaConvert. Kontrollera MediaConvert-konsolen för att verifiera om jobbstatusen är COMPLETE.

När MediaConvert-jobbet är klart genereras den slutliga videofilen och sparas tillbaka till S3-hinken, som finns under <ROOT_S3_BUCKET>/<UID>/convertedAV/.

Som en del av denna distribution distribueras den slutliga videon via en Amazon CloudFront (CDN) länk och visas i terminalen eller i AWS molnformation konsol.

Öppna URL:en i en webbläsare för att se originalvideon med ytterligare alternativ för ljud och undertexter. Du kan verifiera att det översatta ljudet och undertexterna är synkroniserade.

Slutsats

I det här inlägget diskuterade vi hur man skapar nya språkversioner av videofiler utan behov av manuell intervention. Innehållsskapare kan använda denna process för att synkronisera ljud och undertexter på sina videor och nå en global publik.

Du kan enkelt integrera detta tillvägagångssätt i dina egna produktionspipelines för att hantera stora volymer och skala efter dina behov. Amazon Polly använder Neural TTS (NTTS) att producera naturliga och mänskliga text-till-tal-röster. Det stöder också genererar tal från SSML, vilket ger dig ytterligare kontroll över hur Amazon Polly genererar tal från den tillhandahållna texten. Amazon Polly tillhandahåller också en en mängd olika röster på flera språk för att stödja dina behov.

Kom igång med AWS maskininlärningstjänster genom att besöka Produktsida, eller hänvisa till Amazon Machine Learning Solutions Lab sida där du kan samarbeta med experter för att ta fram maskininlärningslösningar till din organisation.

Ytterligare resurser

För mer information om tjänsterna som används i den här lösningen, se följande:


Om författarna

Lokalisera innehåll till flera språk med hjälp av AWS maskininlärningstjänster PlatoBlockchain Data Intelligence. Vertikal sökning. Ai. Reagan Rosario arbetar som lösningsarkitekt på AWS med fokus på utbildningsteknikföretag. Han älskar att hjälpa kunder att bygga skalbara, högt tillgängliga och säkra lösningar i AWS-molnet. Han har mer än ett decenniums erfarenhet av att arbeta i en mängd olika teknikroller, med fokus på mjukvaruteknik och arkitektur.

Lokalisera innehåll till flera språk med hjälp av AWS maskininlärningstjänster PlatoBlockchain Data Intelligence. Vertikal sökning. Ai.Anil Kodali är en lösningsarkitekt med Amazon Web Services. Han arbetar med AWS EdTech-kunder och vägleder dem med arkitektoniska bästa praxis för att migrera befintliga arbetsbelastningar till molnet och designa nya arbetsbelastningar med molnet först. Innan han började med AWS arbetade han med stora återförsäljare för att hjälpa dem med deras molnmigrering.

Lokalisera innehåll till flera språk med hjälp av AWS maskininlärningstjänster PlatoBlockchain Data Intelligence. Vertikal sökning. Ai.Prasanna Saraswathi Krishnan är en lösningsarkitekt med Amazon Web Services och arbetar med EdTech-kunder. Han hjälper dem att driva sin molnarkitektur och datastrategi med hjälp av bästa praxis. Hans bakgrund är inom distribuerad datoranvändning, big data-analys och datateknik. Han brinner för maskininlärning och naturlig språkbehandling.

Tidsstämpel:

Mer från AWS maskininlärning