Bezserwerowe ułatwienia dostępu: Konwertuj tekst na mowę za pomocą Amazon Polly

May 08 2023
Żyjemy w niesamowitej erze postępu technologicznego i innowacji, które zmieniają każdy aspekt naszego życia. Od sztucznej inteligencji i uczenia maszynowego po automatyzację i duże zbiory danych — nie można zaprzeczyć, że przyszłość jest tutaj.
Papuga DALL-E siedząca na chmurze i czytająca książkę podczas śpiewania

Żyjemy w niesamowitej erze postępu technologicznego i innowacji, które zmieniają każdy aspekt naszego życia. Od sztucznej inteligencji i uczenia maszynowego po automatyzację i duże zbiory danych — nie można zaprzeczyć, że przyszłość jest tutaj.

Na przykład tytuł tego posta na blogu został napisany przy pomocy ChatGPT, aby zoptymalizować go pod kątem SEO. Obraz papugi został wykonany przy pomocy DALL-E.

A co z odtwarzaczem audio, który czyta ten tekst za Ciebie? Okazuje się, że to też można zautomatyzować.

I to właśnie omówimy dzisiaj, automatyzację konwersji tekstu na mowę (TTS) z pomocą Amazon Polly.

Dostarczę w pełni działające rozwiązanie Serverless na GitHub z kodem Pythona i AWS CDK. Możesz wdrożyć kod i cieszyć się transformacją tekstu na mowę w ciągu kilku minut.

Kliknij tutaj, aby przejść do projektu GitHub.

https://www.ranthebuilder.cloud/

Ten post na blogu został pierwotnie opublikowany na mojej stronie internetowej „Ran The Builder”.

Dostępność jest ważna

Założyłem swoją stronę internetową RanTheBuilder , aby dzielić się ze światem swoją wiedzą na temat AWS i Serverless. Dostępna strona internetowa promuje integrację i zapewnia wszystkim ludziom dostęp do treści i możliwość korzystania z nich. Dostępność stała się głównym tematem w ostatnich latach i coraz więcej stron internetowych zwraca na to uwagę.

Niedawno zauważyłem, że Medium dodało odtwarzacz audio dla postów na blogu, który czyta posty za Ciebie, co jest świetną funkcją ułatwień dostępu.

Nie miałem pojęcia, jak to zrobili, i wydawało się to poza zasięgiem.

Jednak zainspirował mnie do podjęcia natychmiastowych działań, gdy zobaczyłem następujący film na YouTube:

W filmie twórca społeczności AWS, Johannes Koch, przeprowadza wywiad z Jimmym Dahlqvistem , kolegą z branży budowlanej. Dyskutują o tym, jak Jimmy zautomatyzował tworzenie swojego bloga za pomocą AWS Step Functions, co zaowocowało mową wersją tekstu posta z Amazon Polly.

Nigdy nie słyszałem o Amazon Polly, ale poczułem inspirację, aby spróbować samemu i ostatecznie rozwiązać ważną brakującą funkcję ułatwień dostępu w mojej witrynie.

Zaprojektowałem proste rozwiązanie, które doskonale odpowiada moim relatywnie skromnym potrzebom.

Zanim przejdziemy do szczegółów, poznajmy Amazon Polly.

Wprowadzenie usługi zamiany tekstu na mowę Amazon Polly

Amazon Polly to oparta na chmurze usługa zamiany tekstu na mowę (TTS). Wykorzystuje zaawansowane technologie głębokiego uczenia się do konwersji tekstu pisanego na realistyczną mowę, umożliwiając programistom tworzenie aplikacji obsługujących mowę z naturalnie brzmiącymi głosami.

Polly obsługuje szeroką gamę języków (24 w momencie pisania), a użytkownicy mogą wybierać spośród kilku głosów męskich i żeńskich z różnymi akcentami i tonami (łącznie 47). Usługa zapewnia również zaawansowane funkcje, takie jak automatyczne rozpoznawanie mowy (ASR) i język znaczników syntezy mowy (SSML), umożliwiając programistom precyzyjne dostrojenie wymowy, akcentu i intonacji mowy.

Jedną z najmocniejszych stron Amazon Polly jest to, że jest to usługa bezserwerowa. Wyśle pliki audio bezpośrednio do segmentu S3, ułatwiając włączenie do dowolnej architektury opartej na zdarzeniach. Automatycznie obsłuży dowolny rozmiar tekstu, nie musisz uruchamiać większej liczby maszyn i płacisz tylko za liczbę znaków, które przekształcasz w mowę.

Z mojego krótkiego czasu korzystania z niego jest to proste; tekst wchodzi, plik mp3 trafia do zasobnika S3.

wchodzi tekst, wychodzi mowa

Darmowy poziom jest imponujący i zaspokoi potrzeby wielu osób, w tym moje.

Przeczytaj więcej o cenach .

Zobaczmy, jak zautomatyzować tworzenie zamiany tekstu na mowę za pomocą API Amazon Polly.

Moja usługa zamiany tekstu na mowę w języku Python

Przyjrzyjmy się celowi usługi, projektowi i szczegółom implementacji.

Cel

Chcę mieć możliwość tworzenia plików .mp3 z moimi postami na blogu i przesyłania ich na moją stronę internetową podczas pracy nad nowymi postami. Usługa musi być bezserwerowa, prosta w użyciu i wdrożona z AWS CDK.

Chcę, aby użycie było tak proste, jak to możliwe:

  • Dodaj nowy plik tekstowy do folderu tekstowego usługi TST (zamiana tekstu na mowę).
  • Wdróż usługę w AWS.
  • Otrzymaj plik mp3 dostarczony na mój adres e-mail.

Podsumowując: dodaj plik tekstowy do folderu „text”, wdróż do AWS, poczekaj chwilę i otrzymaj plik mp3 do swojej skrzynki odbiorczej. Prosty!

Jeśli chcesz spróbować samemu, przejdź do projektu na GitHub i postępuj zgodnie z plikiem readme, aby uzyskać instrukcje i sposób użycia.

Projekt na wysokim poziomie

Z punktu widzenia projektowania usługa jest dość prosta. Masz jednostkę magazynu w chmurze, która jest używana do przetwarzania danych wejściowych i pośrednich.

Następnie masz dwóch głównych graczy: producenta i konsumenta.

Producent przesyła pliki tekstowe do magazynu w chmurze, które są wysyłane do konsumenta.

Konsument przekształci plik tekstowy w plik mp3 i prześle go na adres e-mail jako załącznik.

Projekt na wysokim poziomie

Architektura usług

Przyjrzyjmy się architekturze i zobaczmy, jak zaimplementowałem każdą jednostkę.

Zastrzeżenie: Ta usługa na poziomie POC zapewnia automatyzację dla moich potrzeb w najprostszy możliwy sposób. Wkłady w kod są mile widziane!

Architektura usług

Przepływ zdarzeń

  1. Użytkownik dodaje nowy plik tekstowy do folderu „text” w folderze głównym projektu.
  2. Użytkownik wdraża usługę za pomocą AWS CDK (może użyć polecenia „make wdrożyć”).
  3. Plik zostanie przesłany do S3.
  4. Funkcja Consumer Lambda jest wyzwalana zdarzeniem „obiekt utworzony w S3” i odczytuje nazwę pliku oraz nazwę zasobnika ze zdarzenia.
  5. Funkcja Consumer Lambda wysyła zawartość tekstową do Amazon Polly i uśpi/odpytuje do czasu zakończenia zadania.
  6. Po zakończeniu zadania wyjściowy plik mp3 jest pobierany z zasobnika S3 i usuwany z niego. Ponieważ wysyłamy go e-mailem, nie ma potrzeby przechowywania go w S3, ale można go wyłączyć i wysłać e-mailem link do obiektu zamiast pliku mp3.
  7. Funkcja Lambda wykorzystuje Amazon SES do wysłania pliku mp3 jako załącznika na predefiniowany adres e-mail.

Używamy kubełka Amazon S3 zarówno do przechowywania danych wejściowych, jak i danych wyjściowych Amazon Polly dla jednostki przechowywania danych w chmurze. Polly ma natywną integrację z Polly, więc ma to sens. Kod CDK zasobnika można znaleźć tutaj .

Producent to specjalna konstrukcja AWS CDK, która ładuje pliki do S3 z określonego folderu. Zwykle dodaję jeden plik na raz i wdrażam usługę. Możesz także ręcznie przesłać plik do zasobnika, ale to mija się z celem; chcemy automatyzacji. Kod CDK producenta można znaleźć tutaj .

Konsument to funkcja Lambda, która subskrybuje zdarzenia „przy tworzeniu obiektu” zasobnika S3 i jest wyzwalana, gdy zapisywane są nowe obiekty.

Funkcja przyjmie każde zdarzenie, odczyta je i wyśle ​​zawartość do Amazon Polly. Używa API „start_speech_synthesis_task” . Użyłem oficjalnego pakietu SDK Amazon Polly , który pobiera zawartość pliku tekstowego i zwraca plik mp3 jako wynik — całkiem proste!

Kod CDK dla konsumentów można znaleźć tutaj .

A kod funkcji Lambda można znaleźć tutaj .

Wykorzystanie opakowania Polly w moim kodzie można znaleźć tutaj .

Wydajność i otwarte problemy

W moim przypadku post na blogu zawierający 11 000 znaków zajmuje około 40–50 sekund, aby po zakończeniu wdrożenia zamienić się w plik mp3 na moim adresie e-mail. To nie jest złe.

Możesz się zastanawiać, dlaczego usuwam plik mp3 z S3 i wysyłam go jako załącznik do wiadomości e-mail.

Cóż, chcę, aby plik mp3 został usunięty i wysłany jako załącznik do wiadomości e-mail, ponieważ chcę przesłać go na moją stronę internetową, gdzie miejsce na dane jest już opłacone, zamiast przechowywać i odtwarzać go z mojego osobistego konta programisty AWS.

Możesz się również zastanawiać, cóż, to ładna implementacja, ale czy jest optymalna? Czy to najlepsza opcja projektowa?

Więc nie.

Konsumencka funkcja Lambda czeka i odpytuje Polly, dopóki jej zadanie syntezy nie zostanie zakończone, co jest złą praktyką zarówno pod względem wydajności, jak i kosztów. Jednak w przypadku projektu POC, który jest uruchamiany raz na dwa tygodnie (kiedy publikuję nowy post), jest to akceptowalne, przynajmniej na razie.

Lepszym rozwiązaniem jest użycie funkcji krokowych ze stanem oczekiwania. Polly może powiadomić temat SNS, gdy zadanie zostanie zakończone; że SNS może wysłać wiadomość do wiadomości SQS, a następnie do Lambdy, która obudzi funkcję step z tokenem oczekiwania, aby kontynuować wysyłanie pliku na mój e-mail.

Dlaczego więc wybrałem funkcję Lambda zamiast implementacji maszyny stanu funkcji krokowej? Kilka powodów:

  1. Opakowanie AWS Polly pozwoliło mi szybko przejść dalej i robi wszystko w tym samym procesie (wykonuje za ciebie uśpienie i ankietę), więc funkcja Lambda jest prosta w użyciu w stosunku do funkcji step, która nie będzie mogła użyć SDK.
  2. W środowisku IDE nie można opracowywać i debugować funkcji krokowych, w przeciwieństwie do funkcji Lambda. Chciałem jak najszybciej zapewnić wartość dla tego przypadku użycia i szybko uzyskać wyniki.
  3. Chodzi bardziej o zapewnienie dostępności i nauczenie się czegoś nowego, a mniej o stworzenie możliwie najlepszego rozwiązania gotowego do produkcji.

Oczywiście, że tak. Zrobię to w ramach v2 usługi, ale wkłady w kod są również mile widziane!

Innym obszarem ulepszeń jest to, że nie używam leksykonów ani języka znaczników syntezy (SSML), który umożliwia programistom precyzyjne dostrojenie wymowy, akcentu i intonacji mowy. Może to zmienić reguły gry, ale wymaga dalszych badań, aby zrozumieć tę funkcję i sposób jej zautomatyzowania.

I wreszcie, obsługa błędów, ponawianie prób i testy — nadal muszą zostać stworzone. Testowałem kod w IDE (zwanym handlerem Lambda z wygenerowanym zdarzeniem) oraz w czasie wdrażania jako test end-to-end.

Chcesz dowiedzieć się więcej o testowaniu aplikacji Serverless? Sprawdź mój post tutaj .