اختراق حواجز اللغة باستخدام Amazon Transcribe و Amazon Translate و Amazon Polly PlatoBlockchain Data Intelligence. البحث العمودي. عاي.

اخترق حواجز اللغة باستخدام Amazon Transcribe و Amazon Translate و Amazon Polly

تخيل جراحًا يجري مكالمات فيديو مع مرضى في جميع أنحاء العالم دون الحاجة إلى مترجم بشري. ماذا لو تمكنت شركة ناشئة من توسيع منتجاتها بسهولة عبر الحدود وفي أسواق جغرافية جديدة من خلال تقديم دعم ومبيعات مرنة ودقيقة ومتعددة اللغات للعملاء ، كل ذلك دون الحاجة إلى مترجم بشري مباشر؟ ماذا يحدث لعملك عندما لم تعد ملزمًا باللغة؟

من الشائع اليوم عقد اجتماعات افتراضية مع فرق عمل دولية وعملاء يتحدثون العديد من اللغات المختلفة. سواء كانت اجتماعات داخلية أو خارجية ، فهذا يعني أنه غالبًا ما تضيع في المناقشات المعقدة وقد تواجه حواجز لغوية تمنعك من أن تكون فعالاً قدر الإمكان.

في هذا المنشور ، ستتعلم كيفية استخدام ثلاث خدمات AWS مُدارة بالكامل (الأمازون النسخ, ترجمة أمازونو الأمازون بولي) لإنتاج حل شبه فوري لمترجم الكلام إلى كلام يمكنه بسرعة ترجمة الإدخال الصوتي المباشر لمتحدث المصدر إلى لغة هدف منطوقة ودقيقة ومترجمة ، وكل ذلك بدون تجربة تعلم آلي (ML).

نظرة عامة على الحل

يتكون مترجمنا من ثلاث خدمات AWS ML مُدارة بالكامل تعمل معًا في نص Python واحد باستخدام AWS SDK لـ Python (Boto3) لترجمة النصوص وأجزاء تحويل النص إلى كلام ، و SDK المتدفق غير المتزامن لنسخ إدخال الصوت.

Amazon Transcribe: دفق الكلام إلى نص

الخدمة الأولى التي تستخدمها في مجموعتنا هي Amazon Transcribe ، وهي خدمة تحويل الكلام إلى نص مُدارة بالكامل تأخذ كلام الإدخال وتحويله إلى نص. تتميز Amazon Transcribe بطرق استيعاب مرنة ، سواء كانت مجمعة أو متدفقة ، لأنها تقبل إما الملفات الصوتية المخزنة أو دفق البيانات الصوتية. في هذا المنشور ، تستخدم ملف Amazon Transcribe غير متزامن تدفق SDK لـ Python، والذي يستخدم بروتوكول دفق HTTP / 2 لدفق الصوت الحي وتلقي النسخ الحية.

عندما قمنا ببناء هذا النموذج الأولي لأول مرة ، لم يكن البث المتدفق في Amazon Transcribe يدعم الاكتشاف التلقائي للغة ، ولكن لم يعد هذا هو الحال اعتبارًا من نوفمبر 2021. يدعم كل من عرض الدفعة والبث المباشر الآن اكتشاف اللغة التلقائي للجميع اللغات المدعومة. في هذا المنشور ، نوضح كيف يمكن إيجاد حل قائم على المعلمات من خلال تصميم سلس متعدد اللغات بدون معلمات من خلال استخدام الكشف التلقائي عن اللغة المتدفقة. بعد إرجاع مقطع الكلام المكتوب كنص ، تقوم بإرسال طلب إلى Amazon Translate لترجمة النتائج وإرجاعها في Amazon Transcribe EventHandler الأسلوب.

Amazon Translate: أحدث واجهة برمجة تطبيقات للترجمة مُدارة بالكامل

التالي في مجموعتنا هو Amazon Translate ، وهي خدمة ترجمة آلية عصبية توفر ترجمة لغة سريعة وعالية الجودة وبأسعار معقولة وقابلة للتخصيص. اعتبارًا من يونيو 2022 ، تدعم Amazon Translate الترجمة عبر 75 لغة ، مع إجراء تحسينات وأزواج لغوية جديدة باستمرار. تستخدم Amazon Translate نماذج التعلم العميق المستضافة على بنية سحابة AWS عالية المرونة وقابلة للتطوير لتقديم ترجمات دقيقة بسرعة إما في الوقت الفعلي أو في مجموعات ، اعتمادًا على حالة الاستخدام الخاصة بك. يعد استخدام Amazon Translate واضحًا ولا يتطلب أي إدارة للهندسة المعمارية الأساسية أو مهارات تعلم الآلة. يحتوي Amazon Translate على العديد من الميزات ، مثل إنشاء واستخدام ملف المصطلحات المخصصة للتعامل مع رسم الخرائط بين المصطلحات الخاصة بالصناعة. لمزيد من المعلومات حول حدود خدمة Amazon Translate ، يرجى الرجوع إلى إرشادات وقيود. بعد أن يتلقى التطبيق النص المترجم بلغتنا المستهدفة ، فإنه يرسل النص المترجم إلى Amazon Polly لتشغيل الصوت المترجم الفوري.

Amazon Polly: واجهة برمجة تطبيقات لتحويل النص إلى كلام مُدارة بالكامل

أخيرًا ، تقوم بإرسال النص المترجم إلى Amazon Polly ، وهي خدمة تحويل نص إلى كلام مُدارة بالكامل يمكنها إما إرسال استجابات مقاطع صوتية واقعية لتشغيل البث الفوري أو تجميعها وحفظها في خدمة تخزين أمازون البسيطة (Amazon S3) للاستخدام لاحقًا. يمكنك التحكم في جوانب مختلفة من الكلام مثل النطق ، ومستوى الصوت ، وطبقة الصوت ، ومعدل الكلام ، والمزيد باستخدام المعيار لغة ترميز تركيب الكلام (اس اس ام ال).

يمكنك تجميع الكلام لبعض Amazon Polly أصوات عصبية باستخدام أسلوب المذيع لجعلها تبدو وكأنها مذيع أخبار التلفزيون أو الراديو. يمكنك أيضًا اكتشاف وقت نطق كلمات أو جمل محددة في النص بناءً على البيانات الوصفية المضمنة في دفق الصوت. يسمح هذا للمطور بمزامنة التمييز الرسومي والرسوم المتحركة ، مثل حركات الشفاه في الصورة الرمزية ، مع الكلام المركب.

يمكنك تعديل نطق كلمات معينة ، مثل أسماء الشركات أو الاختصارات أو الكلمات الأجنبية أو الاصطلاحات الجديدة ، على سبيل المثال "P! nk" أو "ROTFL" أو "C'est la vie" (عند التحدث بلغة غير فرنسية صوت) ، باستخدام المعاجم المخصصة.

نظرة عامة على العمارة

يوضح الرسم البياني التالي بنية الحلول لدينا.

يوضح هذا الرسم البياني تدفق البيانات من جهاز العميل إلى Amazon Transcribe و Amazon Translate و Amazon Polly

سير العمل كما يلي:

  1. يتم استيعاب الصوت بواسطة Python SDK.
  2. يحول Amazon Polly الكلام إلى نص بـ 39 لغة ممكنة.
  3. يقوم Amazon Translate بتحويل اللغات.
  4. يحول Amazon Live Transcribe النص إلى كلام.
  5. يتم إخراج الصوت إلى مكبرات الصوت.

المتطلبات الأساسية المسبقة

أنت بحاجة إلى جهاز مضيف تم إعداده بميكروفون ومكبرات صوت واتصال موثوق بالإنترنت. يجب أن يعمل الكمبيوتر المحمول الحديث بشكل جيد لهذا لأنه لا توجد حاجة إلى أجهزة إضافية. بعد ذلك ، تحتاج إلى إعداد الجهاز باستخدام بعض أدوات البرامج.

يجب أن يكون لديك Python 3.7+ مثبتًا لاستخدام Amazon Transcribe Streaming SDK غير المتزامن ولوحدة Python النمطية التي تسمى pyaudio، والتي تستخدمها للتحكم في ميكروفون ومكبرات الصوت بالجهاز. تعتمد هذه الوحدة على مكتبة C تسمى portaudio.h. إذا واجهت مشاكل مع pyaudio أخطاء ، نقترح التحقق من نظام التشغيل الخاص بك لمعرفة ما إذا كان لديك ملف portaudio.h مكتبة مثبتة.

لتفويض ومصادقة مكالمات الخدمة ، يمكنك إنشاء ملف إدارة الهوية والوصول AWS (IAM) مع أذونات للاتصال بخدمات AWS الضرورية. من خلال تكوين ملف واجهة سطر الأوامر AWS (AWS CLI) مع دور خدمة IAM هذا ، يمكنك تشغيل البرنامج النصي الخاص بنا على جهازك دون الحاجة إلى تمرير المفاتيح أو كلمات المرور ، لأن مكتبات AWS مكتوبة لاستخدام بيانات اعتماد مستخدم AWS CLI التي تم تكوينها. هذه طريقة ملائمة للنماذج الأولية السريعة وتضمن استدعاء خدماتنا من خلال هوية معتمدة. كما هو الحال دائمًا ، اتبع مبدأ الامتياز الأقل عند تعيين سياسات IAM عند إنشاء مستخدم أو دور IAM.

للتلخيص ، أنت بحاجة إلى المتطلبات الأساسية التالية:

  • جهاز كمبيوتر شخصي أو Mac أو Linux مزود بميكروفون ومكبرات صوت واتصال بالإنترنت
  • portaudio.h مكتبة C لنظام التشغيل الخاص بك (الشراب ، apt get ، wget) ، وهو أمر ضروري لعمل pyaudio
  • AWS CLI 2.0 مع مستخدم IAM مصرح له بشكل صحيح تم تكوينه عن طريق تشغيل تكوين aws في AWS CLI
  • بيثون 3.7 +
  • Amazon Transcribe Python SDK غير المتزامن
  • مكتبات Python التالية:
    • boto3
    • amazon-transcribe
    • pyaudio
    • asyncio
    • concurrent

تنفيذ الحل

ستعتمد بشكل كبير على Amazon Transcribe Streaming SDK غير المتزامن لـ Python كنقطة بداية ، وستقوم بالبناء فوق SDK المحدد. بعد تجربة SDK المتدفقة لـ Python ، يمكنك إضافة ميكروفون دفق الإدخال باستخدام pyaudio، مكتبة مفتوحة المصدر بيثون شائعة الاستخدام لمعالجة البيانات الصوتية. ثم أضفت مكالمات Boto3 إلى Amazon Translate و Amazon Polly لوظائف الترجمة وتحويل النص إلى كلام. أخيرًا ، تقوم ببث الكلام المترجم من خلال مكبرات صوت الكمبيوتر مرة أخرى باستخدام pyaudio. وحدة بايثون concurrent يمنحك القدرة على تشغيل كود الحظر في سلسلة الرسائل غير المتزامنة الخاصة به لتشغيل خطاب Amazon Polly الذي تم إرجاعه بطريقة سلسة وبدون حظر.

دعنا نستورد جميع وحداتنا الضرورية ، وننسخ فئات البث ، وننشئ بعض الكرات الأرضية:

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 nonblocking thread-safe callback لوضع وحدات بايت الإدخال لتدفق الميكروفون في ملف 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.")

الآن دعنا نتوسع في ما أنشأته في المنشور Amazon Transcribe Streaming SDK غير متزامن لـ Python. في التعليمات البرمجية التالية ، يمكنك إنشاء كائن منفذ باستخدام ThreadPoolExecutor فئة فرعية مع ثلاثة عمال متزامن. يمكنك بعد ذلك إضافة مكالمة Amazon Translate على النسخة النهائية التي تم إرجاعها في 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()، والذي يأخذ تدفق Amazon Transcribe كوسيطة ويكتب بشكل غير متزامن أجزاء من دفق إدخال الميكروفون إليه. ثم تستخدم ملفات MyEventHandler() مع دفق النسخ الناتج كوسيطة لها وإنشاء كائن معالج. ثم تستخدم الانتظار مع asyncio.gather() وتمرير write_chunks () والمعالج باستخدام طريقة handle_events () للتعامل مع العقود الآجلة النهائية لهذه coroutines. أخيرًا ، تقوم بجمع كل حلقات الأحداث وتكرار ملف 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 Transcribe و Amazon Translate على ترجمة أي لغة إدخال مدعومة إلى اللغة الهدف. يمكنك التحدث لبعض الوقت وبسبب الطبيعة غير المحظورة للمكالمات الوظيفية ، تتم ترجمة كل مدخلات الكلام الخاصة بك والتحدث بها ، مما يجعل هذه أداة ممتازة لترجمة الخطابات الحية.

وفي الختام

على الرغم من أن هذا المنشور أظهر كيف يمكن أن تعمل واجهات AWS API الثلاثة المُدارة بالكامل معًا بسلاسة ، فإننا نشجعك على التفكير في كيفية استخدام هذه الخدمات بطرق أخرى لتقديم دعم متعدد اللغات للخدمات أو الوسائط مثل التسميات التوضيحية المغلقة متعددة اللغات مقابل جزء بسيط من التكلفة الحالية . يمكن أن يستفيد الطب ، والأعمال التجارية ، وحتى العلاقات الدبلوماسية من خدمة ترجمة دائمة التحسن ومنخفضة التكلفة وقليلة الصيانة.

لمزيد من المعلومات حول إثبات قاعدة رمز المفهوم لحالة الاستخدام هذه ، تحقق من جيثب.


حول المؤلف

اختراق حواجز اللغة باستخدام Amazon Transcribe و Amazon Translate و Amazon Polly PlatoBlockchain Data Intelligence. البحث العمودي. عاي.مايكل تران مهندس حلول مع فريق Envision Engineering في Amazon Web Services. يقدم التوجيه الفني ويساعد العملاء على تسريع قدرتهم على الابتكار من خلال إظهار فن الممكن على AWS. لقد قام ببناء نماذج أولية متعددة حول الذكاء الاصطناعي / التعلم الآلي وإنترنت الأشياء لعملائنا. يمكنك الاتصال بيMike_Trann على Twitter.

اختراق حواجز اللغة باستخدام Amazon Transcribe و Amazon Translate و Amazon Polly PlatoBlockchain Data Intelligence. البحث العمودي. عاي.كاميرون ويلكس هو مهندس النماذج الأولية في فريق AWS Industry Accelerator. أثناء وجوده في الفريق ، قدم العديد من النماذج الأولية القائمة على ML للعملاء لإثبات "فن الممكن" لـ ML على AWS. إنه يستمتع بإنتاج الموسيقى والطرق الوعرة والتصميم.

الطابع الزمني:

اكثر من التعلم الآلي من AWS