アプリ開発日誌
2018.02.07
Amazon Pollyを使って、ニュースのタイトルを読み上げてみた
サーバー開発担当の木下です。
Meltdown/Spectreが騒がれていますね。クラウドベンダーは早々に対策を打っていたようで木下的には一安心ですが、IntelのCEOによるインサイダーが疑われたり、対策方法にツッコミが入ったりと、問題自体はまだまだ長引きそうです。
さて今回は、テキスト読み上げをしてくれるAmazon Pollyを使ってみました。
Amazon Pollyとは
Amazon Web Servicesで提供されているサービスの一つで、テキストを音声に変換してくれるものです。テキストと一緒に音声合成マークアップ言語もリクエストすることで、よりリアルな話し声に変換できるようです。
料金ですが、テキストのリクエストであれば100万文字ごとに4USDで使用できるので、国内ベンダーの音声合成サービスより安価に運用できると思います。
使ってみた
今回はJavaScriptを使って、NHK NEWS WEBのRSSフィードを取得して新しい記事があったらそのタイトルを読み上げる、というものを作ってみました。
まずはPollyのリクエストに使う認証情報(IAMユーザー)の作成です。
1. AWSコンソールにログインします。
2. 「セキュリティ認証情報」ページの左ペインにある「ユーザー」を開きます。
4. 「ユーザー名」を入れます。適当なもので良いと思います。アクセスの種類は「プログラムによるアクセス」のみチェックを入れ、「次のステップ:アクセス権限」を押します。
5. 「既存のポリシーを直接アタッチ」をクリックします。下部の検索窓に「polly」とか入れると下のテーブルに「AmazonPollyFullAccess」が出てくると思うので、チェックをいれ、「次のステップ:確認」を押します。
6. 「ユーザーの作成」を押します。
7. アクセスキーIDとシークレットアクセスキーをどこかにコピーしておき、「閉じる」を押します。
これで、IAMユーザーの作成が完了しました。
次に、JavaScriptでスクリプトを書いてみました。AWS SDK for JavaScriptとjQueryを読み込んでいます。
NHKのRSSフィードを30000ms(=30秒)ごとに読み込んで先頭の記事の公開日時を参照し、前回の読み込み時刻(30秒前)より新しければその記事の件名をPollyにリクエストして、返ってきたmp3を読み上げるというロジックです。
<script src="https://sdk.amazonaws.com/js/aws-sdk-2.189.0.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <script> var intervalMs = 30000; // 何ミリ秒ごとに実行するか var awsPollyRegion = 'ap-northeast-1'; // Amazon Pollyを実行するリージョン var awsAccessKeyId = '〜IAMユーザーのアクセスキーID〜'; // IAMユーザーのアクセスキーID var awsSecretAccessKey = '〜IAMユーザーのシークレットアクセスキー〜'; // IAMユーザーのシークレットアクセスキー var lastParsedTime = 0; var pollyParams = { OutputFormat: "mp3", SampleRate: "8000", Text: '', TextType: "text", VoiceId: "Mizuki" }; AWS.config.update({accessKeyId: awsAccessKeyId, secretAccessKey: awsSecretAccessKey, region: awsPollyRegion}); var polly = new AWS.Polly({apiVersion: '2016-06-10'}); $(function(){ setInterval(function(){ exec(); // intervalMsで定義したmsごとに実行 }, intervalMs); }); exec(); //初回実行 function exec(){ $.ajax({ url: 'https://www3.nhk.or.jp/rss/news/cat0.xml', dataType: 'xml', success: function(res) { var item = $(res).find('item'); var title = item.find('title')[0].innerHTML; var pubDate = item.find('pubDate')[0].innerHTML; var pubDateMs = new Date(pubDate).getTime(); if (pubDateMs > lastParsedTime) { // ここで読み上げ pollyParams.Text = title; polly.synthesizeSpeech(pollyParams, function(err, data){ if (err) console.log(err); else console.log(data); var audioElement = document.createElement('audio'); audioElement.setAttribute('id', 'audioElement' + pubDateMs); document.body.appendChild(audioElement); var uInt8Array = new Uint8Array(data.AudioStream); var blob = new Blob([uInt8Array.buffer]); audioElement.src = URL.createObjectURL(blob); audioElement.play(); }); console.log(title); } var lastParsedDate = new Date(); lastParsedTime = lastParsedDate.getTime(); console.log(lastParsedDate); } }); } </script>
音声認識・合成はぜひイーディーエーへ!
イーディーエーでは、音声認識や音楽を活用したアプリの開発実績があります。
お気軽にお問い合わせください!