この記事は、はてなエンジニア Advent Calendar 2017の4日目の記事です。 昨日は、id:Songmu さんによる「go-memcached-toolを書いていた | おそらくはそれさえも平凡な日々」でした。
前置き
数年前からPodcast的サービスに関心があり、はてなでも何かできないかなと個人的に可能性を探っています。
スマホで社員インタビューやひとり語りなどを録音して、社内向けに作ったPodcastサービスで配信したりもしてみました。
(フロントエンドランチの初期の頃は、このサービスを使って、公開前に確認したりしていました)
その流れで、Text to Speech や Speech to Text のAPIにも注目している昨今です。
今回は、AWSが提供するText to SpeechのAPI、Amazon Pollyを触ってみました。
Amazon Pollyとは
AWSが提供するText to SpeechのAPIです。
テキストをインプットするといい感じで音声ファイルを返してくれます。日本の使用例として、コミュニティFMがDJを雇わずにこのAPIで生成された音声で放送をしている例があります。
仕様
AWSのコンソールからAmazon Pollyにアクセスすると下記のような画面になります。コマンドラインで実行する方法もありますが、今回はコンソール画面から操作します。
下記画面に、音声に変換したいテキストを入力して「音声を聴く」をクリックすると、すぐに音声に変換してくれます。その下の「MP3のダウンロード」をクリックすると、その音声ファイルがダウンロードできます。
日本語や英語をはじめ、10言語以上が対応しており、ひとつの言語につき複数の音声が用意されています。日本語はMizuki(女性)とTakumi(男性)の音声が用意されています。英語だと女性5タイプ、男性3タイプと8タイプの音声が用意されています。
今のところ1回の生成で複数の音声を混ぜることはできなさそう。なので女性と男性が会話する、みたいな音声ファイルを作りたいときは工夫が必要です。
変換にかかるコストは格安。AWS的には安く生成したファイルを大量に配信してもらって、そちらの方でたくさんお金を使ってもらいましょうという雰囲気のようですね。
一度に変換できる文字数には制限があり、1500文字まで。これが多いようで結構少なく、がっつり聴かせるテキストを変換しようとすると文字数オーバーになってしまいます。1500文字以上のテキストを変換したいときは、文章の区切りの良いところで2つに分け、2回に分けてmp3ファイルを生成し、結合する必要があります。試しに雑にcatコマンドで結合してみましたが、普通に聴くことができました(が、ファイル的には変なことになっていると思います)。
さて、プレーンなテキストを雑に変換するだけでも、だいぶ聴けるファイルが出来上がりますが、SSMLを使って細かく指定することで、きちんとした読み方で読ませたり、読むスピードや声の高さなどを変更することができます。
試しに以下のSSMLを変換してみました。
<speak> こんにちは、私です。 今日はSSMLの実験を色々としてみます。 エイリアスの実験です。 宇宙と書いて<sub alias="そら">宇宙</sub>と読みます。 1秒、<sub alias="ま">間</sub>を取ります。 <break time="1s"/> 500ミリ秒あけます <break time="500ms"/> ヒソヒソ声を試します。 <amazon:effect name="whispered">ひそひそ話ですよー。ウィスパーボイスになっていますか?</amazon:effect> <prosody volume="loud">大きな声を試します。<amazon:effect name="drc">ここからは移動中の車の中でもわかるようになる</amazon:effect></prosody> rateを試します。 x-slow <prosody rate="x-slow">むかしむかしあるところに、おじいさんとおばあさんがいました</prosody> slow <prosody rate="slow">むかしむかしあるところに、おじいさんとおばあさんがいました</prosody> medium <prosody rate="medium">むかしむかしあるところに、おじいさんとおばあさんがいました</prosody> fast <prosody rate="fast">むかしむかしあるところに、おじいさんとおばあさんがいました</prosody> x-fast <prosody rate="x-fast">むかしむかしあるところに、おじいさんとおばあさんがいました</prosody> pitchを変えます。 x-low <prosody pitch="x-low">おじいさんはやまへ芝刈りに、おばあさんは川へ洗濯に行きました</prosody> low <prosody pitch="low">おじいさんはやまへ芝刈りに、おばあさんは川へ洗濯に行きました</prosody> medium <prosody pitch="medium">おじいさんはやまへ芝刈りに、おばあさんは川へ洗濯に行きました</prosody> hight <prosody pitch="high">おじいさんはやまへ芝刈りに、おばあさんは川へ洗濯に行きました</prosody> x-high <prosody pitch="x-high">おじいさんはやまへ芝刈りに、おばあさんは川へ洗濯に行きました</prosody> </speak>
実際に変換したファイルはこちら
指定するのは手間がかかりますが、手間をかければラジオのDJのような芸の細かい放送も作ることが可能そうです。