با آمازون ترانویسی، آمازون ترنسلیت، و آمازون پولی پلاتوبلاکچین اطلاعاتی از موانع زبانی عبور کنید. جستجوی عمودی Ai.

با آمازون ترانویسی، آمازون ترنسلیت و آمازون پولی از موانع زبانی عبور کنید

تصور کنید یک جراح بدون نیاز به مترجم انسانی با بیماران در سراسر جهان تماس ویدیویی برقرار می کند. اگر یک استارتاپ نوپا بتواند به راحتی محصول خود را در سراسر مرزها و بازارهای جغرافیایی جدید با ارائه پشتیبانی روان، دقیق و چند زبانه مشتری و فروش، بدون نیاز به مترجم انسانی زنده گسترش دهد، چه؟ چه اتفاقی برای کسب‌وکار شما می‌افتد وقتی دیگر به زبان محدود نیستید؟

امروزه برگزاری جلسات مجازی با تیم های بین المللی و مشتریانی که به زبان های مختلف صحبت می کنند معمول است. چه جلسات داخلی یا خارجی باشند، به این معنی که اغلب در بحث‌های پیچیده گم می‌شوید و ممکن است با موانع زبانی مواجه شوید که مانع از تأثیرگذاری شما به همان اندازه که می‌توانید باشید.

در این پست، نحوه استفاده از سه سرویس AWS کاملاً مدیریت شده (آمازون رونوشت, ترجمه آمازونو آمازون پولی) برای تولید یک راه حل مترجم گفتار به گفتار در زمان واقعی که می تواند به سرعت ورودی صدای زنده یک گوینده منبع را به زبان مقصد گفتاری، دقیق و ترجمه شده ترجمه کند، همه با تجربه یادگیری ماشینی (ML) صفر.

بررسی اجمالی راه حل

مترجم ما شامل سه سرویس AWS ML کاملاً مدیریت شده است که با هم در یک اسکریپت پایتون با استفاده از AWS SDK برای پایتون (Boto3) برای ترجمه متن و بخش های متن به گفتار ما، و یک SDK جریان ناهمزمان برای رونویسی ورودی صوتی.

رونویسی آمازون: پخش جریانی گفتار به متن

اولین سرویسی که در پشته ما استفاده می کنید Amazon Transcript است، یک سرویس کاملاً مدیریت شده گفتار به متن که گفتار ورودی را دریافت کرده و آن را به متن رونویسی می کند. Amazon Transcript روش‌های جذب انعطاف‌پذیر، دسته‌ای یا جریانی دارد، زیرا فایل‌های صوتی ذخیره‌شده یا جریان داده‌های صوتی را می‌پذیرد. در این پست شما از SDK جریان ناهمزمان رونویسی آمازون برای پایتون، که از پروتکل جریان HTTP/2 برای پخش صدای زنده و دریافت رونوشت های زنده استفاده می کند.

هنگامی که ما برای اولین بار این نمونه اولیه را ساختیم، جذب جریانی Amazon Transcribe از تشخیص خودکار زبان پشتیبانی نمی‌کرد، اما از نوامبر 2021 دیگر اینطور نیست. هم انتقال دسته‌ای و هم پخش جریانی اکنون از تشخیص خودکار زبان برای همه پشتیبانی می‌کنند. زبانهای پشتیبانی شده. در این پست، ما نشان می‌دهیم که چگونه یک راه‌حل مبتنی بر پارامتر از طریق یک طراحی بدون پارامتر چند زبانه بدون درز از طریق استفاده از تشخیص خودکار زبان جریانی امکان‌پذیر است. پس از اینکه بخش گفتار رونویسی شده ما به صورت متن برگردانده شد، شما درخواستی را به مترجم آمازون برای ترجمه و بازگرداندن نتایج در رونویسی آمازون ما ارسال می کنید. EventHandler روش.

ترجمه آمازون: API ترجمه پیشرفته و کاملاً مدیریت شده

بعدی در پشته ما، Amazon Translate است، یک سرویس ترجمه ماشینی عصبی که ترجمه زبانی سریع، با کیفیت بالا، مقرون به صرفه و قابل تنظیم را ارائه می دهد. از ژوئن 2022، آمازون مترجم از ترجمه به 75 زبان پشتیبانی می‌کند، با جفت‌های زبانی جدید و بهبودهایی که دائماً انجام می‌شود. مترجم آمازون از مدل‌های یادگیری عمیق میزبانی شده در معماری AWS Cloud بسیار مقیاس‌پذیر و انعطاف‌پذیر استفاده می‌کند تا بسته به مورد استفاده شما، ترجمه‌های دقیق را به‌سرعت در زمان واقعی یا دسته‌ای ارائه کند. استفاده از مترجم آمازون ساده است و نیازی به مدیریت معماری اساسی یا مهارت های ML ندارد. ترجمه آمازون دارای چندین ویژگی است، مانند ایجاد و استفاده از یک اصطلاحات سفارشی برای انجام نقشه برداری بین اصطلاحات خاص صنعت. برای کسب اطلاعات بیشتر در مورد محدودیت های سرویس ترجمه آمازون، مراجعه کنید دستورالعمل ها و محدودیت ها. پس از اینکه برنامه متن ترجمه شده را به زبان مقصد ما دریافت کرد، متن ترجمه شده را برای پخش فوری صوتی ترجمه شده به Amazon Polly ارسال می کند.

Amazon Polly: API تبدیل متن به گفتار کاملاً مدیریت شده

در نهایت، متن ترجمه شده را به Amazon Polly می‌فرستید، یک سرویس تبدیل متن به گفتار کاملاً مدیریت شده که می‌تواند پاسخ‌های کلیپ صوتی واقعی را برای پخش فوری پخش ارسال کند یا به صورت دسته‌ای و ذخیره شده در سرویس ذخیره سازی ساده آمازون (Amazon S3) برای استفاده بعدی. شما می توانید جنبه های مختلف گفتار مانند تلفظ، صدا، زیر و بم، سرعت گفتار و موارد دیگر را با استفاده از استاندارد کنترل کنید. زبان نشانه گذاری سنتز گفتار (SSML).

شما می توانید گفتار را برای برخی از Amazon Polly ترکیب کنید صداهای عصبی از سبک Newscaster استفاده کنید تا آنها را شبیه گوینده اخبار تلویزیون یا رادیو کنید. همچنین می توانید تشخیص دهید که چه زمانی کلمات یا جملات خاصی در متن بر اساس فراداده موجود در جریان صوتی گفته می شود. این به توسعه‌دهنده اجازه می‌دهد تا برجسته‌سازی گرافیکی و انیمیشن‌ها، مانند حرکات لب آواتار را با گفتار ترکیب‌شده همگام کند.

شما می توانید تلفظ کلمات خاص مانند نام شرکت، کلمات اختصاری، کلمات خارجی یا نو شناسی را تغییر دهید، برای مثال "P!nk"، "ROTFL" یا "C'est la vie" (زمانی که به زبان غیر فرانسوی صحبت می شود. صدا)، با استفاده از واژگان سفارشی.

نمای کلی معماری

نمودار زیر معماری راه حل ما را نشان می دهد.

این نمودار جریان داده را از دستگاه مشتری به Amazon Transcript، Amazon Translate و Amazon Polly نشان می دهد

گردش کار به شرح زیر است:

  1. صدا توسط Python SDK دریافت می شود.
  2. آمازون پولی گفتار را به 39 زبان ممکن به متن تبدیل می کند.
  3. ترجمه آمازون زبان ها را تبدیل می کند.
  4. Amazon Live Transcript متن را به گفتار تبدیل می کند.
  5. صدا به بلندگوها خروجی می شود.

پیش نیازها

شما به یک دستگاه میزبان با میکروفون، بلندگو و اتصال اینترنتی قابل اعتماد نیاز دارید. یک لپ تاپ مدرن باید برای این کار خوب عمل کند زیرا به سخت افزار اضافی نیاز نیست. در مرحله بعد، باید دستگاه را با چند ابزار نرم افزاری راه اندازی کنید.

شما باید Python 3.7+ را برای استفاده از SDK جریان ناهمزمان Amazon Transcribe و برای یک ماژول پایتون به نام نصب کرده باشید. pyaudio، که برای کنترل میکروفون و بلندگوهای دستگاه استفاده می کنید. این ماژول به یک کتابخانه C به نام بستگی دارد portaudio.h. اگر با مشکلاتی مواجه شدید pyaudio خطاها، پیشنهاد می کنیم سیستم عامل خود را بررسی کنید تا ببینید آیا آن را دارید یا خیر portaudio.h کتابخانه نصب شده است

برای مجوز و احراز هویت تماس های سرویس، شما یک هویت AWS و مدیریت دسترسی نقش سرویس (IAM) با مجوز برای فراخوانی خدمات AWS ضروری. با پیکربندی رابط خط فرمان AWS (AWS CLI) با این نقش سرویس IAM، می توانید اسکریپت ما را بدون نیاز به ارسال کلیدها یا رمزهای عبور بر روی دستگاه خود اجرا کنید، زیرا کتابخانه های AWS برای استفاده از اطلاعات کاربری پیکربندی شده AWS CLI نوشته شده اند. این یک روش راحت برای نمونه سازی سریع است و تضمین می کند که خدمات ما توسط یک هویت مجاز فراخوانی می شوند. مانند همیشه، هنگام ایجاد یک کاربر یا نقش IAM، هنگام تخصیص خط مشی های IAM از اصل حداقل امتیاز پیروی کنید.

برای جمع بندی، به پیش نیازهای زیر نیاز دارید:

  • یک رایانه شخصی، مک یا دستگاه لینوکس با میکروفون، بلندگوها و اتصال به اینترنت
  • La portaudio.h کتابخانه C برای سیستم عامل شما (brew, apt get, wget) که برای کارکردن pyaudio لازم است
  • AWS CLI 2.0 با کاربر مجاز IAM که با اجرای پیکربندی aws در AWS CLI پیکربندی شده است.
  • پایتون 3.7+
  • آمازون رونویسی Python SDK ناهمزمان
  • کتابخانه های پایتون زیر:
    • boto3
    • amazon-transcribe
    • pyaudio
    • asyncio
    • concurrent

راه حل را اجرا کنید

شما به‌عنوان نقطه‌ی شروع، به شدت بر روی SDK پخش ناهمزمان Amazon Transcribe برای پایتون تکیه می‌کنید و می‌خواهید بر روی آن SDK خاص بسازید. بعد از اینکه SDK جریان برای پایتون را آزمایش کردید، اضافه می کنید میکروفون جریان ورودی با استفاده از pyaudio، یک کتابخانه منبع باز Python که برای دستکاری داده های صوتی استفاده می شود. سپس برای قابلیت ترجمه و تبدیل متن به گفتار، تماس‌های Boto3 را به مترجم آمازون و آمازون پولی اضافه می‌کنید. در نهایت، شما دوباره گفتار ترجمه شده را از طریق بلندگوهای رایانه پخش می کنید pyaudio. ماژول پایتون concurrent به شما این امکان را می دهد که کد مسدود کننده را در رشته ناهمزمان خود اجرا کنید تا گفتار بازگشتی آمازون پولی خود را به روشی یکپارچه و غیر مسدود پخش کنید.

بیایید همه ماژول‌های ضروری خود را وارد کنیم، کلاس‌های جریان را رونویسی کنیم و برخی از جهانی‌ها را نمونه‌سازی کنیم:

import boto3
 import asyncio
 import pyaudio
 import concurrent
 from amazon_transcribe.client import TranscribeStreamingClient
 from amazon_transcribe.handlers import TranscriptResultStreamHandler
 from amazon_transcribe.model import TranscriptEvent


 polly = boto3.client('polly', region_name = 'us-west-2')
 translate = boto3.client(service_name='translate', region_name='us-west-2', use_ssl=True)
 pa = pyaudio.PyAudio()

 #for mic stream, 1024 should work fine
 default_frames = 1024

 #current params are set up for English to Mandarin, modify to your liking
 params['source_language'] = "en"
 params['target_language'] = "zh"
 params['lang_code_for_polly'] = "cmn-CN"
 params['voice_id'] = "Zhiyu"
 params['lang_code_for_transcribe'] = "en-US"

اول، شما استفاده کنید pyaudio برای به دست آوردن نرخ نمونه برداری، شاخص دستگاه و تعداد کانال دستگاه ورودی:

#try grabbing the default input device and see if we get lucky
 default_indput_device = pa.get_default_input_device_info()

 # verify this is your microphone device 
 print(default_input_device)

 #if correct then set it as your input device and define some globals
 input_device = default_input_device

 input_channel_count = input_device["maxInputChannels"]
 input_sample_rate = input_device["defaultSampleRate"]
 input_dev_index = input_device["index"]

اگر این کار نمی کند، می توانید مانند کد زیر دستگاه های خود را حلقه زده و چاپ کنید و سپس از فهرست دستگاه برای بازیابی اطلاعات دستگاه استفاده کنید. pyaudio:

print ("Available devices:n")
 for i in range(0, pa.get_device_count()):
     info = pa.get_device_info_by_index(i)
     print (str(info["index"])  + ": t %s n t %s n" % (info["name"], p.get_host_api_info_by_index(info["hostApi"])["name"]))

 # select the correct index from the above returned list of devices, for example zero
 dev_index = 0 
 input_device = pa.get_device_info_by_index(dev_index)

 #set globals for microphone stream
 input_channel_count = input_device["maxInputChannels"]
 input_sample_rate = input_device["defaultSampleRate"]
 input_dev_index = input_device["index"]

تو استفاده میکنی channel_count, sample_rateو dev_index به عنوان پارامتر در یک جریان میکروفون. در تابع تماس آن جریان، شما از یک استفاده می کنید asyncio تماس غیرانسدادی بدون انسداد برای قرار دادن بایت های ورودی جریان میکروفون در یک asyncio صف ورودی به اشیاء حلقه و input_queue ایجاد شده با توجه داشته باشید asyncio و نحوه استفاده از آنها در کد زیر:

async def mic_stream():
     # This function wraps the raw input stream from the microphone forwarding
     # the blocks to an asyncio.Queue.
     
     loop = asyncio.get_event_loop()
     input_queue = asyncio.Queue()
     
     def callback(indata, frame_count, time_info, status):
         loop.call_soon_threadsafe(input_queue.put_nowait, indata)
         return (indata, pyaudio.paContinue)
         
     # Be sure to use the correct parameters for the audio stream that matches
     # the audio formats described for the source language you'll be using:
     # https://docs.aws.amazon.com/transcribe/latest/dg/streaming.html
     
     print(input_device)
     
     #Open stream
     stream = pa.open(format = pyaudio.paInt16,
                 channels = input_channel_count,
                 rate = int(input_sample_rate),
                 input = True,
                 frames_per_buffer = default_frames,
                 input_device_index = input_dev_index,
                 stream_callback=callback)
     # Initiate the audio stream and asynchronously yield the audio chunks
     # as they become available.
     stream.start_stream()
     print("started stream")
     while True:
         indata = await input_queue.get()
         yield indata

حال زمانی که عملکرد ژنراتور mic_stream() نامیده می شود، تا زمانی که داده های ورودی میکروفون در صف ورودی وجود دارد، به طور مداوم بایت های ورودی را ارائه می دهد.

اکنون که می‌دانید چگونه بایت‌های ورودی را از میکروفون دریافت کنید، بیایید نحوه نوشتن بایت‌های صوتی خروجی Amazon Polly در جریان خروجی بلندگو را بررسی کنیم:

#text will come from MyEventsHandler
 def aws_polly_tts(text):

     response = polly.synthesize_speech(
         Engine = 'standard',
         LanguageCode = params['lang_code_for_polly'],
         Text=text,
         VoiceId = params['voice_id'],
         OutputFormat = "pcm",
     )
     output_bytes = response['AudioStream']
     
     #play to the speakers
     write_to_speaker_stream(output_bytes)
     
 #how to write audio bytes to speakers

 def write_to_speaker_stream(output_bytes):
     """Consumes bytes in chunks to produce the response's output'"""
     print("Streaming started...")
     chunk_len = 1024
     channels = 1
     sample_rate = 16000
     
     if output_bytes:
         polly_stream = pa.open(
                     format = pyaudio.paInt16,
                     channels = channels,
                     rate = sample_rate,
                     output = True,
                     )
         #this is a blocking call - will sort this out with concurrent later
         while True:
             data = output_bytes.read(chunk_len)
             polly_stream.write(data)
             
         #If there's no more data to read, stop streaming
             if not data:
                 output_bytes.close()
                 polly_stream.stop_stream()
                 polly_stream.close()
                 break
         print("Streaming completed.")
     else:
         print("Nothing to stream.")

حالا بیایید آنچه را که در این پست ساخته‌اید گسترش دهیم SDK جریانی رونویسی ناهمزمان آمازون برای پایتون. در کد زیر با استفاده از یک شی اجرا کننده ایجاد می کنید ThreadPoolExecutor زیر کلاس با سه کارگر همزمان. سپس یک فراخوانی از مترجم آمازون را روی رونوشت برگشتی نهایی شده در EventHandler اضافه می‌کنید و متن ترجمه شده، شی اجراکننده و ما را ارسال می‌کنید. aws_polly_tts() عملکرد به یک asyncio حلقه با loop.run_in_executor()، که تابع Amazon Polly ما (با متن ورودی ترجمه شده) را به صورت ناهمزمان در شروع تکرار بعدی اجرا می کند. asyncio حلقه

#use concurrent package to create an executor object with 3 workers ie threads
 executor = concurrent.futures.ThreadPoolExecutor(max_workers=3)

 class MyEventHandler(TranscriptResultStreamHandler):
     async def handle_transcript_event(self, transcript_event: TranscriptEvent):

         #If the transcription is finalized, send it to translate
 
         results = transcript_event.transcript.results
         if len(results) > 0:
             if len(results[0].alternatives) > 0:
                 transcript = results[0].alternatives[0].transcript
                 print("transcript:", transcript)

                 print(results[0].channel_id)
                 if hasattr(results[0], "is_partial") and results[0].is_partial == False:
                     
                     #translate only 1 channel. the other channel is a duplicate
                     if results[0].channel_id == "ch_0":
                         trans_result = translate.translate_text(
                             Text = transcript,
                             SourceLanguageCode = params['source_language'],
                             TargetLanguageCode = params['target_language']
                         )
                         print("translated text:" + trans_result.get("TranslatedText"))
                         text = trans_result.get("TranslatedText")

                         #we run aws_polly_tts with a non-blocking executor at every loop iteration
                         await loop.run_in_executor(executor, aws_polly_tts, text)  

سرانجام ، ما این را داریم loop_me() عملکرد. در آن، شما تعریف می کنید write_chunks()، که یک جریان رونویسی آمازون را به عنوان آرگومان می گیرد و به صورت ناهمزمان تکه هایی از ورودی میکروفون جریانی را روی آن می نویسد. شما سپس استفاده کنید MyEventHandler() با جریان رونویسی خروجی به عنوان آرگومان آن و ایجاد یک شی handler. سپس از await with استفاده می کنید asyncio.gather() و با استفاده از متد ()write_chunks و handler با استفاده از روش handle_events () به آینده‌های نهایی این کوروتین‌ها رسیدگی کنید. در نهایت، تمام حلقه های رویداد را جمع آوری کرده و حلقه را حلقه می کنید loop_me() عملکرد با run_until_complete(). کد زیر را ببینید:

async def loop_me():
 # Setup up our client with our chosen AWS region

     client = TranscribeStreamingClient(region="us-west-2")
     stream = await client.start_stream_transcription(
         language_code=params['lang_code_for_transcribe'],
         media_sample_rate_hz=int(device_info["defaultSampleRate"]),
         number_of_channels = 2,
         enable_channel_identification=True,
         media_encoding="pcm",
     )
     recorded_frames = []
     async def write_chunks(stream):
         
         # This connects the raw audio chunks generator coming from the microphone
         # and passes them along to the transcription stream.
         print("getting mic stream")
         async for chunk in mic_stream():
             t.tic()
             recorded_frames.append(chunk)
             await stream.input_stream.send_audio_event(audio_chunk=chunk)
             t.toc("chunks passed to transcribe: ")
         await stream.input_stream.end_stream()

     handler = MyEventHandler(stream.output_stream)
     await asyncio.gather(write_chunks(stream), handler.handle_events())

 #write a proper while loop here
 loop = asyncio.get_event_loop()
 loop.run_until_complete(loop_me())
 loop.close()

وقتی کدهای قبلی با هم بدون خطا اجرا می شوند، می توانید با میکروفون صحبت کنید و به سرعت صدای خود را که به چینی ماندارین ترجمه شده است بشنوید. ویژگی تشخیص خودکار زبان برای Amazon Transcript و Amazon Translate هر زبان ورودی پشتیبانی شده را به زبان مقصد ترجمه می کند. شما می توانید برای مدتی طولانی صحبت کنید و به دلیل ماهیت غیر مسدود کننده فراخوانی عملکرد، تمام ورودی گفتار شما ترجمه و گفتاری می شود، و این باعث می شود این ابزار عالی برای ترجمه سخنرانی های زنده باشد.

نتیجه

اگرچه این پست نشان داد که چگونه این سه API کاملاً مدیریت شده AWS می‌توانند به طور یکپارچه با هم کار کنند، ما شما را تشویق می‌کنیم تا به این فکر کنید که چگونه می‌توانید از این سرویس‌ها به روش‌های دیگری برای ارائه پشتیبانی چند زبانه برای سرویس‌ها یا رسانه‌هایی مانند زیرنویس‌های چندزبانه با کسری از هزینه فعلی استفاده کنید. . پزشکی، تجاری، و حتی روابط دیپلماتیک همگی می توانند از خدمات ترجمه همیشه در حال بهبود، کم هزینه و کم هزینه بهره مند شوند.

برای کسب اطلاعات بیشتر در مورد پایه کد اثبات مفهوم برای این مورد استفاده، ما را بررسی کنید گیتهاب.


درباره نویسنده

با آمازون ترانویسی، آمازون ترنسلیت، و آمازون پولی پلاتوبلاکچین اطلاعاتی از موانع زبانی عبور کنید. جستجوی عمودی Ai.مایکل ترن یک معمار راه حل با تیم مهندسی Envision در خدمات وب آمازون است. او راهنمایی های فنی ارائه می دهد و به مشتریان کمک می کند تا از طریق نشان دادن هنر ممکن در AWS به توانایی خود در نوآوری سرعت بخشند. او چندین نمونه اولیه در مورد هوش مصنوعی/ML و اینترنت اشیا برای مشتریان ما ساخته است. می توانید با من @Mike_Trann در توییتر تماس بگیرید.

با آمازون ترانویسی، آمازون ترنسلیت، و آمازون پولی پلاتوبلاکچین اطلاعاتی از موانع زبانی عبور کنید. جستجوی عمودی Ai.کامرون ویلکس یک معمار نمونه سازی در تیم شتاب دهنده صنعت AWS است. در حالی که در تیم حضور داشت، چندین نمونه اولیه مبتنی بر ML را به مشتریان تحویل داد تا «هنر ممکن» ML را در AWS نشان دهد. او از تولید موسیقی، آفرود و طراحی لذت می برد.

تمبر زمان:

بیشتر از آموزش ماشین AWS