Преодолейте языковые барьеры с помощью Amazon Transcribe, Amazon Translate и Amazon Polly PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

Преодолевайте языковые барьеры с помощью Amazon Transcribe, Amazon Translate и Amazon Polly

Представьте себе хирурга, который принимает видеозвонки с пациентами по всему миру без помощи переводчика. Что, если молодой стартап мог бы легко расширить свой продукт через границы и выйти на новые географические рынки, предлагая гибкую, точную, многоязычную поддержку клиентов и продажи, и все это без необходимости живого переводчика? Что происходит с вашим бизнесом, когда вы больше не связаны языком?

Сегодня принято проводить виртуальные встречи с международными командами и клиентами, говорящими на разных языках. Будь то внутренние или внешние встречи, смысл часто теряется в сложных дискуссиях, и вы можете столкнуться с языковыми барьерами, которые мешают вам быть максимально эффективными.

В этом посте вы узнаете, как использовать три полностью управляемых сервиса AWS (Amazon транскрибировать, Amazon Translateи Amazon Polly) для создания решения для преобразования речи в речь почти в режиме реального времени, которое может быстро переводить живой голосовой ввод говорящего на разговорный, точный, переведенный целевой язык, и все это без использования машинного обучения (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, для быстрого предоставления точных переводов либо в режиме реального времени, либо в пакетном режиме, в зависимости от вашего варианта использования. Использовать Amazon Translate просто и не требует управления базовой архитектурой или навыков машинного обучения. Amazon Translate имеет несколько функций, таких как создание и использование пользовательская терминология для обработки сопоставления между отраслевыми терминами. Для получения дополнительной информации об ограничениях сервиса Amazon Translate см. Рекомендации и ограничения. После того как приложение получает переведенный текст на нашем целевом языке, оно отправляет переведенный текст в Amazon Polly для немедленного воспроизведения переведенного аудио.

Amazon Polly: полностью управляемый API для преобразования текста в речь

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

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

Вы можете изменить произношение определенных слов, таких как названия компаний, аббревиатуры, иностранные слова или неологизмы, например, «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+, чтобы использовать пакет 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 +
  • Асинхронный Python SDK Amazon Transcribe
  • Следующие библиотеки 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 неблокирующий потокобезопасный обратный вызов, чтобы поместить входные байты потока микрофона в 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() для обработки возможного будущего этих сопрограмм. Наконец, вы собираете все циклы событий и зацикливаете 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. Вертикальный поиск. Ай.Майкл Тран является архитектором решений в команде Envision Engineering в Amazon Web Services. Он предоставляет технические рекомендации и помогает клиентам ускорить внедрение инноваций, демонстрируя искусство возможного на AWS. Он создал несколько прототипов на основе AI/ML и IoT для наших клиентов. Вы можете связаться со мной @Mike_Trann в Твиттере.

Преодолейте языковые барьеры с помощью Amazon Transcribe, Amazon Translate и Amazon Polly PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.Кэмерон Уилкс является архитектором прототипов в команде AWS Industry Accelerator. Работая в команде, он предоставил клиентам несколько прототипов на основе машинного обучения, чтобы продемонстрировать «Искусство возможного» машинного обучения на AWS. Он увлекается созданием музыки, бездорожьем и дизайном.

Отметка времени:

Больше от Машинное обучение AWS