Vượt qua rào cản ngôn ngữ với Amazon Transcribe, Amazon Translate và Amazon Polly PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Vượt qua rào cản ngôn ngữ với Amazon Transcribe, Amazon Translate và Amazon Polly

Hãy tưởng tượng một bác sĩ phẫu thuật thực hiện cuộc gọi video với bệnh nhân trên toàn cầu mà không cần người phiên dịch. Điều gì sẽ xảy ra nếu một công ty khởi nghiệp non trẻ có thể dễ dàng mở rộng sản phẩm của họ qua biên giới và sang các thị trường địa lý mới bằng cách cung cấp dịch vụ bán hàng và hỗ trợ khách hàng linh hoạt, chính xác, đa ngôn ngữ mà không cần người phiên dịch trực tiếp? Điều gì xảy ra với doanh nghiệp của bạn khi bạn không còn bị ràng buộc bởi ngôn ngữ?

Ngày nay, việc tổ chức các cuộc họp ảo với các nhóm và khách hàng quốc tế nói nhiều ngôn ngữ khác nhau là điều rất phổ biến. Cho dù đó là các cuộc họp nội bộ hay bên ngoài, nghĩa là thường bị lạc trong các cuộc thảo luận phức tạp và bạn có thể gặp phải rào cản ngôn ngữ khiến bạn không thể đạt được hiệu quả như mong muốn.

Trong bài đăng này, bạn sẽ học cách sử dụng ba dịch vụ AWS được quản lý đầy đủ (Phiên âm Amazon, Amazon DịchAmazon Polly) để tạo ra giải pháp phiên dịch giọng nói thành giọng nói gần như thời gian thực có thể nhanh chóng dịch đầu vào giọng nói trực tiếp của người nói nguồn thành ngôn ngữ đích được dịch, chính xác và được dịch, tất cả đều không có trải nghiệm máy học (ML).

Tổng quan về giải pháp

Trình dịch của chúng tôi bao gồm ba dịch vụ AWS ML được quản lý đầy đủ hoạt động cùng nhau trong một tập lệnh Python duy nhất bằng cách sử dụng AWS SDK cho Python (Boto3) cho bản dịch văn bản và các phần chuyển văn bản thành giọng nói của chúng tôi cũng như SDK phát trực tuyến không đồng bộ để phiên âm đầu vào âm thanh.

Amazon Transcribe: Truyền trực tuyến lời nói thành văn bản

Dịch vụ đầu tiên bạn sử dụng trong ngăn xếp của chúng tôi là Amazon Transcribe, một dịch vụ chuyển lời nói thành văn bản được quản lý hoàn toàn, nhận giọng nói đầu vào và chuyển nó thành văn bản. Amazon Transcribe có các phương pháp nhập linh hoạt, hàng loạt hoặc phát trực tuyến, vì nó chấp nhận các tệp âm thanh được lưu trữ hoặc dữ liệu âm thanh truyền trực tuyến. Trong bài đăng này, bạn sử dụng SDK truyền trực tuyến Amazon Transcribe không đồng bộ cho Python, sử dụng giao thức truyền trực tuyến HTTP / 2 để phát trực tiếp âm thanh và nhận bản ghi trực tiếp.

Khi chúng tôi lần đầu tiên xây dựng mẫu thử nghiệm này, quá trình nhập phát trực tuyến trên Amazon Transcribe không hỗ trợ phát hiện ngôn ngữ tự động, nhưng điều này không còn xảy ra kể từ tháng 2021 năm XNUMX. Cả quá trình nhập hàng loạt và truyền trực tuyến hiện hỗ trợ phát hiện ngôn ngữ tự động cho tất cả ngôn ngữ được hỗ trợ. Trong bài đăng này, chúng tôi chỉ ra cách một giải pháp dựa trên tham số mặc dù một thiết kế không tham số đa ngôn ngữ liền mạch có thể thực hiện được thông qua việc sử dụng tính năng phát hiện ngôn ngữ tự động phát trực tuyến. Sau khi phân đoạn giọng nói đã phiên âm của chúng tôi được trả lại dưới dạng văn bản, bạn gửi yêu cầu đến Amazon Dịch để dịch và trả lại kết quả trong Bản ghi âm trên Amazon của chúng tôi EventHandler phương pháp.

Amazon Dịch: API dịch hiện đại, được quản lý hoàn toàn

Tiếp theo trong ngăn xếp của chúng tôi là Amazon Translate, một dịch vụ dịch máy thần kinh cung cấp bản dịch ngôn ngữ nhanh chóng, chất lượng cao, giá cả phải chăng và có thể tùy chỉnh. Kể từ tháng 2022 năm 75, Amazon Translate hỗ trợ dịch trên XNUMX ngôn ngữ, với các cặp ngôn ngữ mới và các cải tiến liên tục được thực hiện. Amazon Dịch sử dụng các mô hình học sâu được lưu trữ trên kiến ​​trúc Đám mây AWS có khả năng mở rộng và linh hoạt cao để nhanh chóng cung cấp các bản dịch chính xác theo thời gian thực hoặc theo đợt, tùy thuộc vào trường hợp sử dụng của bạn. Sử dụng Amazon Translate rất đơn giản và không yêu cầu quản lý kiến ​​trúc cơ bản hoặc kỹ năng ML. Amazon Dịch có một số tính năng, như tạo và sử dụng thuật ngữ tùy chỉnh để xử lý ánh xạ giữa các thuật ngữ dành riêng cho ngành. Để biết thêm thông tin về giới hạn dịch vụ Amazon Translate, hãy tham khảo Nguyên tắc và giới hạn. Sau khi ứng dụng nhận được văn bản đã dịch bằng ngôn ngữ đích của chúng tôi, ứng dụng sẽ gửi văn bản đã dịch tới Amazon Polly để phát lại âm thanh đã dịch ngay lập tức.

Amazon Polly: API chuyển văn bản thành giọng nói được quản lý hoàn toàn

Cuối cùng, bạn gửi văn bản đã dịch đến Amazon Polly, một dịch vụ chuyển văn bản thành giọng nói được quản lý hoàn toàn có thể gửi lại các phản hồi clip âm thanh sống động như thật để phát lại trực tuyến ngay lập tức hoặc theo nhóm và lưu vào Dịch vụ lưu trữ đơn giản của Amazon (Amazon S3) để sử dụng sau này. Bạn có thể kiểm soát các khía cạnh khác nhau của giọng nói như phát âm, âm lượng, cao độ, tốc độ nói, v.v. bằng cách sử dụng Ngôn ngữ đánh dấu tổng hợp giọng nói (SSML).

Bạn có thể tổng hợp bài phát biểu cho một số Amazon Polly nhất định Giọng nói thần kinh sử dụng kiểu Newscaster để làm cho chúng giống như một phát thanh viên TV hoặc radio. Bạn cũng có thể phát hiện khi nào các từ hoặc câu cụ thể trong văn bản đang được nói dựa trên siêu dữ liệu có trong luồng âm thanh. Điều này cho phép nhà phát triển đồng bộ hóa các hoạt ảnh và đánh dấu đồ họa, chẳng hạn như chuyển động môi của hình đại diện, với bài phát biểu tổng hợp.

Bạn có thể sửa đổi cách phát âm của các từ cụ thể, chẳng hạn như tên công ty, từ viết tắt, từ nước ngoài hoặc từ mới, chẳng hạn như “P! Nk”, “ROTFL” hoặc “C'est la vie” (khi nói bằng tiếng Pháp giọng nói), sử dụng từ vựng tùy chỉnh.

Tổng quan kiến ​​trúc

Sơ đồ sau minh họa kiến ​​trúc giải pháp của chúng tôi.

Biểu đồ này hiển thị luồng dữ liệu từ thiết bị khách đến Amazon Transcribe, Amazon Translate và Amazon Polly

Quy trình làm việc như sau:

  1. Âm thanh được nhập bởi Python SDK.
  2. Amazon Polly chuyển đổi bài phát biểu thành văn bản, bằng 39 ngôn ngữ khả dụng.
  3. Amazon Dịch chuyển đổi các ngôn ngữ.
  4. Amazon Live Transcribe chuyển đổi văn bản thành giọng nói.
  5. Âm thanh được xuất ra loa.

Điều kiện tiên quyết

Bạn cần một máy chủ được thiết lập với micrô, loa và kết nối internet đáng tin cậy. Một máy tính xách tay hiện đại sẽ hoạt động tốt cho điều này vì không cần phần cứng bổ sung. Tiếp theo, bạn cần thiết lập máy với một số công cụ phần mềm.

Bạn phải cài đặt Python 3.7+ để sử dụng SDK truyền trực tuyến Amazon Transcribe không đồng bộ và cho mô-đun Python được gọi là pyaudio, mà bạn sử dụng để điều khiển micrô và loa của máy. Mô-đun này phụ thuộc vào thư viện C được gọi là portaudio.h. Nếu bạn gặp sự cố với pyaudio lỗi, chúng tôi khuyên bạn nên kiểm tra hệ điều hành của mình để xem liệu bạn có portaudio.h đã cài đặt thư viện.

Để ủy quyền và xác thực các cuộc gọi dịch vụ, bạn tạo Quản lý truy cập và nhận dạng AWS (IAM) vai trò dịch vụ với quyền gọi các dịch vụ AWS cần thiết. Bằng cách cấu hình Giao diện dòng lệnh AWS (AWS CLI) với vai trò dịch vụ IAM này, bạn có thể chạy tập lệnh của chúng tôi trên máy của mình mà không cần phải nhập khóa hoặc mật khẩu vì thư viện AWS được viết để sử dụng thông tin đăng nhập của người dùng AWS CLI đã định cấu hình. Đây là một phương pháp thuận tiện để tạo mẫu nhanh và đảm bảo các dịch vụ của chúng tôi đang được gọi bằng một danh tính được ủy quyền. Như thường lệ, hãy tuân theo nguyên tắc ít đặc quyền nhất khi chỉ định các chính sách IAM khi tạo vai trò hoặc người dùng IAM.

Tóm lại, bạn cần các điều kiện tiên quyết sau:

  • Máy PC, Mac hoặc Linux có micrô, loa và kết nối internet
  • Sản phẩm portaudio.h Thư viện C cho hệ điều hành của bạn (brew, apt get, wget), cần thiết để pyaudio hoạt động
  • AWS CLI 2.0 với người dùng IAM được ủy quyền thích hợp được định cấu hình bằng cách chạy cấu hình aws trong AWS CLI
  • Trăn 3.7+
  • SDK Python phiên âm Amazon không đồng bộ
  • Các thư viện Python sau:
    • boto3
    • amazon-transcribe
    • pyaudio
    • asyncio
    • concurrent

Thực hiện giải pháp

Bạn sẽ dựa nhiều vào SDK phát trực tuyến Amazon Transcribe không đồng bộ cho Python như một điểm khởi đầu và sẽ xây dựng dựa trên SDK cụ thể đó. Sau khi bạn đã thử nghiệm với SDK phát trực tuyến cho Python, bạn thêm micro phát trực tuyến đầu vào bằng cách sử dụng pyaudio, một thư viện mã nguồn mở Python thường được sử dụng được sử dụng để xử lý dữ liệu âm thanh. Sau đó, bạn thêm lệnh gọi Boto3 vào Amazon Dịch và Amazon Polly cho chức năng dịch và chuyển văn bản thành giọng nói của chúng tôi. Cuối cùng, bạn phát trực tiếp lại bài phát biểu đã dịch qua loa của máy tính với pyaudio. Mô-đun Python concurrent cung cấp cho bạn khả năng chạy mã chặn trong chuỗi không đồng bộ của riêng nó để phát lại bài phát biểu Amazon Polly đã trả lại của bạn một cách liền mạch, không bị chặn.

Hãy nhập tất cả các mô-đun cần thiết của chúng tôi, phiên âm các lớp phát trực tuyến và khởi tạo một số hình cầu:

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"

Đầu tiên, bạn sử dụng pyaudio để có được tốc độ lấy mẫu, chỉ số thiết bị và số kênh của thiết bị đầu vào:

#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"]

Nếu cách này không hoạt động, bạn cũng có thể lặp lại và in thiết bị của mình như được hiển thị trong mã sau, sau đó sử dụng chỉ mục thiết bị để truy xuất thông tin thiết bị bằng 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"]

Bạn sử dụng channel_count, sample_ratedev_index dưới dạng các thông số trong luồng micrô. Trong chức năng gọi lại của luồng đó, bạn sử dụng asyncio gọi lại an toàn chuỗi không chặn để đưa các byte đầu vào của luồng micrô vào một asyncio hàng đợi đầu vào. Lưu ý đến các đối tượng vòng lặp và input_queue được tạo bằng asyncio và cách chúng được sử dụng trong đoạn mã sau:

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

Bây giờ khi hàm máy phát điện mic_stream() được gọi, nó liên tục tạo ra các byte đầu vào miễn là có dữ liệu đầu vào micrô trong hàng đợi đầu vào.

Bây giờ bạn đã biết cách lấy byte đầu vào từ micrô, hãy xem cách ghi byte âm thanh đầu ra của Amazon Polly vào luồng đầu ra loa:

#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.")

Bây giờ hãy mở rộng những gì bạn đã xây dựng trong bài đăng SDK truyền trực tuyến phiên âm Amazon không đồng bộ cho Python. Trong đoạn mã sau, bạn tạo một đối tượng thực thi bằng cách sử dụng ThreadPoolExecutor lớp con với ba công nhân đồng thời. Sau đó, bạn thêm lệnh gọi Amazon Translate trên bản ghi đã hoàn thành được trả về trong EventHandler và chuyển văn bản đã dịch đó, đối tượng thực thi và của chúng tôi aws_polly_tts() chức năng thành một asyncio vòng lặp với loop.run_in_executor(), chạy chức năng Amazon Polly của chúng tôi (với văn bản đầu vào đã dịch) một cách không đồng bộ khi bắt đầu lần lặp tiếp theo của asyncio Vòng lặp.

#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)  

Cuối cùng, chúng ta có loop_me() hàm số. Trong đó, bạn xác định write_chunks(), lấy luồng Amazon Transcribe làm đối số và ghi các phần đầu vào micrô phát trực tuyến vào đó một cách không đồng bộ. Sau đó bạn sử dụng MyEventHandler() với luồng phiên mã đầu ra làm đối số của nó và tạo một đối tượng xử lý. Sau đó, bạn sử dụng await với asyncio.gather() và chuyển vào write_chunks () và xử lý với phương thức handle_events () để xử lý các tương lai cuối cùng của các coroutines này. Cuối cùng, bạn thu thập tất cả các vòng lặp sự kiện và lặp lại loop_me() chức năng với run_until_complete(). Xem mã sau đây:

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()

Khi mã trước đó được chạy cùng nhau mà không có lỗi, bạn có thể nói vào micrô và nhanh chóng nghe giọng nói của mình được dịch sang tiếng Quan Thoại. Tính năng phát hiện ngôn ngữ tự động cho Amazon Transcribe và Amazon Translate dịch mọi ngôn ngữ đầu vào được hỗ trợ sang ngôn ngữ đích. Bạn có thể nói trong một khoảng thời gian khá lâu và do tính chất không chặn của các lệnh gọi hàm, tất cả đầu vào bằng giọng nói của bạn đều được dịch và nói, khiến đây trở thành một công cụ tuyệt vời để dịch các bài phát biểu trực tiếp.

Kết luận

Mặc dù bài đăng này đã trình bày cách thức ba API AWS được quản lý hoàn toàn này có thể hoạt động liền mạch với nhau, nhưng chúng tôi khuyến khích bạn suy nghĩ về cách bạn có thể sử dụng các dịch vụ này theo những cách khác để cung cấp hỗ trợ đa ngôn ngữ cho các dịch vụ hoặc phương tiện như phụ đề chi tiết đa ngôn ngữ với một phần chi phí hiện tại . Y khoa, kinh doanh và thậm chí cả các mối quan hệ ngoại giao đều có thể được hưởng lợi từ dịch vụ dịch thuật ngày càng được cải thiện, chi phí thấp và bảo trì thấp.

Để biết thêm thông tin về cơ sở mã bằng chứng khái niệm cho trường hợp sử dụng này, hãy xem Github.


Về các tác giả

Vượt qua rào cản ngôn ngữ với Amazon Transcribe, Amazon Translate và Amazon Polly PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.Michael Trần là Kiến trúc sư giải pháp với nhóm Kỹ thuật hình dung tại Amazon Web Services. Anh ấy cung cấp hướng dẫn kỹ thuật và giúp khách hàng tăng tốc khả năng đổi mới của họ thông qua việc thể hiện nghệ thuật có thể có trên AWS. Anh ấy đã xây dựng nhiều nguyên mẫu xung quanh AI / ML và IoT cho khách hàng của chúng tôi. Bạn có thể liên hệ với tôi @Mike_Trann trên Twitter.

Vượt qua rào cản ngôn ngữ với Amazon Transcribe, Amazon Translate và Amazon Polly PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.Cameron Wilkes là một Kiến trúc sư tạo mẫu trong nhóm AWS Industry Accelerator. Trong khi ở trong nhóm, anh ấy đã giao một số nguyên mẫu dựa trên ML cho khách hàng để chứng minh “Nghệ thuật có thể có” của ML trên AWS. Anh ấy thích sản xuất âm nhạc, off-road và thiết kế.

Dấu thời gian:

Thêm từ Học máy AWS