アプリ開発に利用可能な音声合成まとめ


#概要

今年１年アプリ開発で様々な音声合成サービスに触れたため、音声合成(音声読み上げ)をアプリ開発で利用するための情報についてまとめます。現状音声合成を利用しているアプリは多くはありませんが、今後導入を検討している人の手助けになれば幸いです。

#対象 
アプリ開発者 (iOS / Android 向け) ※一部Webアプリ系も含む
サービスで音声合成の利用を検討している人

#分類
さっそくまとめていきます。
音声合成の利用を検討する際、選択肢はまず3つあります。

1. 標準APIの利用
2. サードパーティAPIの利用
3. 自前で用意

|種類|実装工数|クオリティ|カスタマイズ性|
|----|----|------|------|
|標準API |◎| △| ×|
|サードパーティAPI |△| ◎| △|
|自前 |×| --| ◎|


数年前までは「1」の選択肢がほとんど存在しない状態でしたが、ここ最近iOS/Android共にSwift(Objective-C)、Kotlinから音声合成用の標準APIを利用できるようになりました。数行のコーディングで実現ができるので、さくっと導入したい人にもってこいです。
アプリ開発で利用できる音声合成を提供しているサードパーティサービスも多数存在します。無料のサービスから高価なサービスまであり、声質やクオリティなど、相性の高いサービスがあればぜひ利用をしたいところです。
自前で音声合成APIを用意する場合、ハードルは極端に高くなりますが、自前の音響モデルを利用するなどして自由性の高い音声合成を実現できます。

#標準APIの利用

最もライトにアプリ開発で利用のできる音声合成です。
## iOS 
iOS7から利用が可能になった、AVSpeechSynthesizerを利用できます。

AVSpeechSynthesizer
https://developer.apple.com/documentation/avfoundation/avspeechsynthesizer

## Android
TextToSpeechを利用することでAndroidでも音声合成が利用可能です。
端末が日本語の音声読み上げに対応している必要があります。
数年前までは利用できない端末が目立ちましたが、2018年12月現在、ほとんどの端末で利用が可能だと思われます。

TextToSpeech
https://developer.android.com/reference/android/speech/tts/TextToSpeech

※端末で利用が可能かどうかは、
「設定」->「システム」->「言語と入力」->「詳細設定」->「テキスト読み上げの出力」の言語設定から確認できます。

#サードパーティAPIの利用
音声合成のサードパティAPIは多数存在していますが、その中で触ったことのあるサービスや気になっているサービスをピックアップします。

## Google Cloud TTS
Google Cloud サービスの１つとして、「Google Cloud Text To Speech」が提供されています。
https://cloud.google.com/text-to-speech/
WebAPI経由で音声合成が可能です。モバイルアプリに限らず、WebアプリやIoT機器からの利用ももちろん可能です。

特徴は、
・多言語に対応している
・SSMLサポート
・声の速度・ピッチをチューニング可能
・ボリュームのゲインコントロール

等があります。
最近、日本語の音声合成がWaveNet対応して精度が格段に向上した模様です。
ニュースの読み上げなどはかなりの精度で実現が可能です。
機械的ではあるため、おしゃべりキャラクターの音声にするなど、愛嬌や個性を持たせたいケースなどには少し物足りなさはあります。

利用は従量課金制ですが、無料トライアルがあります。
Androidでサクッと試せる実装方法を紹介したので、よかったらこちらもお読みください。
[AndoirdからGoogle Cloud Text To Speech を使ってみる【音声を合成する】](https://qiita.com/maKunugi/items/16f2fcfbe5d4567b44bd)

## Amazon Polly
Amazonが提供している音声合成APIです。Google Cloud TTS 同様、WebAPIとして提供されています。
こちらもモバイルアプリに限らず、様々なプラットフォームでの利用が想定されています。

特徴は、
・多言語に対応している
・SSMLサポート
・声の速度・ピッチをチューニング可能
・低価格での利用 (従量課金)

Amazon Pollyの料金はテキスト数による従量課金制ですが、そもそもの料金設定が安価であることや、最初のリクエストから12ヶ月間は500万文字まで無料枠があることため、気軽に試すことができます。
Google Cloud TTS 同様、ニュースの読み上げなどはかなりの精度で実現が可能ですが、機械的ではあるため、おしゃべりキャラクターの音声にするなど、愛嬌や個性を持たせたいケースなどには少し物足りなさはあります。
https://aws.amazon.com/jp/polly/

## AITalk
株式会社エーアイトークの提供する高品質な音声合成サービス。日本国内のサービスで多く利用されています。
豊富な話者や感情表現のできるクオリティの高い音声合成エンジンをWeb API、SDK、Serverなど様々な形態で提供しています。
https://www.ai-j.jp/about/

###Docomo Developer Supportでの利用
Docomo Developer Supportに登録すると、AITalkの音声合成をWeb API経由で無料(API利用規約の許可する範囲で)利用が可能です。
https://dev.smt.docomo.ne.jp/?p=docs.api.page&api_name=text_to_speech&p_name=api_usage_scenario

高クオリティかつSSML利用、ピッチや和速のカスタマイズが可能な音声合成が無料で試せます。
話者も選択でき、個性や愛嬌のある音声合成が利用できるため、上述した音声合成と比較しても自然な読み上げになっています。

Android, iOS向けにSDKも提供されています。(iOSはObjective-C用になっているので、Bridgeさせる必要がありそうです　※iOSは試してません)
https://dev.smt.docomo.ne.jp/?p=docs.api.page&api_name=text_to_speech&p_name=sdk#tag01

※ 2019年12月追記: Docomo Developer Support経由での提供は終了した模様

## HOYA 音声合成
HOYA株式会社が提供する音声合成サービス。
http://voicetext.jp/products/
AITalkのように、WebAPI、Micro SDK、Server SDKなど様々な形態で音声合成を提供しています。国内の多くのサービスで利用されています。
少し前まで、無料でお試しが可能なWebAPIを公開されていましたが、現在はCloseした模様です。

# 自前で用意 (おまけ)
勉強途中ですが、自前で音声合成を用意する方法についても軽くですが触れます。
クオリティの高い音声合成を実現しようとすれば、多大な労力と費用がかかります。よっぽどの理由がない限り、上述したような音声合成APIを利用するのが楽です。


## Open JTalkの利用

Open JTalkは名古屋工業大学が開発しているHMMベースの音声合成システム。
http://open-jtalk.sp.nitech.ac.jp/

入力された日本語テキストに基づいて自由な音声を生成することのできます。(オープンソース)
HMM音声合成用の音響モデルファイル(.htsvoiceファイル)を利用して読み上げを行います。
Open JTalkの標準音声としても音響モデルが公開されているので、そちらを利用すれば自前で音響モデルを用意せずに、音声合成を試すことができます。

Open JTalkを利用した音声合成用のWebAPIサーバを立てようと模索をしていた時期があったのですが、下記の記事が大変参考になりました。

・Open JTalkで音声合成してみた - https://qiita.com/u6k/items/ca3e6486ac8e675c61cb

なんと、上記記事を書いた方がOpen Jtalkを利用できるDockerFileを公開してくれています。
Open JTalkで音声合成用のサーバを立てて試したい場合は利用させてもらうと良いかもしれません。

尚、音響モデル(.htsvoiceファイル)は自作が可能です。音響モデルを自作することで、独自の声による音声合成を実現することができます。

音響モデル構築には大きく３つのステップがあります。

1. 音声データの準備 (ATR503など)
2. 音素ラベルファイルの作成
3. 音素ラベルファイルと音声データを利用して音響モデルを構築する

ネット上で音響モデル構築について解説してくれているサイトや独自作成した音響モデルを公開している方もいるので、興味のある方は調べてみてください。(.htsvoiceファイル作成には要Linux環境です)
(参考)
- Open JTalkの音響モデルを作ってもらったので自分と会話ができちゃうのだ　https://blog.backspace.fm/open-jtalk%E3%81%AE%E9%9F%B3%E9%9F%BF%E3%83%A2%E3%83%87%E3%83%AB%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%A6%E3%82%82%E3%82%89%E3%81%A3%E3%81%9F%E3%81%AE%E3%81%A7%E8%87%AA%E5%88%86%E3%81%A8%E4%BC%9A%E8%A9%B1%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%A1%E3%82%83%E3%81%86%E3%81%AE%E3%81%A0-2960e4708b2c
- 音響モデルの作成　http://cube370.wiki.fc2.com/wiki/%E9%9F%B3%E9%9F%BF%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E4%BD%9C%E6%88%9


関連ソフトウェアや情報が揃っているOpen JTalkは利用がしやすいので、まずは動かしてみたい人にはおすすめです。
上記のDockerFileを利用させてもらえば音声合成用APIサーバを立てて、アプリから叩いて利用するといったことが短時間で試せます。

ただ、HMMベースの音声合成に加え、近年は深層学習に基づく音声合成が普及しつつあるようなので、最新のトレンドとしてはそちらを追う方が良いかもしれません。

(参考)
- http://r9y9.github.io/blog/2017/08/16/japanese-dnn-tts/
- http://createwith.ai/paper/20180216/1192


以上、アプリから音声合成を利用したい人向けのメモでした。
少しでもお役に立てれば幸いです。