2015.02.05   |   Android

Androidで音声合成APIを試してみた(HOYA音声合成API)

人間が読むように自然なHOYAの音声合成がAPI経由で利用できると聞いて試してみました。音声合成というのは文字列を入力するだけで機械が読み上げてくれるあれです。最近はカーナビやテレビのナレーションにも利用されているくらい実用性が高くなってきているみたいです。

HOYA公式からでもAPI利用できるのですが、今回はドコモのAPIプラットフォーム経由で利用してみることにしました。ドコモからだと他のAPIもまとめて利用申請できるので便利です。(ただ、ドコモの場合、音声合成APIを3社が別々に出していて、マニュアルがどれと対応しているのか理解するのが大変でした。。)

HOYA公式: https://cloud.voicetext.jp/webapi
ドコモ公式: https://dev.smt.docomo.ne.jp/?p=index

ちなみにどちらも無料で使えます。

Androidから利用する

HOYAの音声合成の場合、専用のSDKみたいなのは用意されていないので、Androidから利用する場合はWebAPIを叩いて利用する必要があります。

// API_KEYを取得して連結
// これはドコモ版なので、ドコモのAPI_KEYを入れます。
String url = "https://api.apigw.smt.docomo.ne.jp/voiceText/v1/textToSpeech?APIKEY=" + API_KEY;

// APIを叩く準備をする
HttpClient httpClient = new DefaultHttpClient();
HttpPost post = new HttpPost(url);

// パラメータ設定
ArrayList<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("text", message));
params.add(new BasicNameValuePair("speaker", "hikari"));

// ヘッダーは無くても動くっぽい
post.setHeader("Content-Type", "application/x-www-form-urlencoded");

HttpResponse res = null;
try {
    // パラメータを詰めてAPIを叩く
    post.setEntity(new UrlEncodedFormEntity(params, "utf-8"));
    res = httpClient.execute(post);
} catch (IOException e) {
    e.printStackTrace();
}

ベタ書きするとこんな感じでAPIを叩けます。
この通信は同期的に行われるので、Androidで利用する際は、AsyncTaskなりThreadなりでバックグラウンド実行してあげないと実行時にエラーになってしまいます。パラメータを追加することで、声質や感情、速度などを変えることも可能です。

long size = res.getEntity().getContentLength();
byte[] byteData = EntityUtils.toByteArray(res.getEntity());

このAPIを叩くとレスポンスがWAVE(.wav)形式のBinaryで直接返ってきます。AndroidはWAVE形式に対応しているので、このバイナリデータをそのまま android.media.MediaPlayerandroid.media.AudioTrack へと繋いであげれば音声を再生することが出来ます。
バイナリデータの取得はEntityUtilsのtoByteArrayを利用します。最初res.getEntity()をそのまま利用しようとしたところ、音声が変になってはまりました…。

MediaPlayerを利用する場合は、Byte配列から直接再生することが出来ないので、一旦キャッシュにファイルとして書き込む必要があります。AudioTrackの場合はサンプリング周波数14400、16bitを指定することで再生可能です。

Androidがしゃべるアプリ「Speak」

https://play.google.com/store/apps/details?id=pistatium.appspot.com.speak
このAPIを使ってアプリ作ってみました。入れた文字をそのまま読み上げるだけのシンプルなアプリですが、音声合成のサンプルとして良かったら使ってみてください。