Aksesibilitas Pemberdayaan Tanpa Server: Konversi Teks ke Ucapan dengan Amazon Polly

May 08 2023
Kita hidup di era kemajuan dan inovasi teknologi yang luar biasa yang mengubah setiap aspek kehidupan kita. Dari kecerdasan buatan dan pembelajaran mesin hingga otomatisasi dan data besar, tidak dapat disangkal bahwa masa depan ada di sini.
Burung beo DALL-E duduk di atas awan membaca buku sambil bernyanyi

Kita hidup di era kemajuan dan inovasi teknologi yang luar biasa yang mengubah setiap aspek kehidupan kita. Dari kecerdasan buatan dan pembelajaran mesin hingga otomatisasi dan data besar, tidak dapat disangkal bahwa masa depan ada di sini.

Misalnya, judul postingan blog ini ditulis dengan bantuan ChatGPT agar SEO-nya teroptimasi. Gambar burung beo dibuat dengan bantuan DALL-E.

Bagaimana dengan pemutar audio yang membacakan teks ini untuk Anda? Nah, ternyata itu bisa otomatis juga.

Dan itulah yang akan kita bahas hari ini, mengotomatiskan konversi text-to-speech (TTS) dengan bantuan Amazon Polly.

Saya akan memberikan solusi Tanpa Server yang berfungsi penuh di GitHub dengan kode Python dan AWS CDK. Anda dapat menggunakan kode dan menikmati transformasi text-to-speech dalam hitungan menit.

Klik di sini untuk membuka proyek GitHub.

https://www.ranthebuilder.cloud/

Posting blog ini awalnya diterbitkan di situs web saya, "Ran The Builder."

Aksesibilitas itu Penting

Saya memulai situs web saya, RanTheBuilder , untuk membagikan pengetahuan AWS dan Tanpa Server saya kepada dunia. Situs web yang dapat diakses mempromosikan inklusivitas dan memastikan semua orang dapat mengakses dan terlibat dengan konten. Aksesibilitas telah menjadi perhatian utama dalam beberapa tahun terakhir dan lebih banyak situs web memperhatikan hal itu.

Saya baru-baru ini memperhatikan bahwa Medium telah menambahkan pemutar audio untuk postingan blog yang membacakan postingan untuk Anda, yang merupakan fitur aksesibilitas yang bagus.

Saya tidak tahu bagaimana mereka melakukannya, dan sepertinya di luar jangkauan.

Namun, saya terinspirasi untuk mengambil tindakan segera setelah saya melihat video berikut di YouTube:

Dalam video tersebut, pembuat Komunitas AWS Johannes Koch mewawancarai Jimmy Dahlqvist , sesama pembuat. Mereka membahas bagaimana Jimmy mengotomatiskan pembuatan blognya dengan AWS Step Functions, yang menghasilkan versi ucapan dari teks postingan dengan Amazon Polly.

Saya belum pernah mendengar tentang Amazon Polly tetapi merasa terinspirasi untuk mencobanya sendiri dan akhirnya menyelesaikan fitur aksesibilitas yang hilang di situs web saya.

Saya telah merancang solusi langsung yang memperhatikan kebutuhan saya dengan sempurna, yang relatif sederhana.

Sebelum kita membahas detailnya, mari pelajari tentang Amazon Polly.

Pengantar Layanan Text to Speech Amazon Polly

Amazon Polly adalah layanan text-to-speech (TTS) berbasis cloud. Ini menggunakan teknologi pembelajaran mendalam yang canggih untuk mengubah teks tertulis menjadi ucapan yang nyata, memungkinkan pengembang untuk membuat aplikasi yang mendukung ucapan dengan suara yang terdengar alami.

Polly mendukung berbagai bahasa (24 pada saat penulisan), dan pengguna dapat memilih dari beberapa suara pria dan wanita dengan aksen dan nada yang berbeda (total 47). Layanan ini juga menyediakan fitur lanjutan seperti pengenalan ucapan otomatis (ASR) dan bahasa markup sintesis ucapan (SSML), yang memungkinkan pengembang menyempurnakan pengucapan, penekanan, dan intonasi keluaran ucapan.

Salah satu kekuatan terkuat Amazon Polly adalah layanan Tanpa Server. Ini akan mengeluarkan file audio langsung ke bucket S3, membuatnya mudah untuk dimasukkan ke dalam arsitektur berbasis peristiwa apa pun. Ini akan menangani ukuran teks apa pun yang Anda lemparkan secara otomatis, Anda tidak perlu memutar lebih banyak mesin, dan Anda hanya membayar untuk jumlah karakter yang Anda ubah menjadi ucapan.

Dari waktu singkat saya menggunakannya, itu mudah; teks masuk, file mp3 keluar ke ember S3.

teks masuk, ucapan keluar

Tingkat gratisnya sangat mengesankan dan akan mengakomodasi kebutuhan banyak orang, termasuk kebutuhan saya.

Baca lebih lanjut tentang harga .

Mari kita lihat cara mengotomatiskan pembuatan text-to-speech dengan API Amazon Polly.

Layanan Python Text to Speech Saya

Mari kita bahas tujuan, desain, dan detail implementasi layanan.

Hasil

Saya ingin dapat membuat file .mp3 dari postingan blog saya dan mengunggahnya ke situs web saya saat mengerjakan postingan baru. Layanan harus Tanpa Server, mudah digunakan, dan diterapkan dengan AWS CDK.

Saya ingin penggunaannya sesederhana mungkin:

  • Tambahkan file teks baru ke folder 'teks' layanan TST (text-to-speech).
  • Terapkan layanan ke AWS.
  • Dapatkan file mp3 dikirim ke alamat email saya.

Untuk meringkas: tambahkan file teks ke folder 'teks', terapkan ke AWS, tunggu sebentar, dan kirim file mp3 ke kotak masuk Anda. Sederhana!

Jika Anda ingin mencobanya sendiri, buka proyek di GitHub dan ikuti readme untuk petunjuk dan penggunaan.

Desain Tingkat Tinggi

Dari segi desain, layanan ini cukup sederhana. Anda memiliki entitas penyimpanan cloud yang digunakan untuk input dan pemrosesan perantara.

Kemudian Anda memiliki dua pemain utama: produsen dan konsumen.

Produser mengunggah file teks ke penyimpanan cloud, yang dikirim ke konsumen.

Konsumen akan mengubah file teks menjadi file mp3 dan mengirimkannya melalui email ke alamat email sebagai lampiran.

Desain Tingkat Tinggi

Arsitektur Layanan

Mari lihat arsitekturnya dan lihat bagaimana saya mengimplementasikan setiap entitas.

Penafian: Layanan tingkat POC ini menyediakan otomatisasi untuk kebutuhan saya dengan cara sesederhana mungkin. Kontribusi kode disambut baik!

Arsitektur Layanan

Alur Acara

  1. Pengguna menambahkan file teks baru ke folder 'teks' di folder akar proyek.
  2. Pengguna menerapkan layanan dengan AWS CDK (dapat menggunakan perintah 'make deploy').
  3. File diunggah ke S3.
  4. Fungsi Consumer Lambda dipicu dengan peristiwa 'objek yang dibuat di S3' dan membaca nama file dan nama bucket dari peristiwa tersebut.
  5. Fungsi Consumer Lambda mengirimkan konten teks ke Amazon Polly dan menidurkan/melakukan polling hingga tugas selesai.
  6. Setelah tugas selesai, file mp3 keluaran diunduh dari ember S3 dan dihapus darinya. Karena kami mengirimkannya melalui email, tidak perlu menyimpannya di S3, tetapi Anda dapat menonaktifkannya dan mengirim kembali tautan objek melalui email alih-alih file mp3.
  7. Fungsi Lambda menggunakan Amazon SES untuk mengirimkan file mp3 melalui email sebagai lampiran ke alamat email yang telah ditentukan sebelumnya.

Kami menggunakan bucket Amazon S3 untuk penyimpanan input dan output Amazon Polly untuk entitas penyimpanan cloud. Polly memiliki integrasi asli dengan Polly, jadi masuk akal. Kode CDK bucket dapat ditemukan di sini .

Produser adalah konstruksi AWS CDK khusus yang mengunggah file ke S3 dari folder tertentu. Saya biasanya menambahkan satu file dalam satu waktu dan menyebarkan layanan. Anda juga dapat mengunggah file secara manual ke bucket, tetapi itu mengalahkan tujuannya; kami ingin otomatisasi. Kode CDK produsen dapat ditemukan di sini .

Konsumen adalah fungsi Lambda yang berlangganan peristiwa 'on object create' bucket S3 dan dipicu saat objek baru ditulis.

Fungsi tersebut akan mengambil setiap acara, membacanya, dan mengirimkan kontennya ke Amazon Polly. Ini menggunakan API 'start_speech_synthesis_task' . Saya menggunakan pembungkus SDK sampel resmi Amazon Polly , yang mendapatkan konten file teks dan mengembalikan file mp3 sebagai keluaran — cukup sederhana!

Kode CDK konsumen dapat ditemukan di sini .

Dan kode fungsi Lambda dapat ditemukan di sini .

Penggunaan pembungkus Polly dalam kode saya dapat ditemukan di sini .

Kinerja dan Isu Terbuka

Untuk kasus penggunaan saya, postingan blog 11.000 karakter membutuhkan waktu sekitar 40–50 detik untuk berubah menjadi file mp3 di alamat email saya setelah penerapan selesai. Itu tidak terlalu buruk.

Anda mungkin bertanya-tanya mengapa saya menghapus file mp3 dari S3 dan mengirimkannya sebagai lampiran email.

Yah, saya ingin file mp3 dihapus dan dikirim sebagai lampiran email karena saya ingin mengunggahnya ke situs web saya, di mana penyimpanan sudah dibayar, alih-alih menyimpan dan memutarnya dari akun dev AWS pribadi saya.

Anda mungkin juga bertanya-tanya, ini implementasi yang bagus, tapi, apakah ini optimal? Apakah ini pilihan desain terbaik?

Yah, tidak.

Fungsi konsumen Lambda menunggu dan memilih Polly hingga tugas sintesisnya selesai, yang merupakan praktik buruk baik dari segi kinerja maupun biaya. Namun, untuk proyek POC yang berjalan setiap dua minggu sekali (ketika saya menerbitkan posting baru), itu dapat diterima, setidaknya untuk saat ini.

Solusi yang lebih baik adalah menggunakan Step Functions dengan status tunggu. Polly dapat memberi tahu topik SNS saat tugas selesai; bahwa SNS dapat mengirim pesan ke pesan SQS dan kemudian ke Lambda yang akan mengaktifkan fungsi step dengan token tunggu untuk melanjutkan pengiriman file ke email saya.

Jadi, mengapa saya memilih fungsi Lambda daripada implementasi mesin status fungsi langkah? Beberapa alasan:

  1. Pembungkus AWS Polly memungkinkan saya untuk maju dengan cepat, dan melakukan semuanya dalam proses yang sama (melakukan sleep & polling untuk Anda), jadi fungsi Lambda mudah digunakan di atas fungsi step, yang tidak akan dapat menggunakan SDK.
  2. Anda tidak dapat mengembangkan dan men-debug fungsi langkah di IDE, tidak seperti fungsi Lambda. Saya ingin memberikan nilai secepat mungkin untuk kasus penggunaan ini dan mendapatkan hasil dengan cepat.
  3. Ini lebih tentang menyediakan aksesibilitas dan mempelajari sesuatu yang baru, dan bukan tentang menciptakan solusi siap-produksi terbaik.

Ya, tentu saja. Saya akan melakukannya sebagai bagian dari layanan v2, tetapi kontribusi kode juga diterima!

Bidang peningkatan lainnya adalah saya tidak menggunakan leksikon atau bahasa markup sintesis (SSML), yang memungkinkan pengembang menyempurnakan pengucapan, penekanan, dan intonasi keluaran ucapan. Ini bisa menjadi pengubah permainan tetapi membutuhkan lebih banyak penelitian untuk memahami fitur dan cara mengotomatiskannya.

Dan terakhir, penanganan kesalahan, percobaan ulang, dan pengujian — masih perlu dibuat. Saya menguji kode di IDE (disebut penangan Lambda dengan peristiwa yang dihasilkan) dan selama waktu penerapan sebagai pengujian ujung ke ujung.

Ingin mempelajari lebih lanjut tentang cara menguji aplikasi Tanpa Server? Lihat posting saya di sini .