サーバーレスでアクセシビリティを強化: Amazon Polly でテキストを音声に変換
私たちは、技術の進歩とイノベーションが私たちの生活のあらゆる側面を変革する信じられないほどの時代に生きています。人工知能や機械学習から自動化やビッグデータまで、未来がここにあることは否定できません。
たとえば、このブログ記事のタイトルは、SEO 最適化のために ChatGPT の助けを借りて書かれています。オウムの画像は、DALL-E の助けを借りて作成されました。
このテキストを読み上げるオーディオ プレーヤーはどうでしょうか。まあ、それも自動化できることがわかりました。
そして、Amazon Polly の助けを借りて、テキストから音声への (TTS) 変換を自動化することについて、今日説明します。
Python コードと AWS CDK を使用して、完全に機能するサーバーレス ソリューションを GitHub で提供します。コードをデプロイして、テキストから音声への変換を数分で楽しむことができます。
GitHub プロジェクトにアクセスするには、ここをクリックしてください。
このブログ投稿は、もともと私の Web サイト「Ran The Builder」で公開されたものです。
アクセシビリティは重要です
AWS とサーバーレスの知識を世界と共有するために、ウェブサイトRanTheBuilderを開始しました。アクセシブルな Web サイトは包括性を促進し、すべての人がコンテンツにアクセスして関与できるようにします。近年、アクセシビリティが主要な段階にあり、より多くの Web サイトがそれに注目しています。
最近、Medium がブログ記事を読み上げるオーディオ プレーヤーを追加していることに気付きました。これは優れたアクセシビリティ機能です。
彼らがどうやってそれをしたのか私にはわからなかったし、手の届かないものに思えた。
しかし、YouTube で次のビデオを見て、すぐに行動を起こすように促されました。
このビデオでは、AWS コミュニティ ビルダーのJohannes Koch が、仲間のビルダーであるJimmy Dahlqvistにインタビューしています。彼らは、Jimmy が AWS Step Functions を使用してブログの作成を自動化し、Amazon Polly を使用して投稿テキストの音声バージョンを作成した方法について説明します。
Amazon Polly のことは聞いたことがありませんでしたが、自分で試してみて、私のウェブサイトに欠けている目立つアクセシビリティ機能を最終的に解決したいと思いました。
私は、比較的控えめな私のニーズを完全に満たす簡単なソリューションを設計しました。
詳細に進む前に、Amazon Polly について学びましょう。
Amazon Polly テキスト読み上げサービスの紹介
Amazon Polly は、クラウドベースのテキスト読み上げ (TTS) サービスです。高度なディープ ラーニング テクノロジを使用して、書かれたテキストをリアルな音声に変換し、開発者が自然な音声で音声対応アプリケーションを作成できるようにします。
Polly は幅広い言語 (執筆時点で 24) をサポートし、ユーザーはさまざまなアクセントとトーン (合計 47) の複数の男性と女性の声から選択できます。このサービスは、自動音声認識 (ASR) や音声合成マークアップ言語 (SSML) などの高度な機能も提供し、開発者が音声出力の発音、強調、イントネーションを微調整できるようにします。
Amazon Polly の強みの 1 つは、サーバーレス サービスであることです。音声ファイルを S3 バケットに直接出力するため、イベント駆動型ベースのアーキテクチャに簡単に組み込むことができます。どんなテキストサイズでも自動的に処理し、追加のマシンをスピンアップする必要はなく、音声に変換する文字数に対してのみ料金が発生します。
使用して間もないので、簡単です。テキストが入り、mp3 ファイルが S3 バケットに出ていきます。
無料利用枠は印象的で、私のものを含め、多くの人のニーズに対応します。
料金の詳細をお読みください。
Amazon Polly の API を使用してテキスト読み上げの作成を自動化する方法を見てみましょう。
私のテキスト読み上げ Python サービス
サービスの目標、設計、および実装の詳細を見ていきましょう。
目標
ブログ投稿の .mp3 ファイルを作成し、新しい投稿の作業中にそれらを自分の Web サイトにアップロードできるようにしたいと考えています。サービスはサーバーレスで、使いやすく、AWS CDK でデプロイする必要があります。
使い方はできるだけシンプルにしたい:
- 新しいテキスト ファイルを TST (テキスト読み上げ) サービスの「テキスト」フォルダーに追加します。
- サービスを AWS にデプロイします。
- mp3 ファイルを私のメール アドレスに配信します。
要約すると、テキスト ファイルを「text」フォルダに追加し、AWS にデプロイし、少し待ってから、受信トレイに配信される mp3 ファイルを取得します。単純!
自分で試してみたい場合は、 GitHubのプロジェクトにアクセスし、readme に従って手順と使用法を確認してください。
ハイレベルなデザイン
デザインの観点から見ると、このサービスは非常にシンプルです。入力と中間処理に使用されるクラウド ストレージ エンティティができました。
次に、生産者と消費者という 2 つの主要なプレーヤーがいます。
プロデューサーはテキスト ファイルをクラウド ストレージにアップロードし、それがコンシューマーに送信されます。
消費者はテキスト ファイルを mp3 ファイルに変換し、添付ファイルとして電子メール アドレスに送信します。
サービス アーキテクチャ
アーキテクチャを調べて、各エンティティをどのように実装したかを見てみましょう。
免責事項:この POC レベルのサービスは、可能な限り簡単な方法で私のニーズに合わせた自動化を提供します。コードの寄稿は大歓迎です!
イベントの流れ
- ユーザーは、プロジェクトのルート フォルダーの「text」フォルダーに新しいテキスト ファイルを追加します。
- ユーザーは AWS CDK を使用してサービスをデプロイします (コマンド「make deploy」を使用できます)。
- ファイルが S3 にアップロードされます。
- コンシューマー Lambda 関数は、「S3 で作成されたオブジェクト」イベントでトリガーされ、イベントからファイル名とバケット名を読み取ります。
- コンシューマー Lambda 関数は、テキスト コンテンツを Amazon Polly に送信し、タスクが完了するまでスリープ/ポーリングします。
- タスクが完了すると、出力 mp3 ファイルが S3 バケットからダウンロードされ、そこから削除されます。メールで送信するため、S3 に保存する必要はありませんが、無効にして、mp3 ファイルの代わりにオブジェクトのリンクをメールで返信できます。
- Lambda 関数は Amazon SES を使用して、mp3 ファイルを添付ファイルとして事前定義された E メールアドレスに E メールで送信します。
クラウド ストレージ エンティティの入力ストレージと Amazon Polly 出力ストレージの両方に Amazon S3 バケットを使用します。Polly は Polly とネイティブに統合されているため、完全に理にかなっています。バケットの CDK コードはこちらにあります。
プロデューサーは、特定のフォルダーから S3 にファイルをアップロードする特別な AWS CDK コンストラクトです。通常、一度に 1 つのファイルを追加して、サービスをデプロイします。ファイルをバケットに手動でアップロードすることもできますが、それでは目的が果たせません。自動化が必要です。プロデューサーの CDK コードは、ここにあります。
コンシューマーは、S3 バケットの「オブジェクト作成時」イベントにサブスクライブし、新しいオブジェクトが書き込まれたときにトリガーされる Lambda 関数です。
この関数は各イベントを受け取り、それを読み取り、その内容を Amazon Polly に送信します。「start_speech_synthesis_task」APIを使用します。Amazon Polly の公式サンプル SDKラッパーを使用しました。これは、テキスト ファイルの内容を取得し、出力として mp3 ファイルを返します。非常にシンプルです。
コンシューマ CDK コードは、ここにあります。
Lambda 関数のコードは、ここにあります。
私のコードでの Polly ラッパーの使用法については、こちらを参照してください。
パフォーマンスと未解決の問題
私の使用例では、デプロイが完了すると、11,000 文字のブログ投稿がメール アドレスの mp3 ファイルに変換されるまでに約 40 ~ 50 秒かかります。悪くない。
S3 から mp3 ファイルを削除し、メールの添付ファイルとして送信する理由を不思議に思われるかもしれません。
個人の AWS dev アカウントに保存して再生するのではなく、ストレージがすでに支払われているウェブサイトにアップロードしたいので、mp3 ファイルを削除してメールの添付ファイルとして送信したいと考えています。
また、これは素晴らしい実装ですが、最適な実装でしょうか?と疑問に思うかもしれません。それは最良の設計オプションですか?
うーん、ダメ。
コンシューマー Lambda 関数は、その合成タスクが完了するまで Polly を待機してポーリングします。これは、パフォーマンスとコストの両方の観点から悪い習慣です。ただし、2 週間に 1 回 (新しい投稿を公開するとき) 実行される POC プロジェクトの場合、少なくとも今のところは許容範囲内です。
より良い解決策は、待機状態で Step Functions を使用することです。Polly は、タスクが完了したときに SNS トピックを通知できます。その SNS はメッセージを SQS メッセージに送信し、次に Lambda に送信できます。Lambda は待機トークンを使用してステップ関数を起動し、ファイルをメールに送信し続けます。
では、なぜステップ関数ステート マシンの実装ではなく Lambda 関数を選択したのでしょうか? いくつかの理由:
- AWS Polly ラッパーを使用すると、すばやく進めることができ、すべて同じプロセスで実行されます (スリープとポーリングが自動的に実行されます)。 SDK。
- Lambda 関数とは異なり、IDE でステップ関数を開発およびデバッグすることはできません。私は、このユース ケースにできるだけ早く価値を提供し、結果をすぐに得たいと考えていました。
- アクセシビリティを提供し、何か新しいことを学ぶことが重要であり、可能な限り最高の本番環境対応ソリューションを作成することは重要ではありません。
はい、もちろん。サービスの v2 の一部として行いますが、コードの寄稿も大歓迎です!
もう 1 つの改善点は、レキシコンや合成マークアップ言語 (SSML) を使用していないことです。これにより、開発者は音声出力の発音、強調、およびイントネーションを微調整できます。これは大変革をもたらす可能性がありますが、機能と自動化の方法を理解するには、さらに調査が必要です。
そして最後に、エラー処理、再試行、およびテスト — まだ作成する必要があります。IDE (生成されたイベントで Lambda ハンドラーと呼ばれる) でコードをテストし、デプロイ時にエンドツーエンド テストとしてテストしました。
サーバーレス アプリケーションをテストする方法について詳しく知りたいですか? ここで私の投稿をチェックしてください。