Windows10のAWS CLI経由でAmazon Pollyを使用してみる

Windows10のAWS CLIを使ってAmazon Pollyを使用してみる

先日、JAWS-UG名古屋の勉強会に行ってきました。久々のCLIという感じだったのですが、RaspberryPiを触っているので何とかなるだろうと思っていたのですが、Windows10のBash環境からの前提だったためか、Webの画面からのコピー&ペーストがうまくいかず泣きたくなりました。

jawsug-nagoya.doorkeeper.jp

CLIの使い方に関しては勉強にはなりましたが、コマンドラインヘルパーみたいなものがないと正直厳しいなあと感じました。

Windows10のBash環境はさすがにアレなので、それ以外の方法を探してみたらふつうにあるんすね>標準のCLIインストーラ。ってことで復習もかねてWindows10でAWS CLIをインストールして、さらに最近Amazonの方が会社に来られたときにPollyっていうのもあるんですよと言われていたので、CLI経由で試してみることにしました。(基本はRESTでの使用ではなく、SDK経由の利用っぽいですけど。)

f:id:ueponx:20170827155118j:plain

Amazon Pollyとは?

Amazon Pollyは、文章をリアルな音声に変換するサービスで、話すことができるアプリケーションを作成でき、まったく新しいカテゴリの音声対応製品を構築できます。Amazon Polly は、高度なディープラーニング技術を使用したテキスト読み上げサービスで、人間の声のような音声を合成します。

引用元 aws.amazon.com

TTS+ディープラーニングという感じのようです。抑揚の部分なんかがディープラーニングの効果なんでしょうかね。

AWS CLIのインストール

AWS コマンドラインインターフェイスAWS CLI)のインストーラは以下のリンクからダウンロードできます。

aws.amazon.com

リンクを開くと以下のような画面になると思います。

f:id:ueponx:20170827155126j:plain

画面の右のほうにインストーラのダウンロードリンクがありますので、OSのbit数にあわせてインストーラをダウンロードします。自分は64bit版を選択しました。

f:id:ueponx:20170827155141j:plain

Windows10のBash環境やそのほかのOSではPythonpipを使ってインストールできます。どっちが簡単かというと…難しいところですね。(Windows10のBash環境でコピペができなかったのはWindowsのビルドに関係しているような気がします。) ダウンロードが終わったらインストーラを起動します。

インストーラが起動したら【Next】ボタンをクリックします。

f:id:ueponx:20170827155152j:plain

続いてライセンス確認の画面になるので、下にある【I accept the terms in the License Agreement】にチェックを入れて、【Next】ボタンをクリックします。

f:id:ueponx:20170827155158j:plain

次はインストールする場所の設定画面になります。デフォルトのロケーションはC:\Program Files\Amazon\AWSCLI\になりますので、変更する際は【Browse…】を押して変更を行ってください。問題ない場合には【Next】ボタンをクリックします。

f:id:ueponx:20170827155204j:plain

あとはインストールを行うだけです。ここまでで問題なければ【Install】ボタンをクリックします。

f:id:ueponx:20170827155211j:plain

進捗がプログレスバーに表示されます。

f:id:ueponx:20170827155218j:plain

以下の画面がでればインストールは完了です。【Finish】をクリックしてインストーラを終了させます。

f:id:ueponx:20170827155229j:plain

あとは実行の確認です。powershellを起動し、以下のように打ち込みます。

PS C:\> aws --version
aws-cli/1.11.141 Python/2.7.9 Windows/8 botocore/1.6.8

CLIのバージョン情報がでていれば問題ありません。(Windows10なのになぜWindows8ってなるのだろうか?)

f:id:ueponx:20170827155312j:plain

インストーラでセットアップを行うとpowershellだけでなくcmdでもAWS CLIを使用できます。

f:id:ueponx:20170827155238j:plain

(注意)PowerShellのCodePageをchcpコマンドで変更していると実行できないようです。

PS > aws configure
Traceback (most recent call last):
  File "aws", line 27, in <module>
  File "aws", line 23, in main
  File "awscli\clidriver.pyc", line 56, in main
  File "awscli\clidriver.pyc", line 192, in main
  File "awscli\argparser.pyc", line 100, in parse_known_args
LookupError: unknown encoding: cp65001

このようになったら

PS > chcp 932
現在のコード ページ: 932

として変更してください。つまりShift_JIS環境でしか使えないということです。cmdでの実行には関係はありません。

Amazon Pollyを使用するためのIAMの設定する

AWS CLIでは使用する際に認証情報を設定しないといけないのでAWSマネージメントコンソールからIAMを設定し、CLIに設定する必要があります。ここからはその設定になります。ここからはあまり自分も詳しくないのでつらい…

IAMの画面からユーザの追加を選択します。今回のユーザー名はpolly_userとして【プログラムによるアクセス】にチェックを入れ、画面下の【次のステップ:アクセス権限】ボタンをクリックします。

f:id:ueponx:20170827155532j:plain

作成されたpolly_userの権限を追加する画面です。

f:id:ueponx:20170827155540j:plain

アクセス権限に【既存のポリシーを直接アタッチ】を選択し、フィルターの検索ボックスにpollyと入力して検索をします。

f:id:ueponx:20170827155550j:plain

すると検索されたリストに

  • AmazonPollyFullAccess
  • AmazonPollyReadOnlyAccess

がでてくるので、今回はAmazonPollyFullAccessにチェックをいれて、【次のステップ:確認】ボタンをクリックします。

(注意)実際には、適切な権限を与えるようにしてください。

ボタンをクリックすると、作成内容の確認画面になります。問題なければ【ユーザの作成】ボタンをクリックします。

f:id:ueponx:20170827155558j:plain

成功すると以下のような画面に遷移します。

f:id:ueponx:20170827155655j:plain

ユーザ名、アクセスキーID、シークレットアクセスキーが表示されますが、画面の中ほどにある【.csvのダウンロード】ボタンをクリックすれば、表示された情報が含まれたCSVファイルがダウンロードできるのでそれをダウンロードしておきます。この情報をあとの手順で使用します。

Amazon PollyをAWS CLIから使用する

CLIに先ほど作成したユーザ名のIAM情報を登録します。 powershell上から以下のコマンドを実行します。

PS C:\> aws configure 
AWS Access Key ID : <ダウンロードしたCSVに記載>
AWS Secret Access Key :<ダウンロードしたCSVに記載>
Default region name :ap-northeast-1
Default output format :json

これで設定できました。 早速、pollyコマンドを実行してみたいと思います。 以下の情報を参考にしています。

docs.aws.amazon.com

すると…

PS C:\> aws polly synthesize-speech --output-format mp3 --voice-id Joanna --text 'Hello,
earned about the W3C on 10/3 of last year.' hello.mp3

Could not connect to the endpoint URL: "https://polly.ap-northeast-1.amazonaws.com/v1/speech"

APIのエンドポイントに接続できないといわれました。 先ほどの設定ではデフォルトのリージョンをap-northeast-1にしていました。このリージョンはpollyに対応していないので対応しているリージョンに変更する必要があります。環境変数で指定してもいいのですが、今回はデフォルト値を変更することにしました。

再度、awsコマンドで設定を行います。デフォルトのリージョンをus-west-2に変更しています。あとは入力せずEnterで前回の設定値が引き継がれます。

これを行わなくても良いようです。Optionスイッチに以下を追加すれば都度リージョンを変更できます。 --region us-west-2

PS C:\> aws polly synthesize-speech --region us-west-2 --output-format mp3 --voice-id Joanna --text 'Hello,
earned about the W3C on 10/3 of last year.' hello.mp3
PS C:\> aws configure 
AWS Access Key ID [********************]: <そのままEnter>
AWS Secret Access Key [********************]:<そのままEnter>
Default region name [ap-northeast-1]:us-west-2
Default output format [json]:<そのままEnter>

設定後、もう一度pollyにアクセスすると…

PS C:\> aws polly synthesize-speech --output-format mp3 --voice-id Joanna --text 'Hello, my name is Joanna. I l
earned about the W3C on 10/3 of last year.' hello.mp3
{
    "ContentType": "audio/mpeg",
    "RequestCharacters": "71"
}
PS C:\Users\CTV> ls hello.mp3

    ディレクトリ: C:\Users\


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2017/08/27     15:12          33743 hello.mp3

無事にPollyによってTTSを行ったmp3ファイル(hello.mp3)がダウンロードされています。

f:id:ueponx:20170827155720j:plain

日本語の場合にはオプションを変更すれば問題ありません。(環境変数を指定してもOKです)

PS C:\Users\> aws polly synthesize-speech --output-format mp3 --voice-id Mizuki --text '坊やだからさ。' polly.mp3
{
    "ContentType": "audio/mpeg",
    "RequestCharacters": "7"
}

f:id:ueponx:20170827155727j:plain

実験してみたのですが、英語と日本語の混じった文章ではどうなるのかなと思ったのですが、英語の部分は英語にしてくれているのでAIっぽさのあるTTSになっているのだなと思いました。他のだと混じっているとうまくいかないことが多いのでかなり助かります。

たとえば以下のようにすると```you````の部分はユーと話してくれます。ルー語もOKのようです。

PS C:\Users\> aws polly synthesize-speech --output-format mp3 --voice-id Mizuki --text 'youは坊やだからさ。' polly.mp3

{
    "ContentType": "audio/mpeg",
    "RequestCharacters": "11"
}

番外編

RaspberryPiにもAWS CLIをインストールしてみました。ドキュメント通りpip install awscliでインストールしています。

$ pip install awscli
Collecting awscli
  Downloading awscli-1.11.141-py2.py3-none-any.whl (1.2MB)
    100% |????????????????????????????????| 1.2MB 225kB/s
Collecting PyYAML<=3.12,>=3.10 (from awscli)
  Downloading PyYAML-3.12.tar.gz (253kB)
    100% |????????????????????????????????| 256kB 807kB/s
Collecting rsa<=3.5.0,>=3.1.2 (from awscli)
  Downloading rsa-3.4.2-py2.py3-none-any.whl (46kB)
    100% |????????????????????????????????| 51kB 1.7MB/s
Collecting botocore==1.6.8 (from awscli)
  Downloading botocore-1.6.8-py2.py3-none-any.whl (3.6MB)
    100% |????????????????????????????????| 3.6MB 71kB/s
Collecting docutils>=0.10 (from awscli)
  Downloading docutils-0.14-py2-none-any.whl (543kB)
    100% |????????????????????????????????| 552kB 419kB/s
Collecting s3transfer<0.2.0,>=0.1.9 (from awscli)
  Downloading s3transfer-0.1.10-py2.py3-none-any.whl (54kB)
    100% |????????????????????????????????| 61kB 1.8MB/s
Collecting colorama<=0.3.7,>=0.2.5 (from awscli)
  Downloading colorama-0.3.7-py2.py3-none-any.whl
Collecting pyasn1>=0.1.3 (from rsa<=3.5.0,>=3.1.2->awscli)
  Downloading pyasn1-0.3.3-py2.py3-none-any.whl (63kB)
    100% |????????????????????????????????| 71kB 1.9MB/s
Collecting python-dateutil<3.0.0,>=2.1 (from botocore==1.6.8->awscli)
  Downloading python_dateutil-2.6.1-py2.py3-none-any.whl (194kB)
    100% |????????????????????????????????| 194kB 968kB/s
Collecting jmespath<1.0.0,>=0.7.1 (from botocore==1.6.8->awscli)
  Downloading jmespath-0.9.3-py2.py3-none-any.whl
Collecting futures<4.0.0,>=2.2.0; python_version == "2.6" or python_version == "2.7" (from s3transfer<0.2.0,>=0.1.9->awscli)
  Downloading futures-3.1.1-py2-none-any.whl
Collecting six>=1.5 (from python-dateutil<3.0.0,>=2.1->botocore==1.6.8->awscli)
  Downloading six-1.10.0-py2.py3-none-any.whl
Building wheels for collected packages: PyYAML
  Running setup.py bdist_wheel for PyYAML ... done
  Stored in directory: /home/pi/.cache/pip/wheels/2c/f7/79/13f3a12cd723892437c0cfbde1230ab4d82947ff7b3839a4fc
Successfully built PyYAML
Installing collected packages: PyYAML, pyasn1, rsa, six, python-dateutil, docutils, jmespath, botocore, futures, s3transfer, colorama, awscli
Successfully installed PyYAML-3.12 awscli-1.11.141 botocore-1.6.8 colorama-0.3.7 docutils-0.14 futures-3.1.1 jmespath-0.9.3 pyasn1-0.3.3 python-dateutil-2.6.1 rsa-3.4.2 s3transfer-0.1.10 six-1.10.0

awsコマンドを実行してもうまく行かなったのですが、インストールパスが違っていたようです。

$ ~/.local/bin/aws --version
aws-cli/1.11.141 Python/2.7.13 Linux/4.9.41-v7+ botocore/1.6.8
$ ~/.local/bin/aws configure
AWS Access Key ID : <ダウンロードしたCSVに記載>
AWS Secret Access Key :<ダウンロードしたCSVに記載>
Default region name :us-west-2
Default output format :json

設定はこれでOKです。

では、Pollyを呼び出して見ます。

$ ~/.local/bin/aws polly synthesize-speech --output-format mp3 --voice-id Mizuki --text 'youは坊やだからさ。' polly.mp3 ; mpg321 polly.mp3
{
    "ContentType": "audio/mpeg",
    "RequestCharacters": "11"
}
High Performance MPEG 1.0/2.0/2.5 Audio Player for Layer 1, 2, and 3.
Version 0.3.2-1 (2012/03/25). Written and copyrights by Joe Drew,
now maintained by Nanakos Chrysostomos and others.
Uses code from various people. See 'README' for more!
THIS SOFTWARE COMES WITH ABSOLUTELY NO WARRANTY! USE AT YOUR OWN RISK!

Playing MPEG stream from polly.mp3 ...
MPEG 2.0 layer III, 48 kbit/s, 22050 Hz mono

[0:01] Decoding of polly.mp3 finished.

無事にTTSが行われました。

おわりに

AWS CLIAmazon Pollyを使ってみました。アルファベット混じり文章も使えるし、抑揚もいい感じなので使えそうですね!というか英語はもう実用レベルでしょう。

DragonBoard410cでもつかえるのかな?pythonだし使えると思いますが、あとで実験してみます。

/* -----codeの行番号----- */