Долайте мовні бар’єри за допомогою Amazon Transcribe, Amazon Translate і Amazon Polly PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.

Подолайте мовні бар’єри за допомогою Amazon Transcribe, Amazon Translate і Amazon Polly

Уявіть собі хірурга, який проводить відеодзвінки з пацієнтами по всьому світу без допомоги перекладача. Що, якби молодий стартап міг легко розширити свій продукт за кордон і на нові географічні ринки, пропонуючи плавну, точну, багатомовну підтримку клієнтів і продажі, і все це без потреби перекладача? Що станеться з вашим бізнесом, коли ви більше не зв’язані мовою?

Віртуальні зустрічі з міжнародними командами та клієнтами, які розмовляють різними мовами, сьогодні є звичайним явищем. Незалежно від того, чи це внутрішні чи зовнішні зустрічі, значення часто губиться в складних обговореннях, і ви можете зіткнутися з мовними бар’єрами, які завадять вам бути настільки ефективними, як могли б.

У цій публікації ви дізнаєтеся, як використовувати три повністю керовані служби AWS (Амазонська розшифровка, Amazon Translate та Амазонка Поллі), щоб створити рішення перекладача мовлення майже в реальному часі, яке може швидко перекладати живий голосовий ввід вихідного мовця на розмовну, точну, перекладену цільову мову, і все з нульовим досвідом машинного навчання (ML).

Огляд рішення

Наш перекладач складається з трьох повністю керованих служб AWS ML, які працюють разом в одному сценарії Python за допомогою AWS SDK для Python (Boto3) для наших частин перекладу тексту та синтезу мовлення, а також SDK для асинхронної потокової передачі для транскрипції вхідного аудіо.

Amazon Transcribe: потокове перетворення мовлення в текст

Перший сервіс, яким ви користуєтеся в нашому наборі, — Amazon Transcribe, повністю керована служба перетворення мовлення в текст, яка приймає вхідне мовлення та транскрибує його в текст. Amazon Transcribe має гнучкі методи прийому, пакетне або потокове, оскільки приймає або збережені аудіофайли, або потокові аудіодані. У цій публікації ви використовуєте асинхронний потоковий SDK Amazon Transcribe для Python, який використовує потоковий протокол HTTP/2 для потокової передачі аудіо в реальному часі та отримання транскрипцій у реальному часі.

Коли ми вперше створили цей прототип, потокова передача Amazon Transcribe не підтримувала автоматичне визначення мови, але з листопада 2021 року це більше не так. І пакетна, і потокова передача тепер підтримують автоматичне визначення мови для всіх підтримувані мови. У цьому дописі ми показуємо, як можливе рішення на основі параметрів, хоча це безперебійний багатомовний дизайн без параметрів, завдяки використанню потокового автоматичного визначення мови. Після того, як наш транскрибований мовний сегмент буде повернено як текст, ви надсилаєте запит до Amazon Translate на переклад і повертаєте результати в нашій Amazon Transcribe EventHandler метод.

Amazon Translate: сучасний, повністю керований API перекладу

Наступним у нашому наборі є Amazon Translate, служба нейронного машинного перекладу, яка забезпечує швидкий, високоякісний, доступний і настроюваний переклад мовою. Станом на червень 2022 року Amazon Translate підтримує переклад 75 мовами, постійно додаючи нові мовні пари та вдосконалюючись. Amazon Translate використовує моделі глибокого навчання, розміщені на високомасштабованій і стійкій архітектурі AWS Cloud, щоб швидко надавати точні переклади в режимі реального часу або пакетно, залежно від вашого випадку використання. Використання Amazon Translate просте і не вимагає керування базовою архітектурою чи навичок ML. Amazon Translate має кілька функцій, як-от створення та використання нестандартна термінологія для обробки відповідності між галузевими термінами. Додаткову інформацію про обмеження служби Amazon Translate див Рекомендації та обмеження. Після того, як програма отримає перекладений текст цільовою мовою, він надсилає перекладений текст до Amazon Polly для негайного відтворення перекладеного аудіо.

Amazon Polly: повністю керований API синтезу мовлення

Нарешті, ви надсилаєте перекладений текст до Amazon Polly, повністю керованої служби синтезу мовлення, яка може або надсилати реалістичні відповіді аудіокліпів для негайного потокового відтворення, або групувати та зберігати в Служба простого зберігання Amazon (Amazon S3) для подальшого використання. Ви можете керувати різними аспектами мовлення, такими як вимова, гучність, висота, швидкість мовлення тощо за допомогою стандартизованих Мова розмітки мови синтезу мови (SSML).

Ви можете синтезувати мовлення для деяких Amazon Polly Нейронні голоси використовуючи стиль диктора новин, щоб вони звучали як диктор теле- чи радіо новин. Ви також можете визначити, коли промовляються певні слова чи речення в тексті на основі метаданих, включених до аудіопотоку. Це дозволяє розробнику синхронізувати графічне підсвічування та анімацію, наприклад рухи губ аватара, із синтезованим мовленням.

Ви можете змінити вимову певних слів, наприклад назв компаній, абревіатур, іноземних слів або неологізмів, наприклад «P!nk», «ROTFL» або «C'est la vie» (якщо вони вимовляються нефранцузькою мовою). голос), використовуючи спеціальні лексикони.

Огляд архітектури

Наступна схема ілюструє нашу архітектуру рішення.

На цій діаграмі показано потік даних від клієнтського пристрою до Amazon Transcribe, Amazon Translate і Amazon Polly

Порядок роботи такий:

  1. Аудіо завантажується пакетом SDK Python.
  2. Amazon Polly перетворює мову на текст 39 можливими мовами.
  3. Amazon Translate перетворює мови.
  4. Amazon Live Transcribe перетворює текст на мовлення.
  5. Аудіо виводиться на динаміки.

Передумови

Вам потрібна хост-машина з мікрофоном, динаміками та надійним підключенням до Інтернету. Сучасний ноутбук повинен добре працювати для цього, оскільки додаткове обладнання не потрібне. Далі вам потрібно налаштувати машину за допомогою деяких програмних засобів.

Ви повинні встановити Python 3.7+, щоб використовувати асинхронний потоковий SDK Amazon Transcribe і модуль 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 для вашої ОС (brew, apt get, wget), яка потрібна для роботи pyaudio
  • AWS CLI 2.0 із належним чином авторизованим користувачем IAM, налаштованим за допомогою запуску aws configure у AWS CLI
  • Python 3.7+
  • Асинхронний SDK Amazon Transcribe Python
  • Наступні бібліотеки Python:
    • boto3
    • amazon-transcribe
    • pyaudio
    • asyncio
    • concurrent

Реалізуйте рішення

Ви будете значною мірою покладатися на асинхронний потоковий SDK Amazon Transcribe для Python як вихідну точку, і збираєтеся створювати поверх цього конкретного SDK. Після того, як ви поекспериментували з потоковим SDK для Python, ви додаєте потоковий мікрофон введення за допомогою pyaudio, широко використовувана бібліотека з відкритим вихідним кодом Python, яка використовується для обробки аудіоданих. Потім ви додаєте виклики Boto3 до Amazon Translate і Amazon Polly для наших функцій перекладу та синтезу мовлення. Нарешті, ви знову транслюєте перекладене мовлення через динаміки комп’ютера pyaudio. Модуль Python 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 неблокуючий потокобезпечний зворотний виклик для розміщення вхідних байтів мікрофонного потоку в an 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() функція в an 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() з вихідним потоком транскрипції як аргументом і створіть об’єкт обробки. Потім ви використовуєте await з asyncio.gather() і передайте write_chunks() і обробник з методом 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 Transcribe і Amazon Translate перекладає будь-яку підтримувану мову введення на цільову мову. Ви можете говорити досить довго, і через те, що виклики функцій не блокуються, усі ваші мовні дані перекладаються та озвучуються, що робить це чудовим інструментом для перекладу живих виступів.

Висновок

Незважаючи на те, що ця публікація продемонструвала, як ці три повністю керовані API AWS можуть бездоганно функціонувати разом, ми радимо вам подумати про те, як ви можете використовувати ці служби іншими способами, щоб забезпечити багатомовну підтримку для служб або засобів масової інформації, як-от багатомовні закриті субтитри, за незначну частину поточної вартості. . Медицина, бізнес і навіть дипломатичні відносини можуть отримати вигоду від постійно вдосконалюваних, недорогих і невибагливих послуг перекладу.

Для отримання додаткової інформації про базу коду для підтвердження концепції для цього випадку використання перегляньте наш Github.


Про авторів

Долайте мовні бар’єри за допомогою Amazon Transcribe, Amazon Translate і Amazon Polly PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.Майкл Тран є архітектором рішень у команді Envision Engineering в Amazon Web Services. Він надає технічне керівництво та допомагає клієнтам прискорити свою здатність до інновацій, демонструючи мистецтво можливого на AWS. Він створив кілька прототипів на основі AI/ML та IoT для наших клієнтів. Ви можете зв’язатися зі мною @Mike_Trann у Twitter.

Долайте мовні бар’єри за допомогою Amazon Transcribe, Amazon Translate і Amazon Polly PlatoBlockchain Data Intelligence. Вертикальний пошук. Ai.Кемерон Вілкс є архітектором прототипування в команді AWS Industry Accelerator. Перебуваючи в команді, він надав клієнтам кілька прототипів на основі ML, щоб продемонструвати «мистецтво можливого» ML на AWS. Він захоплюється створенням музики, бездоріжжям і дизайном.

Часова мітка:

Більше від AWS Машинне навчання